Commit Diff


commit - ccfca0aabb4388eed90e53cb4bad4798a81e6458
commit + 9e0ba934362a7537b7f206c419f40c138508d96b
blob - /dev/null
blob + 42ceb2ef3c9ea7e29c9faebd1d1949424320ed04 (mode 644)
--- /dev/null
+++ opml/opml.go
@@ -0,0 +1,43 @@
+// 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
@@ -0,0 +1,42 @@
+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
@@ -0,0 +1,152 @@
+<?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&amp;path=got.git" xmlUrl="https://got.omarpolo.com/?action=rss&amp;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