commit - 848b29c4c69a1837ec426676170747fd0d830885
commit + 8dfb72dda0321813659e4a002f69ac988a0143fd
blob - /dev/null
blob + 42ceb2ef3c9ea7e29c9faebd1d1949424320ed04 (mode 644)
--- /dev/null
+++ opml/opml.go
+// Package opml implements decoding of OPML documents described at [opml.org].
+// Only a subset of the format is implemented;
+// enough to support the use of OPML as an interchange format by
+// feed reader applications for web feed collections.
+//
+// [opml.org]: https://opml.org
+package opml
+
+import (
+ "encoding/xml"
+ "io"
+)
+
+type Document struct {
+ XMLName struct{} `xml:"opml"`
+ Version string `xml:"version,attr"`
+ Body []Outline `xml:"body>outline"`
+
+ // head holds the document's metadata.
+ // TODO(otl): should we even support this?
+ // NetNewWire generates an empty tree.
+ head struct{}
+}
+
+type Outline struct {
+ XMLName struct{} `xml:"outline"`
+ Text string `xml:"text,attr"`
+ Title string `xml:"title,attr"`
+ Description string `xml:"description,attr,omitempty"`
+ Type string `xml:"type,attr"`
+ Version string `xml:"version,attr,omitempty"`
+ HTML string `xml:"htmlUrl,attr"`
+ XML string `xml:"xmlUrl,attr"`
+ Children []Outline `xml:"outline,omitempty"`
+}
+
+func Decode(r io.Reader) (*Document, error) {
+ var doc Document
+ if err := xml.NewDecoder(r).Decode(&doc); err != nil {
+ return nil, err
+ }
+ return &doc, nil
+}
blob - /dev/null
blob + 09d1e40cc29f67221327a8158acec8ccbfaa1379 (mode 644)
--- /dev/null
+++ opml/opml_test.go
+package opml
+
+import (
+ "os"
+ "testing"
+)
+
+func TestDecode(t *testing.T) {
+ f, err := os.Open("otl.opml")
+ if err != nil {
+ t.Fatal(err)
+ }
+ doc, err := Decode(f)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // The tricky thing is decoding child elements recursively
+ // just using struct tags. So checking the number of elements
+ // is expected gives us some confidence we're reading
+ // the document correctly.
+ var counts = map[string]int{
+ "aggregators": 6,
+ "apple": 6,
+ "corp": 4,
+ "email": 4,
+ "Friends": 5,
+ "lang": 4,
+ "misc": 92,
+ "repos": 6,
+ }
+ for _, node := range doc.Body {
+ want, ok := counts[node.Title]
+ if !ok {
+ t.Errorf("unknown node title %s", node.Title)
+ continue
+ }
+ if len(node.Children) != want {
+ t.Errorf("%d child elements in %s, want %d", len(node.Children), node.Title, want)
+ }
+ }
+}
blob - /dev/null
blob + 1cc9855d4414da78d4b81e667f79ddc9db717ea6 (mode 644)
--- /dev/null
+++ opml/otl.opml
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- OPML generated by NetNewsWire -->
+<opml version="1.1">
+ <head>
+ <title>Subscriptions-iCloud.opml</title>
+ </head>
+<body>
+ <outline text="aggregators" title="aggregators">
+ <outline text="/r/Dualsport" title="/r/Dualsport" description="" type="rss" version="RSS" htmlUrl="https://old.reddit.com/r/Dualsport/" xmlUrl="https://old.reddit.com/r/Dualsport/.rss"/>
+ <outline text="cs_career_questions" title="cs_career_questions" description="" type="rss" version="RSS" htmlUrl="https://programming.dev/c/cs_career_questions" xmlUrl="https://programming.dev/feeds/c/cs_career_questions.xml?sort=Active"/>
+ <outline text="Hacker News" title="Hacker News" description="" type="rss" version="RSS" htmlUrl="https://news.ycombinator.com/" xmlUrl="https://hnrss.org/frontpage"/>
+ <outline text="LocalLlama" title="LocalLlama" description="" type="rss" version="RSS" htmlUrl="https://old.reddit.com/r/LocalLLaMA/" xmlUrl="https://old.reddit.com/r/LocalLLaMA/.rss"/>
+ <outline text="PieFed Meta" title="PieFed Meta" description="" type="rss" version="RSS" htmlUrl="https://piefed.social/c/piefed_meta/feed" xmlUrl="https://piefed.social/community/piefed_meta/feed"/>
+ <outline text="programming.dev - programming" title="programming.dev - programming" description="" type="rss" version="RSS" htmlUrl="https://programming.dev/c/programming" xmlUrl="https://programming.dev/feeds/c/programming.xml?sort=Active"/>
+ </outline>
+ <outline text="apple" title="apple">
+ <outline text="Apple Newsroom" title="Apple Newsroom" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://www.apple.com/newsroom/rss-feed.rss"/>
+ <outline text="Daring Fireball" title="Daring Fireball" description="" type="rss" version="RSS" htmlUrl="https://daringfireball.net/" xmlUrl="Https://daringfireball.net/feeds/json"/>
+ <outline text="David Smith, Independent iOS Developer" title="David Smith, Independent iOS Developer" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://david-smith.org/atom.xml"/>
+ <outline text="Hog Bay Software" title="Hog Bay Software" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://www.hogbaysoftware.com/feed/feed.xml"/>
+ <outline text="Panic Blog" title="Panic Blog" description="" type="rss" version="RSS" htmlUrl="https://blog.panic.com/" xmlUrl="https://panic.com/blog/feed/"/>
+ <outline text="WebKit" title="WebKit" description="" type="rss" version="RSS" htmlUrl="https://webkit.org/" xmlUrl="https://webkit.org/feed/"/>
+ </outline>
+ <outline text="corp" title="corp">
+ <outline text="Mistral AI" title="Mistral AI" description="" type="rss" version="RSS" htmlUrl="http:///news/" xmlUrl="https://mistral.ai/news/index.xml"/>
+ <outline text="Stripe Blog" title="Stripe Blog" description="" type="rss" version="RSS" htmlUrl="https://stripe.com/blog" xmlUrl="https://stripe.com/blog/feed.rss"/>
+ <outline text="Tailscale" title="Tailscale" description="" type="rss" version="RSS" htmlUrl="https://tailscale.com/blog/" xmlUrl="https://tailscale.com/blog/index.xml"/>
+ <outline text="Vultr News" title="Vultr News" description="" type="rss" version="RSS" htmlUrl="http://www.vultr.com/news/" xmlUrl="https://www.vultr.com/rss/"/>
+ </outline>
+ <outline text="email" title="email">
+ <outline text="Claws Mail new releases" title="Claws Mail new releases" description="" type="rss" version="RSS" htmlUrl="http://www.claws-mail.org/releases.php" xmlUrl="https://www.claws-mail.org/releases.rss"/>
+ <outline text="Fastmail" title="Fastmail" description="" type="rss" version="RSS" htmlUrl="https://www.fastmail.com/blog/" xmlUrl="https://www.fastmail.com/blog/feed.xml"/>
+ <outline text="MailMate" title="MailMate" description="" type="rss" version="RSS" htmlUrl="https://freron.com/" xmlUrl="https://blog.freron.com/feed.xml"/>
+ <outline text="Topicbox Blog" title="Topicbox Blog" description="" type="rss" version="RSS" htmlUrl="https://topicbox.blog/" xmlUrl="https://topicbox.blog/rss/"/>
+ </outline>
+ <outline text="Friends" title="Friends">
+ <outline text="Josh PixelStream" title="Josh PixelStream" description="" type="rss" version="RSS" htmlUrl="https://github.com/Rinzler1011/PixelStream/commits/main" xmlUrl="https://github.com/Rinzler1011/PixelStream/commits/main.atom"/>
+ <outline text="Marcello GitHub" title="Marcello GitHub" description="" type="rss" version="RSS" htmlUrl="https://github.com/tordenist" xmlUrl="https://github.com/tordenist.atom"/>
+ <outline text="Matt GitHub" title="Matt GitHub" description="" type="rss" version="RSS" htmlUrl="https://github.com/streatcodes" xmlUrl="https://github.com/streatcodes.atom"/>
+ <outline text="Silver Gopher - Andrew Phillips" title="Silver Gopher - Andrew Phillips" description="" type="rss" version="RSS" htmlUrl="https://andrewwphillips.github.io/" xmlUrl="https://andrewwphillips.github.io/feed.xml"/>
+ <outline text="Travis Github" title="Travis Github" description="" type="rss" version="RSS" htmlUrl="https://github.com/travgm" xmlUrl="https://github.com/travgm.atom"/>
+ </outline>
+ <outline text="lang" title="lang">
+ <outline text="Go" title="Go" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://blog.golang.org/feed.atom"/>
+ <outline text="Hare programming language" title="Hare programming language" description="" type="rss" version="RSS" htmlUrl="https://harelang.org/blog/" xmlUrl="https://harelang.org/blog/index.xml"/>
+ <outline text="Zig Devlog" title="Zig Devlog" description="" type="rss" version="RSS" htmlUrl="https://ziglang.org/devlog/" xmlUrl="https://ziglang.org/devlog/index.xml"/>
+ <outline text="Zig Programming Language" title="Zig Programming Language" description="" type="rss" version="RSS" htmlUrl="https://ziglang.org/news/" xmlUrl="https://ziglang.org/news/index.xml"/>
+ </outline>
+ <outline text="misc" title="misc">
+ <outline text="37signals Dev" title="37signals Dev" description="" type="rss" version="RSS" htmlUrl="https://dev.37signals.com/" xmlUrl="https://dev.37signals.com/feed/posts.xml"/>
+ <outline text="A Smart Bear" title="A Smart Bear" description="" type="rss" version="RSS" htmlUrl="https://longform.asmartbear.com/" xmlUrl="https://longform.asmartbear.com/index.xml"/>
+ <outline text="Ad blocking news" title="Ad blocking news" description="" type="rss" version="RSS" htmlUrl="https://pgl.yoyo.org/adservers/" xmlUrl="https://pgl.yoyo.org/as/rss/news.rss"/>
+ <outline text="Adam Langley" title="Adam Langley" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://www.imperialviolet.org/iv-rss.xml"/>
+ <outline text="And now it’s all this" title="And now it’s all this" description="" type="rss" version="RSS" htmlUrl="https://leancrew.com/all-this/" xmlUrl="https://leancrew.com/all-this/feed.json"/>
+ <outline text="Andrew R Kelley" title="Andrew R Kelley" description="" type="rss" version="RSS" htmlUrl="https://andrewkelley.me/" xmlUrl="https://andrewkelley.me/rss.xml"/>
+ <outline text="arp242.net" title="arp242.net" description="" type="rss" version="RSS" htmlUrl="https://www.arp242.net/" xmlUrl="https://www.arp242.net/feed.xml"/>
+ <outline text="Baldur Bjarnason" title="Baldur Bjarnason" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://www.baldurbjarnason.com/index.xml"/>
+ <outline text="Becky Hansmeyer" title="Becky Hansmeyer" description="" type="rss" version="RSS" htmlUrl="https://beckyhansmeyer.com/" xmlUrl="https://beckyhansmeyer.com/feed/"/>
+ <outline text="Ben Hoyt's technical writing" title="Ben Hoyt's technical writing" description="" type="rss" version="RSS" htmlUrl="https://benhoyt.com/writings/" xmlUrl="https://benhoyt.com/writings/rss.xml"/>
+ <outline text="Benjamin Higgins" title="Benjamin Higgins" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://brhiggins.com/atom.xml"/>
+ <outline text="Best Practical" title="Best Practical" description="" type="rss" version="RSS" htmlUrl="https://bestpractical.com/blog/" xmlUrl="https://bestpractical.com/blog?format=rss"/>
+ <outline text="bookoverflow" title="bookoverflow" description="" type="rss" version="RSS" htmlUrl="https://bookoverflow.io/" xmlUrl="https://anchor.fm/s/f5bbb69c/podcast/rss"/>
+ <outline text="btxx.org" title="btxx.org" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://btxx.org/index.atom"/>
+ <outline text="Cal Paterson" title="Cal Paterson" description="" type="rss" version="RSS" htmlUrl="https://calpaterson.com/calpaterson.rss" xmlUrl="https://calpaterson.com/calpaterson.rss"/>
+ <outline text="chewxy - Bigger on the Inside" title="chewxy - Bigger on the Inside" description="" type="rss" version="RSS" htmlUrl="https://blog.chewxy.com/" xmlUrl="https://blog.chewxy.com/index.xml"/>
+ <outline text="Chris James - Software developer" title="Chris James - Software developer" description="" type="rss" version="RSS" htmlUrl="https://quii.dev/" xmlUrl="https://quii.dev/rss"/>
+ <outline text="Coding Horror" title="Coding Horror" description="" type="rss" version="RSS" htmlUrl="https://blog.codinghorror.com/" xmlUrl="https://blog.codinghorror.com/rss/"/>
+ <outline text="command center" title="command center" description="" type="rss" version="RSS" htmlUrl="https://commandcenter.blogspot.com/" xmlUrl="https://commandcenter.blogspot.com/feeds/posts/default?alt=rss"/>
+ <outline text="computers are bad" title="computers are bad" description="" type="rss" version="RSS" htmlUrl="https://computer.rip/" xmlUrl="https://computer.rip/rss.xml"/>
+ <outline text="Couchsurfing Blog" title="Couchsurfing Blog" description="" type="rss" version="RSS" htmlUrl="https://blog.couchsurfing.com/" xmlUrl="https://blog.couchsurfing.com/feed/"/>
+ <outline text="csvbase blog" title="csvbase blog" description="" type="rss" version="RSS" htmlUrl="https://csvbase.com/blog/posts.rss" xmlUrl="https://csvbase.com/blog/posts.rss"/>
+ <outline text="Dan Luu" title="Dan Luu" description="" type="rss" version="RSS" htmlUrl="https://danluu.com/atom/index.xml" xmlUrl="https://danluu.com/atom.xml"/>
+ <outline text="Daniel Bowen" title="Daniel Bowen" description="" type="rss" version="RSS" htmlUrl="https://danielbowen.com/" xmlUrl="https://danielbowen.com/feed/"/>
+ <outline text="David Crawshaw" title="David Crawshaw" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://crawshaw.io/atom.xml"/>
+ <outline text="Deeplinks" title="Deeplinks" description="" type="rss" version="RSS" htmlUrl="https://www.eff.org/rss/updates.xml" xmlUrl="https://www.eff.org/rss/updates.xml"/>
+ <outline text="Destroy All Software Blog" title="Destroy All Software Blog" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://www.destroyallsoftware.com/blog/index.xml"/>
+ <outline text="dolphin-emu.org" title="dolphin-emu.org" description="" type="rss" version="RSS" htmlUrl="https://dolphin-emu.org/blog/" xmlUrl="https://dolphin-emu.org/blog/feeds/"/>
+ <outline text="Dominik Honnef" title="Dominik Honnef" description="" type="rss" version="RSS" htmlUrl="https://honnef.co/articles/" xmlUrl="https://honnef.co/articles/index.xml"/>
+ <outline text="Drew DeVault's blog" title="Drew DeVault's blog" description="" type="rss" version="RSS" htmlUrl="https://drewdevault.com/" xmlUrl="https://drewdevault.com/blog/index.xml"/>
+ <outline text="Ed Yong" title="Ed Yong" description="" type="rss" version="RSS" htmlUrl="https://buttondown.email/edyong209" xmlUrl="https://buttondown.email/edyong209/rss"/>
+ <outline text="Ed Zitron's Where's Your Ed At" title="Ed Zitron's Where's Your Ed At" description="" type="rss" version="RSS" htmlUrl="https://www.wheresyoured.at/" xmlUrl="https://www.wheresyoured.at/rss/"/>
+ <outline text="Egon Elbre" title="Egon Elbre" description="" type="rss" version="RSS" htmlUrl="https://egonelbre.com/" xmlUrl="https://egonelbre.com/index.xml"/>
+ <outline text="Entropic Thoughts" title="Entropic Thoughts" description="" type="rss" version="RSS" htmlUrl="https://entropicthoughts.com/" xmlUrl="https://two-wrongs.com/feed"/>
+ <outline text="flak" title="flak" description="" type="rss" version="RSS" htmlUrl="https://flak.tedunangst.com/" xmlUrl="https://flak.tedunangst.com/rss"/>
+ <outline text="Fly blog" title="Fly blog" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://fly.io/blog/feed.xml"/>
+ <outline text="furbo.org" title="furbo.org" description="" type="rss" version="RSS" htmlUrl="https://furbo.org/" xmlUrl="https://furbo.org/feed/json"/>
+ <outline text="Fyne" title="Fyne" description="" type="rss" version="RSS" htmlUrl="https://fyne.io/" xmlUrl="https://fyne.io/feed.xml"/>
+ <outline text="Gio" title="Gio" description="" type="rss" version="RSS" htmlUrl="https://gioui.org/news" xmlUrl="https://gioui.org/news/rss.xml"/>
+ <outline text="Gregory Szorc" title="Gregory Szorc" description="" type="rss" version="RSS" htmlUrl="http://gregoryszorc.com/blog" xmlUrl="https://gregoryszorc.com/blog/feed"/>
+ <outline text="IRCv3" title="IRCv3" description="" type="rss" version="RSS" htmlUrl="https://ircv3.net/" xmlUrl="https://ircv3.net/feed.xml"/>
+ <outline text="jacobian.org" title="jacobian.org" description="" type="rss" version="RSS" htmlUrl="https://jacobian.org/" xmlUrl="https://jacobian.org/index.xml"/>
+ <outline text="joshua stein" title="joshua stein" description="" type="rss" version="RSS" htmlUrl="https://jcs.org/" xmlUrl="https://jcs.org/rss"/>
+ <outline text="Journo Resources" title="Journo Resources" description="" type="rss" version="RSS" htmlUrl="https://www.journoresources.org.uk/" xmlUrl="https://www.journoresources.org.uk/feed/"/>
+ <outline text="Julia Evans" title="Julia Evans" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://jvns.ca/atom.xml"/>
+ <outline text="Kagi" title="Kagi" description="" type="rss" version="RSS" htmlUrl="https://blog.kagi.com/" xmlUrl="https://blog.kagi.com/rss.xml"/>
+ <outline text="Kanboard releases" title="Kanboard releases" description="" type="rss" version="RSS" htmlUrl="https://github.com/kanboard/kanboard/releases" xmlUrl="https://github.com/kanboard/kanboard/releases.atom"/>
+ <outline text="Libera Chat" title="Libera Chat" description="" type="rss" version="RSS" htmlUrl="https://libera.chat/" xmlUrl="https://libera.chat/atom.xml"/>
+ <outline text="Lickability Blog" title="Lickability Blog" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://lickability.com/blog/feed/"/>
+ <outline text="Ludicity" title="Ludicity" description="" type="rss" version="RSS" htmlUrl="https://ludic.mataroa.blog/" xmlUrl="https://ludic.mataroa.blog/rss/"/>
+ <outline text="Lunatech" title="Lunatech" description="" type="rss" version="RSS" htmlUrl="https://blog.lunatech.com/" xmlUrl="https://blog.lunatech.com/feed/"/>
+ <outline text="Macdrifter" title="Macdrifter" description="" type="rss" version="RSS" htmlUrl="https://www.macdrifter.com/" xmlUrl="http://www.macdrifter.com/feeds/all.atom.xml"/>
+ <outline text="macwright.com" title="macwright.com" description="" type="rss" version="RSS" htmlUrl="https://macwright.com/" xmlUrl="https://macwright.com/rss.xml"/>
+ <outline text="Marco.org" title="Marco.org" description="" type="rss" version="RSS" htmlUrl="https://marco.org/" xmlUrl="Https://Marco.org/rss"/>
+ <outline text="marginalia.nu" title="marginalia.nu" description="" type="rss" version="RSS" htmlUrl="https://www.marginalia.nu/log/" xmlUrl="https://www.marginalia.nu/log/index.xml"/>
+ <outline text="Mitchell Hashimoto" title="Mitchell Hashimoto" description="" type="rss" version="RSS" htmlUrl="https://mitchellh.com/writing" xmlUrl="https://mitchellh.com/feed.xml"/>
+ <outline text="Multi app" title="Multi app" description="" type="rss" version="RSS" htmlUrl="https://multi.app/blog" xmlUrl="https://updates.multi.app/rss/blog.xml"/>
+ <outline text="My land" title="My land" description="" type="rss" version="RSS" htmlUrl="https://blog.sgorava.xyz/" xmlUrl="https://blog.sgorava.xyz/index.xml"/>
+ <outline text="n-gate.com." title="n-gate.com." description="" type="rss" version="RSS" htmlUrl="http://n-gate.com/" xmlUrl="http://n-gate.com/feed.json"/>
+ <outline text="NetNewsWire" title="NetNewsWire" description="" type="rss" version="RSS" htmlUrl="https://nnw.ranchero.com/" xmlUrl="https://nnw.ranchero.com/feed.json"/>
+ <outline text="Nicolas Bouliane's blog" title="Nicolas Bouliane's blog" description="" type="rss" version="RSS" htmlUrl="https://nicolasbouliane.com/blog" xmlUrl="https://nicolasbouliane.com/blog/feed.rss"/>
+ <outline text="null program" title="null program" description="" type="rss" version="RSS" htmlUrl="https://nullprogram.com/" xmlUrl="https://nullprogram.com/feed/"/>
+ <outline text="Open Indie" title="Open Indie" description="" type="rss" version="RSS" htmlUrl="https://blog.erlend.sh/" xmlUrl="https://blog.erlend.sh/feed/"/>
+ <outline text="OpenBSD Journal" title="OpenBSD Journal" description="" type="rss" version="RSS" htmlUrl="http://undeadly.org/" xmlUrl="http://undeadly.org/cgi?action=rss"/>
+ <outline text="Paul Smith" title="Paul Smith" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://www.pauladamsmith.com/atom.xml"/>
+ <outline text="Pluralistic" title="Pluralistic" description="" type="rss" version="RSS" htmlUrl="https://pluralistic.net/" xmlUrl="https://pluralistic.net/feed/"/>
+ <outline text="poolp.org" title="poolp.org" description="" type="rss" version="RSS" htmlUrl="https://poolp.org/" xmlUrl="https://poolp.org/index.xml"/>
+ <outline text="Pushover" title="Pushover" description="" type="rss" version="RSS" htmlUrl="https://blog.pushover.net/" xmlUrl="https://blog.pushover.net/posts?format=rss"/>
+ <outline text="Ratfactor Feed" title="Ratfactor Feed" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://ratfactor.com/atom.xml"/>
+ <outline text="research!rsc" title="research!rsc" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://research.swtch.com/feed.atom"/>
+ <outline text="Rest of World" title="Rest of World" description="" type="rss" version="RSS" htmlUrl="https://restofworld.org/" xmlUrl="https://restofworld.org/feed/latest/"/>
+ <outline text="Riccardo Mori" title="Riccardo Mori" description="" type="rss" version="RSS" htmlUrl="http://morrick.me/" xmlUrl="http://morrick.me/feed/json"/>
+ <outline text="rob pike" title="rob pike" description="" type="rss" version="RSS" htmlUrl="https://hachyderm.io/@robpike" xmlUrl="https://hachyderm.io/@robpike.rss"/>
+ <outline text="Signal Blog" title="Signal Blog" description="" type="rss" version="RSS" htmlUrl="https://signal.org/blog/" xmlUrl="https://signal.org/blog/rss.xml"/>
+ <outline text="Signal v. Noise" title="Signal v. Noise" description="" type="rss" version="RSS" htmlUrl="https://m.signalvnoise.com/" xmlUrl="https://m.signalvnoise.com/feed/"/>
+ <outline text="Solene'%" title="Solene'%" description="" type="rss" version="RSS" htmlUrl="https://dataswamp.org/~solene/" xmlUrl="https://dataswamp.org/~solene/rss.xml"/>
+ <outline text="Sourcehut" title="Sourcehut" description="" type="rss" version="RSS" htmlUrl="https://sourcehut.org/blog/" xmlUrl="https://sourcehut.org/blog/index.xml"/>
+ <outline text="srcbeat" title="srcbeat" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://www.srcbeat.com/index.xml"/>
+ <outline text="suckless.org news" title="suckless.org news" description="" type="rss" version="RSS" htmlUrl="https://www.suckless.org/" xmlUrl="http://suckless.org/atom.xml"/>
+ <outline text="Tech Reflect" title="Tech Reflect" description="" type="rss" version="RSS" htmlUrl="https://techreflect.net/" xmlUrl="https://techreflect.net/feed/"/>
+ <outline text="Test Double" title="Test Double" description="" type="rss" version="RSS" htmlUrl="https://testdouble.com/" xmlUrl="https://blog.testdouble.com/index.xml"/>
+ <outline text="That grumpy BSD guy" title="That grumpy BSD guy" description="" type="rss" version="RSS" htmlUrl="https://bsdly.blogspot.com/" xmlUrl="https://bsdly.blogspot.com/feeds/posts/default?alt=rss"/>
+ <outline text="The Shape of Everything" title="The Shape of Everything" description="" type="rss" version="RSS" htmlUrl="https://shapeof.com/" xmlUrl="https://shapeof.com/feed.json"/>
+ <outline text="Things Blog" title="Things Blog" description="" type="rss" version="RSS" htmlUrl="https://culturedcode.com/things/blog/" xmlUrl="https://culturedcode.com/things/blog/feed/rss.xml"/>
+ <outline text="tinyapps.org" title="tinyapps.org" description="" type="rss" version="RSS" htmlUrl="https://tinyapps.org/blog" xmlUrl="https://tinyapps.org/blog/index.rss"/>
+ <outline text="Tonsky" title="Tonsky" description="" type="rss" version="RSS" htmlUrl="https://tonsky.me/" xmlUrl="https://tonsky.me/atom.xml"/>
+ <outline text="Unsharpen" title="Unsharpen" description="" type="rss" version="RSS" htmlUrl="https://unsharpen.com/" xmlUrl="https://unsharpen.com/feed/"/>
+ <outline text="" title="" description="" type="rss" version="RSS" htmlUrl="https://travgm.org/" xmlUrl="https://travgm.org/feed/rss"/>
+ <outline text="Vector" title="Vector" description="" type="rss" version="RSS" htmlUrl="https://vector.dev/blog/" xmlUrl="https://vector.dev/blog/index.xml"/>
+ <outline text="Write The Docs" title="Write The Docs" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://www.writethedocs.org/blog/archive/atom.xml"/>
+ <outline text="Writing - rachelbythebay" title="Writing - rachelbythebay" description="" type="rss" version="RSS" htmlUrl="https://rachelbythebay.com/w/" xmlUrl="Https://rachelbythebay.com/w/atom.xml"/>
+ <outline text="xkcd.com" title="xkcd.com" description="" type="rss" version="RSS" htmlUrl="https://xkcd.com/" xmlUrl="https://xkcd.com/atom.xml"/>
+ </outline>
+ <outline text="repos" title="repos">
+ <outline text="9front" title="9front" description="" type="rss" version="RSS" htmlUrl="" xmlUrl="https://git.9front.org/plan9front/plan9front/HEAD/feed.rss"/>
+ <outline text="got" title="got" description="" type="rss" version="RSS" htmlUrl="https://got.omarpolo.com/?action=summary&path=got.git" xmlUrl="https://got.omarpolo.com/?action=rss&path=got.git"/>
+ <outline text="Litestream releases" title="Litestream releases" description="" type="rss" version="RSS" htmlUrl="https://github.com/benbjohnson/litestream/releases" xmlUrl="https://github.com/benbjohnson/litestream/releases.atom"/>
+ <outline text="plan9port" title="plan9port" description="" type="rss" version="RSS" htmlUrl="https://github.com/9fans/plan9port/commits/master" xmlUrl="https://github.com/9fans/plan9port/commits.atom"/>
+ <outline text="syncthing releases" title="syncthing releases" description="" type="rss" version="RSS" htmlUrl="https://github.com/syncthing/syncthing/releases" xmlUrl="https://github.com/syncthing/syncthing/releases.atom"/>
+ <outline text="Upspin" title="Upspin" description="" type="rss" version="RSS" htmlUrl="https://github.com/upspin/upspin/commits/master" xmlUrl="https://github.com/upspin/upspin/commits/master.atom"/>
+ </outline>
+ </body>
+</opml>
\ No newline at end of file