I've been meaning to do this for probably four years. Every so often I'd open a browser tab, type "self-host RSS reader," get overwhelmed by the Docker compose file, and close the tab again. Last weekend I finally sat down and did it properly, so this is that post.
Quick backstory for anyone who wasn't reading this blog in 2013 (hi, both of you): I was a die-hard Google Reader user until Google killed it, and I never really forgave the company for it. I bounced between Feedly, Inoreader, and a paid NewsBlur account for years afterward, always half-satisfied. Feedly's free tier got stingier every year, and Inoreader's UI has never once made sense to me — I click something and I genuinely don't know what just happened. So this spring, with my Synology sitting there mostly idle except for backups, I decided it was finally time to just run my own.
I went with FreshRSS. Not because it's the flashiest option (Miniflux has a nicer minimalist look, and I know people who swear by Tiny Tiny RSS) but because the Docker setup took me about twenty minutes and the documentation didn't assume I already knew what I was doing, which is rare.
What I actually did
If you want to replicate this, here's the short version:
- Docker compose, one container for FreshRSS, one for a MariaDB backend instead of the default SQLite — I've been burned by SQLite corruption before on a different self-hosted project and wasn't taking chances.
- Reverse proxied it through Caddy with a subdomain I already had pointed at the NAS, so I got HTTPS for free without touching a certbot config.
- Imported my old OPML export from Inoreader (still had it sitting in a folder called "misc" from 2019, naturally).
- Installed the FreshRSS mobile app on my phone instead of using a third-party client, mostly out of laziness, though I might switch to Fluent Reader Lite later since the official app's swipe gestures feel about eight years behind everything else on iOS.
The whole thing took an evening, including the twenty minutes I lost because I forgot to open port 443 on the router and just sat there refreshing a blank page like an idiot.
The part nobody tells you
Here's the thing that actually surprised me: the migration itself was easy. The hard part was realizing how many of my old feeds were just dead. Out of 140-something subscriptions, I'd guess close to 30 hadn't posted anything in over a year. A few were blogs I used to read religiously that just stopped one day with no announcement, which is its own small, quiet kind of sad. One was a WordPress install that now resolves to a Japanese gambling site. RIP to whoever used to run that.
I also finally admitted to myself that I don't need six different tech news aggregator feeds pulling in the same three stories with different headlines. I cut those down to two. My unread count dropped from a genuinely embarrassing four-digit number to something I can plausibly clear every day, which honestly changed how I read the internet more than the self-hosting part did.
One complaint, because I always have one: FreshRSS's extensions system is powerful but the discovery for it is bad. I wanted a "read later" hook into a note-taking app and had to dig through a GitHub wiki and two forum threads from 2022 to find the right extension, which turned out to be one line of JavaScript pasted into a text box with zero documentation on what half the config options meant. It worked, eventually, through trial and error rather than understanding.
If you're on the fence about self-hosting an RSS reader in 2026: do it. Not because RSS is having some big comeback moment (it isn't, not really, though I'd argue it never should've gone away) but because owning your reading list, on your own hardware, with no algorithm quietly deciding what you see, is just a nicer way to use the internet. It's slower. That's the point.
Next up I want to wire FreshRSS into a little script that dumps starred articles into a private note somewhere, so I stop losing good links in the void. If I get it working without losing a weekend to it, I'll write that one up too.