The past few years, I have been reading RSS feeds in the Reeder app1 on my iPhone and Feedbin on the web and as a backend for Reeder.

Feedbin is a great RSS reader, but honestly I’m mostly using it as a backend store, and while paying $5 a month really isn’t much, I still kind of got curious about exploring altenatives. I mean, it should be a simple thing and I have this nice DigitalOcean server and all that I could host stuff on, right. Also I sometimes fantasize about maybe some day writing my own feed reader app. There have been a couple of false starts on that before. Self-hosting feels like a fun step in the right direction.

After browsing around a bit, Miniflux caught my eye. The minimalism speaks to me, the navigation and UI makes perfect sense and the set a features it does include – like embedded the full web page for sites that do not include full text in the feed, and doing various transforms – seems spot on. And as I understand, it could also be used as a backend for Reeder using the Google Reader API.

I tried it out locally on my macOS using docker compose, imported some OPML from Feedbin, and… I absolutely love it. Let’s get this running on


Looking at the requirements page, I should be all set. I run PostgreSQL 14.9 and, while that should be updated, it’s more than enough. I set up the database according to the instructions. I was a little bit confused about this HSTORE extension, but if I understand correctly, just running the ‘create extension hstore’ command as a postgres superuser should do the job. (It did.)

Installing the application

I debated a short while with myself whether I should run it under Docker. I have been thinking that this could be a nice approach to manage things as I add more software running on this machine. (Just plain Docker though, I have no interest right now in setting up a Kubernetes cluster or anything like that.) But it’s also fun to do some good old Linux administration. I used Debian and later Ubuntu for many years on my personal computer before I switched to macOS. Installing stuff with apt gives me a nice nostalgic feeling. So let’s continue with that and follow the Debian installation instructions.

Installing it went smoothly. I was a confused for a while about the instructions to run things like miniflux -migrate and miniflux -createadmin. It just kept sayying that it could not connect to the database, and that the default values for DATABASE_URL was used.

$ miniflux -migrate
level=INFO msg="The default value for DATABASE_URL is used"
pq: password authentication failed for user "postgres"

But I had set the DATABASE_URL in the file /etc/miniflux.conf, just as instructed! Why didn’t it pick it up?

After a while, I realized what was going on. The file /etc/miniflux.conf file is what systemd uses to set environment variables for the miniflux service it manages. It’s set up like this. Just running miniflux on its own doesn’t apply that configuration. But it does happen to have a way to read the same configuration file format as a systemd EnvironmentFile, by specifying it using miniflux -c /etc/miniflux.conf. That documentation could perhaps be improved.

Anyway, now it’s running and I can curl localhost:8080 to get the front page of miniflux from my host computer!

Connecting through a tunnel

Now, I need to expose this to the Internet so I can connect to it. Before I do that though, I’d like to play a little bit more, really make sure things are working and set up my account a bit and so on. I start a tunnel with from my Macbook:

$ ssh -NL 1234:localhost:8080

And then I can open any old browser on my machine and connect to localhost:1234, and there I have the miniflux UI. Very cool.

Exposing to the Internet

Last time I set up a site on this server, I went through the work of setting up a wildcard certificate. That’s nice, saves me some time! So now I just need to add another nginx site set up with a reverse proxy, similarly to how I did with my habit tracker.

Now I have my self-hosted Miniflux at (sorry, you can’t play) and can log in with my account and import all the subscriptions from Feedbin with an OPML export.

The crucial final test was, of course, whether I could now use this as the backed for Reeder. And, yup, a few more clicks to expose a Google Reader API and it was good to go.

Feedbin was classy ‘til the end, by the way. The offboarding experience was a super simple few clicks to close down the account, and then it sent me an e-mail with the final export of subscriptions. Kudos.

  1. I’m still on Reeder 4 though, I think.