My main source for tech news has been RSS for a long time. I started out with Google Reader and switched over to feedly once Google Reader shut down. For a couple of years now, I have been using third party RSS readers (Fiery Feeds on iOS and Reeder on macOS). I’ve been quite happy with this setup but there is one thing that has been bothering me for a while: Feedly would mark all articles that were older than 30 days as read automatically. I would often keep longer articles around to read later only to discover that they had disappeared. So I set out to look for alternatives. After a while I found Miniflux, a self hosted RSS reader that supports the Fever API which is supported in a lot of native readers (like the ones I use). Miniflux is written in Go and gets shipped as a single binary which makes it quite easy to host it.

Now there was just one question left to answer: Where should I host it? I considered using cheap hoster like Scaleway but decided that I’d like to try hosting this at home by myself. Like so many others I still had a raspberry pi lying around in a drawer that I had no use for. So I got it connected to my local network, installed postgres and exposed Miniflux on it using the NGINX reverse proxy configuration that is available in the Miniflux documentation.

The app was running perfectly fine both in the browser and through the API but now I didn’t only want to sync my feeds when I was at home. Luckily, my home router - a FritzBox comes with an integrated DynDNS service. It also comes with a build in firewall that blocks access from the outside while still being configurable through the web interface. So I logged into the web interface, added and exception to the firewall for port 443 on the raspberry pi and set up DynDNS. The Fritzbox then gave me a <id> domain that would always point to my public IPV4 address. This was a good first step but I wanted to have a URL that I could actually remember and more importantly an SSL certificate. In order to achieve this, I created a C-NAME record in my private domain’s DNS configuration to point my chosen subdomain to the domain provided by the FritzBox.

With this set up, when I try to resolve <subdomain> now, it will C-NAME resolve to <id> which will A resolve to my public IPV4 address. I then SSHed into my raspbery pi and got a letsencrypt certificate for the new subdomain using regular HTTP validation.

All in all, this took no more than an afternoon and I am very happy with the setup. I tweaked the Miniflux settings so that all of my feeds get updated every hour and I don’t miss anything from the Feedly days. Plus I also get to read old articles again now.

The takeaway from this is that self-hosting - even at home - does not have to be difficult and I think we should all be doing much more of it!

Did I miss something or do you have questions? Let me know on twitter.