An interesting pattern I've developed on my site — one I haven't seen elsewhere? — is making your website also your feed reader.

Let me introduce you to my /feed/.

The main reason I went this route instead of, say, installing Miniflux: I didn't want another service to manage.

But as I kept going, I discovered a lot of other advantages — the most obvious being that it's public.

If you browse it, it's a sort of "blogroll," but more alive: it's not just a list of names. You can really see who the people I follow are and what they write about. It makes it easy to guess what I'm interested in, sure, but it also makes it much easier to stumble upon an article and start following someone new.

If I browse it (with a secret token in the URL), the page is the same, but every time I click on an article, it disappears. I can also mark an article as read without opening it, or all articles from a particular source. I don't need any other features from a feed reader, but if I ever did, they'd be simple to add.

It's organized by most recent posts, but then groups all the older posts from the same source below in a more compact mode. I find this very useful: not having posts scattered everywhere helps me see more clearly the character and personality of each site I visit, lets me give less weight to feeds that generate more content — they're not necessarily the most interesting — and lets me surface old posts I haven't read yet.

Technically, it's a couple of client-side Preact components and two Astro endpoints (one to fetch feeds, one to track what I've read). Data lives on Cloudflare Workers KV, and authentication is just a secret token I append to the URL. No cronjobs: when you visit, you get the latest cached feeds immediately while fresh data downloads in the background for next time. Everything runs on Cloudflare's free plan — not a dime.

Simple, personal, and better than a blogroll. What more could you ask for?

All the code is on GitHub. If this turns out to be interesting to others, I might find a way to package it up!