In the year 2026, I decided I wanted to self-host an RSS reader. After setup, I am running miniflux in Docker on a Synology NAS configured to expose a Google Reader API so I can use NetNewsWire as the client on iOS and macOS. Here’s how I got that working.
Motivation
My news reading method was incredibly haphazard. I flitted betweeen big news sites, apps like Apple News, various subreddits and blogs. I forgot which sites I visited. I lost track of interesting articles I came across. I was disorganized.
Also, like every tech-savvy person of a particular age, I really missed Google Reader. I had dozens of RSS feeds I read daily and I missed that. I’ve tried various RSS readers over the years and none of them stuck.
But, on its 23rd birthday, I downloaded NetNewsWire and instantly loved the macOS-familiar UI.
But, when exploring what RSS syncing service to use, none of the options fit what I wanted. I wouldn’t have enough feeds to justify using one of the paid services, and the iCloud option, while being the right price (read: free), is slow. So, I dug into self-hosting, which NetNewsWire supports as long as the service exposes a Google Reader-compatible API.
The option that floated to the top was miniflux. Miniflux is, in its own words, “a minimalist and opinionated feed reader.” Perfect. It does have a very usable web UI but I planned to use it primarily via the NetNewsWire apps.
I uncovered a couple of gotchas so wanted to write them here in case anyone else wants to glue these pieces together and host their own RSS reader.
Install miniflux
First, I created a new directory on the NAS itself.
mkdir -p /[your volume here]/docker/miniflux
Inside that directory, I created 1 file and 2 more directories.
The 2 directories were: data/postgres and var/lib/postgresql/data.
The docker-compose file, titled docker-compose.yml follows. Note: there are placeholder passwords and URLs in there which may be worth changing.
version: '3.8'
services:
miniflux-db:
image: postgres:15-alpine
container_name: miniflux-db
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=changeme_strong_password
- POSTGRES_DB=miniflux
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: unless-stopped
miniflux:
image: miniflux/miniflux:latest
container_name: miniflux
ports:
- "8080:8080"
depends_on:
- miniflux-db
environment:
- DATABASE_URL=postgres://miniflux:changeme_strong_password@miniflux-db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=changeme_admin_password
- BASE_URL=http://your-nas-ip:8080
restart: unless-stopped
Now that you have the docker-compose file and the required directories created, run: sudo docker-compose up -d to build the containers and start them.
When this is complete, you should have a running miniflux reader listening on port 8080. You will now need to login to configure the service.
Configure miniflux
Once logged in, you will need to configure miniflux to turn on its Google Reader API, which is not on by default. Under Settings -> Integrations, you will see ‘Google Reader’. Under this section, you will need to create a new username and password (I just used the same one as the service login). Hit update and you’re done.
Configure NetNewsWire
In NetNewsWire, you will want to add a new account. In the settings, under accounts, you will see ‘self-hosting’ with FreshRSS. (NetNewsWire should probably just call this option “Google Reader API-compatible service” or something, because that’s what it is.)
Select FreshRSS and then enter in the Google Reader integration username/password you just created and enter in the URL that miniflux gave you. It should just be the base URL of the miniflux service with no trailing slash.
If all went well, you should be in business.
Some new install gotchas
I am not sure why but I needed to go to the ‘Feeds’ section in miniflux and hit ‘refresh all feeds in the background’ to get them to start polling automatically. I think this was related to the OPML import. I bet that adding a feed automatically queues up the first polling job, but an OPML import doesn’t. This fixes whatever problem that is.
Also, I was moving my OPML from an existing RSS reader to this one. I wasn’t able to do it from the NetNewsWire interface but importing via the miniflux import feature worked fine.
Conclusion
After following the steps above, I now have a hosted RSS reader running on my NAS and some slick native clients that stay in sync. Success.