How to Self-Host an RSS Reader with Miniflux
Why this matters
Cloud RSS readers come and go — and when they go, your carefully curated list of feeds goes with them. A self-hosted reader keeps your subscriptions on your hardware, with no one deciding what to recommend or what to shut down.
Miniflux is the pragmatic choice: it’s fast, minimal, and has first-class keyboard shortcuts.
What I tested on
- OS: Debian 13 (trixie)
- Miniflux: 2.2.x
- Database: PostgreSQL 16
- Hardware: 1 GB RAM VPS (yes, really)
- Duration: daily driver for 8 months
⚠️ Don’t expose Miniflux directly on the internet without HTTPS and a strong password. Your reading list can reveal a lot about you.
How I tested
I imported ~150 feeds from an OPML export, read articles daily for a month, and measured how long a full refresh took. I also tested the keyboard-only workflow, which is where Miniflux stands out.
Step 1: Install PostgreSQL
sudo apt install -y postgresql
sudo -u postgres createuser miniflux
sudo -u postgres createdb miniflux -O miniflux
sudo -u postgres psql -c "ALTER USER miniflux WITH PASSWORD 'use-a-real-password';"
Step 2: Install Miniflux
wget https://github.com/miniflux/v2/releases/download/2.2.0/miniflux-linux-amd64
sudo mv miniflux-linux-amd64 /usr/local/bin/miniflux
sudo chmod +x /usr/local/bin/miniflux
Create a config file:
# /etc/miniflux.conf
DATABASE_URL="postgres://miniflux:use-a-real-password@localhost/miniflux?sslmode=disable"
RUN_MIGRATIONS=1
BASE_URL="https://rss.example.com"
ADMIN_USERNAME=admin
ADMIN_PASSWORD="another-real-password"
Run it:
miniflux -config-file /etc/miniflux.conf
Step 3: systemd service
# /etc/systemd/system/miniflux.service
[Unit]
Description=Miniflux RSS reader
After=network.target postgresql.service
[Service]
Type=simple
ExecStart=/usr/local/bin/miniflux -config-file /etc/miniflux.conf
User=miniflux
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now miniflux
Step 4: Reverse proxy
rss.example.com {
reverse_proxy localhost:8080
}
Miniflux listens on 8080 by default. Put it behind Caddy (or Nginx) for HTTPS.
Step 5: Import feeds and learn the shortcuts
Settings → Import → upload an OPML file from your old reader. Then learn the shortcuts:
| Key | Action |
|---|---|
j / k | Next / previous entry |
v | Open original |
m | Toggle read |
s | Star / bookmark |
r | Refresh feeds |
The whole point of Miniflux is that you never touch the mouse.
Clients, the Fever API, and why it still works
Miniflux ships a decent web UI, and the reason I still use it after two years is not the UI — it is that it speaks the Fever API, so the clients I already liked keep working.
Enable it in settings with a separate password, then point any Fever-compatible client at https://your-domain/fever/. I use Reeder on macOS and iOS; ReadKit and Fiery Feeds both work. The web UI stays available for triage on a laptop, and the phone app handles the commute.
Two limits to know before you plan around it:
- No push. Clients poll. On a phone that means a refresh interval, not instant delivery, which is fine for feeds and wrong if you wanted notifications.
- Read state is the shared contract. Mark something read in the client and it is read everywhere, which sounds obvious and is the thing most self-hosted readers get wrong.
The alternative is switching to a client-server stack like FreshRSS or a hosted service. If your reason for self-hosting is privacy, Miniflux plus Fever is the smallest amount of software that does the job — the whole thing is one Go binary and a PostgreSQL database, which is also why it stays up. I watch it with the same stack described in the Prometheus and Grafana guide.
Feed hygiene: 200 feeds without noise
The failure mode of RSS is not technical, it is volume. At 200 feeds, an unread count becomes a source of guilt and then a reason to stop opening the app.
What worked, in order of effect:
Kill the firehose. Sites that publish 30 posts a day are not worth a slot. If you only read one in twenty, subscribe to their weekly digest instead, or use the “fetch only” scrape rule in Miniflux to pull a single section of the page.
Group by how you read, not by topic. Three categories — must read, skim, and long-form — beat fourteen topic folders, because you act on the first list and ignore the rest.
Set retention and let it expire. Miniflux can purge read entries after a number of days. Deleting old unread items is harder emotionally and completely fine in practice: if it mattered, it will come back.
Use the keyboard. j/k to move, m to toggle read, v to open the original. The web UI is fast precisely because it does not try to be a feed reader with animations.
One infrastructure note: feeds fail silently when a site starts blocking your server’s user agent, and you will not notice until the folder looks suspiciously quiet. A dead-feed check in your monitoring is worth the ten minutes.
One infrastructure note: it sits behind the same proxy as everything else, and the TLS renewal behaviour described in the Caddy walkthrough is what keeps the phone client working without certificate warnings.
Pros and cons
Pros:
- Extremely fast and lightweight (fits in 50 MB RAM)
- Clean, readable interface
- Excellent keyboard navigation
- Fever API support (works with Reeder and other mobile apps)
- Your data stays on your server
Cons:
- Minimal by design — no fancy social features, no recommendations
- Setup is manual (no GUI installer)
- Single-user focused; multi-user support is basic
Best for / Skip if
Best for: RSS power users who want speed, privacy, and keyboard control.
Skip if: you want discovery features or a social reading experience. This is a reader, not a community.
Alternatives
- FreshRSS — PHP-based, very popular, slightly more features
- Tiny Tiny RSS — older, still maintained, heavier
- NewsBlur — hosted option with a free tier
Verdict
Miniflux is the right answer if you want RSS without the cloud and without the bloat. It’s fast, it respects your attention, and it stays out of your way — which is exactly what a reader should do. I switched and never looked back.
References
- Miniflux documentation — configuration options and features
- Miniflux installation guide — Docker and Postgres setup used here
FAQ
How much RAM does it need?
Very little. I run it on a 1 GB VPS with headroom to spare.
Can I read on my phone?
Yes — enable the Fever API in settings and point a mobile client (Reeder, ReadKit) at it.
How often are feeds fetched?
Configurable per feed. Default is every hour; heavy users can set it lower.
Can I migrate from another reader?
Yes, via OPML export/import. Most readers support this.