How to Self-Host Miniflux: Minimalist RSS Reader for Developers 2026
TL;DR
Miniflux is an opinionated, minimalist RSS reader — AGPL 3.0, ~6K GitHub stars, written in Go with PostgreSQL. It's fast, keyboard-driven, and API-first. No JavaScript framework bloat, no dark patterns, no tracking. Self-host on any $6/month VPS alongside other services — it uses ~20MB RAM idle. If you're a developer who wants a reliable, low-maintenance feed reader that respects your attention: Miniflux is the answer.
Key Takeaways
- Miniflux: AGPL 3.0, ~6K stars, Go + PostgreSQL — minimal and fast
- API-first: Full REST API + Fever API (compatible with mobile apps like Reeder, NetNewsWire)
- Keyboard shortcuts: Navigate feeds entirely from keyboard (vim-style:
j/kfor items) - No JavaScript bloat: Server-rendered HTML, loads in ~50ms
- Mobile: iOS/Android apps via Fever API compatibility
- Resource usage: ~20MB RAM, any VPS works
Miniflux vs Other RSS Readers
| Reader | License | Language | Storage | Self-host | Mobile |
|---|---|---|---|---|---|
| Miniflux | AGPL 3.0 | Go | PostgreSQL | ✅ | Via Fever API |
| FreshRSS | AGPL 3.0 | PHP | MySQL/PG/SQLite | ✅ | Via API |
| Tiny Tiny RSS | GPL 3.0 | PHP | MySQL/PG | ✅ | Official app |
| Selfoss | MIT | PHP | MySQL/SQLite | ✅ | Mobile web |
| NewsBlur | MIT | Python | MongoDB | ✅ | Native apps |
Miniflux vs FreshRSS: FreshRSS has a richer UI and more features; Miniflux is faster, simpler, and more opinionated. If you want configuration options and a feature-rich UI: FreshRSS. If you want "it just works, fast, forever": Miniflux.
Part 1: Docker Compose Setup
# docker-compose.yml
version: '3.8'
services:
miniflux:
image: miniflux/miniflux:latest
container_name: miniflux
restart: unless-stopped
ports:
- "8080:8080"
environment:
DATABASE_URL: postgres://miniflux:${POSTGRES_PASSWORD}@db/miniflux?sslmode=disable
RUN_MIGRATIONS: "1" # Auto-run migrations on startup
CREATE_ADMIN: "1" # Create admin user on first run
ADMIN_USERNAME: admin
ADMIN_PASSWORD: "${ADMIN_PASSWORD}"
BASE_URL: "https://rss.yourdomain.com"
POLLING_FREQUENCY: 60 # Check feeds every 60 minutes
POLLING_PARSING_ERROR_LIMIT: 3
SCHEDULER_ROUND_ROBIN_MIN_INTERVAL: 1
depends_on:
db:
condition: service_healthy
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: miniflux
POSTGRES_USER: miniflux
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
volumes:
- miniflux_db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U miniflux"]
interval: 10s
timeout: 5s
retries: 5
volumes:
miniflux_db:
# .env
POSTGRES_PASSWORD=strong-database-password
ADMIN_PASSWORD=your-admin-password
docker compose up -d
Visit http://your-server:8080 and log in with your admin credentials.
Part 2: HTTPS with Caddy
rss.yourdomain.com {
reverse_proxy localhost:8080
}
Part 3: Add Feeds and Categories
Add a Feed
- Add Subscription → enter feed URL
- Miniflux auto-detects RSS/Atom/JSON Feed URLs
- Assign to a category (create categories first in Settings)
Common feed URL patterns:
https://example.com/feed
https://example.com/rss
https://example.com/atom.xml
https://example.com/feed.xml
https://blog.example.com/?feed=rss2 # WordPress
https://example.com/posts/index.xml # Hugo
https://medium.com/feed/@username # Medium
https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID # YouTube
Import OPML (Export from Another Reader)
If migrating from Feedly, Inoreader, or another reader:
Settings → Import/Export → Import OPML file
Most RSS readers export to OPML format.
Organize with Categories
- Settings → Categories → Create category
- Examples:
Tech News,Dev Blogs,Newsletters,Podcasts - Assign feeds to categories when adding them
- Filter the sidebar by category in the reader
Part 4: Keyboard Shortcuts
Miniflux is designed for keyboard-first navigation:
| Key | Action |
|---|---|
j / k | Next / previous item |
o | Open article in new tab |
m | Mark as read/unread |
s | Star/save article |
v | View original in new tab |
h | Go back to feed list |
g u | Go to Unread |
g s | Go to Starred |
g h | Go to History |
f | Add subscription |
R | Refresh all feeds |
? | Show all shortcuts |
Part 5: Mobile Apps via Fever API
Miniflux supports the Fever API — a protocol used by many RSS apps before Google Reader shut down.
Enable Fever API in Miniflux
- Settings → API Keys
- Enable Fever API
- Note the Fever endpoint:
https://rss.yourdomain.com/fever - The password for Fever is an MD5 hash — set it in Settings → API Keys → Fever API
Mobile App Setup
iOS:
- Reeder 5 — best iOS RSS app
- NetNewsWire — free, open source
- Unread
Android:
- ReadYou — Material You RSS reader
- Fluent Reader Lite
Configure any Fever-compatible app:
- Select "Fever" as server type
- URL:
https://rss.yourdomain.com/fever - Email: your Miniflux username
- Password: your Fever API password
Miniflux Native API
Miniflux also has its own REST API for building integrations:
# Get auth token:
curl -X POST https://rss.yourdomain.com/v1/me \
-u admin:your-password
# List feeds:
curl https://rss.yourdomain.com/v1/feeds \
-H "X-Auth-Token: your-api-token"
# Get unread entries:
curl "https://rss.yourdomain.com/v1/entries?status=unread" \
-H "X-Auth-Token: your-api-token"
# Mark entry as read:
curl -X PUT "https://rss.yourdomain.com/v1/entries" \
-H "X-Auth-Token: your-api-token" \
-H "Content-Type: application/json" \
-d '{"entry_ids": [123], "status": "read"}'
Part 6: Integrations
Save to Wallabag (Read Later)
Wallabag is a self-hosted Pocket/Instapaper alternative:
- Settings → Integrations → Wallabag
- Enter your Wallabag URL and credentials
- A "Save to Wallabag" button appears on each article
Send to Kindle
- Settings → Integrations → Send to Kindle
- Enter your
@kindle.comaddress - Articles get sent to your Kindle device
Webhook Integration
Send new articles to n8n, Zapier, or custom webhooks:
# In n8n: HTTP Webhook node listening at:
https://n8n.yourdomain.com/webhook/miniflux-new-items
# Configure in Miniflux Settings → Integrations → Webhook URL
Readwise Integration
Save highlighted articles to Readwise for spaced repetition:
- Settings → Integrations → Readwise
- Enter your Readwise API key
- Starred articles sync to Readwise
Part 7: Advanced Configuration
Fetch Full Article Content
Many feeds only provide a summary. Miniflux can scrape the full article:
In feed settings: Enable scraper → Miniflux fetches and renders the full page.
Custom User-Agent
Avoid being blocked by aggressive bot detection:
environment:
HTTP_CLIENT_USER_AGENT: "Mozilla/5.0 (compatible; Miniflux/2.0)"
HTTP_CLIENT_PROXY: "http://proxy:8080" # Optional proxy
Retention Policy
Control how long read articles are kept:
environment:
CLEANUP_FREQUENCY_HOURS: 24 # Run cleanup daily
CLEANUP_ARCHIVE_READ_DAYS: 60 # Archive read articles after 60 days
CLEANUP_REMOVE_ENTRIES_DAYS: 180 # Delete entries older than 180 days
Notifications on New Items
Get notified when feeds have new items:
environment:
# Ntfy (self-hosted push notifications):
NTFY_ENABLED: "true"
NTFY_URL: "https://ntfy.sh/your-topic"
NTFY_ICON_URL: "https://rss.yourdomain.com/favicon.ico"
# Or Apprise (multi-provider notifications):
APPRISE_URL: "mailto://user:pass@smtp.yourdomain.com"
Resource Usage
Miniflux (idle): ~20MB RAM
PostgreSQL (100 feeds): ~50MB RAM
Total: ~70MB RAM
Startup time: <2 seconds
CPU (feed refresh): <5% for 1 minute/hour
Database size (1 year): ~1GB for 100 active feeds
Miniflux can comfortably share a VPS with Nextcloud, Vaultwarden, or any other self-hosted service.
Maintenance
# Update Miniflux:
docker compose pull
docker compose up -d
# Backup:
docker exec miniflux-db pg_dump -U miniflux miniflux | \
gzip > miniflux-backup-$(date +%Y%m%d).sql.gz
# Export OPML (all feeds):
curl https://rss.yourdomain.com/export \
-H "X-Auth-Token: your-api-token" \
-o feeds-export.opml
# Manually refresh all feeds:
docker exec miniflux miniflux -refresh-feeds
See all open source feed readers at OSSAlt.com/categories/rss.