RSS isn’t dead — it’s the part of the open web that the algorithm-driven feeds couldn’t kill. The trade is that you have to host the reader yourself if you want the experience to be good. Two reasonable self-hosted options in 2026: FreshRSS and Miniflux. Both run fine on a $5/month VPS, both have decent mobile clients via the Fever or Google-Reader-compatible APIs, both are under active development.
I’ve run both. Here’s the honest comparison, the install I actually use, and how to get articles onto your phone in a form you can read on a plane.
FreshRSS vs Miniflux at a glance
- FreshRSS: PHP. More features in the web UI — folders, tags, sharing, favorites, per-feed filters, even a built-in OPML import/export. Heavier; needs PHP-FPM + a database (SQLite, MariaDB, or Postgres). The UI is functional but feels a bit 2018.
- Miniflux: Single Go binary. Tiny memory footprint (40 MB resident). Postgres only — no SQLite option. The web UI is intentionally spartan, more like a reading app than a feed manager. Built-in scraping rules to clean up partial feeds. Faster, simpler, less feature-y.
If you want maximum power-user knobs in the web UI, FreshRSS. If you mostly read on a phone client and want the server to disappear, Miniflux. After a year on each I settled on Miniflux because the server resource curve is so much flatter — it just runs, doesn’t grow logs aggressively, doesn’t crash a tiny VPS when you import 800 feeds.
The Miniflux install I actually use
On a $5 Hetzner / DO / Vultr VPS with Docker installed:
# /opt/miniflux/docker-compose.yml
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: miniflux
POSTGRES_PASSWORD: change-me-strong
POSTGRES_DB: miniflux
volumes:
- ./pgdata:/var/lib/postgresql/data
restart: unless-stopped
miniflux:
image: miniflux/miniflux:latest
depends_on:
- db
ports:
- "127.0.0.1:8080:8080"
environment:
DATABASE_URL: postgres://miniflux:change-me-strong@db/miniflux?sslmode=disable
RUN_MIGRATIONS: "1"
CREATE_ADMIN: "1"
ADMIN_USERNAME: you
ADMIN_PASSWORD: also-change-me
BASE_URL: https://reader.example.com/
restart: unless-stoppedBring it up, then put a real reverse proxy in front (Caddy or nginx) terminating TLS via Let’s Encrypt. Caddy makes this two lines:
# /etc/caddy/Caddyfile
reader.example.com {
reverse_proxy 127.0.0.1:8080
}That’s the whole server. Visit your domain, log in, paste OPML or feed URLs, you’re reading.
Getting feeds onto your phone
The web UI on phone is OK but not great. The actual win is using a native client that talks to your Miniflux/FreshRSS over the Fever or Google-Reader-compatible API. Both servers expose both APIs.
- iOS — Reeder 5 / Reeder. Best-in-class. Add account, Fever, paste your server URL, username, the API token (Settings → Integrations → API Token in Miniflux). Sync is fast, marks-read are bidirectional, the reading view is gorgeous.
- iOS — Unread. Lighter, simpler, also supports Fever. Worth trying if Reeder feels too heavy.
- Android — FeedMe. The most polished Android client. Fever-compatible. Aggressive offline-caching support.
- Android — ReadYou. Open-source, Material You design, increasingly capable.
The offline-on-a-plane workflow
The reason most people abandon RSS on mobile is that they hit “open article” and the client can’t render an embedded paywall, or the feed only had a one-paragraph summary, or there’s no Wi-Fi to pull the full article anyway. Both servers have a fix:
- Miniflux: per-feed scraper rules. For a feed that only ships excerpts, edit the feed → “Original Content” → enable Fetch Original Content. Miniflux now hits the article URL on its end, runs Mozilla’s Readability extractor, and stores the cleaned full text in the database. Your client downloads the full article during sync — no fetch when you’re offline.
- FreshRSS: extension Filtres et actions + Mercury Fulltext. Same idea: server fetches, cleans, caches the article body so it’s there when the client syncs.
Combine that with a client that pre-caches images on sync (Reeder does this; turn on “Download images” in account settings), and you get the magic experience: open the app on a plane with airplane mode on, every article in your feed list is fully readable, images included.
Migrating in (and out)
Both servers import and export OPML. Whatever you’re using now (Feedly, Inoreader, NetNewsWire’s iCloud sync, an old Google Reader OPML you never deleted), export to OPML, drop it in the new server’s import dialog, done. Folders and feed groupings come with it.
Same applies if you ever want to leave the self-hosted setup. OPML out, paste into the next thing. Your reading list is a portable file, not a SaaS account.
Resource costs in practice
- Miniflux + Postgres on a 1-vCPU / 1 GB VPS, ~400 feeds, polling every 60 minutes: ~120 MB RAM in use, <1% CPU averaged. Disk grows ~50 MB/month with full-content fetched.
- FreshRSS + MariaDB on the same box, same feeds: ~250 MB RAM, similar CPU. Disk grows faster because of more aggressive history retention by default — set Maximum number of articles to keep per feed to 500 and it stabilizes.
Either fits comfortably alongside other small services on the same box. If your VPS already runs your Caddy / reverse proxy / a couple of toy apps, RSS is essentially free to add.
The end-state I wish I’d reached two years sooner: a tiny VPS quietly polling a few hundred feeds, a phone app that knows about it, and a thirty-second sync at the start of any commute that gives me hours of reading without a single corporate algorithm choosing what I see.
Photo: Newspaper, coffee and phone flat lay by Fotios Photos on Pexels.
