TL;DR
Miniflux (Apache 2.0, ~6K GitHub stars, Go) is a minimalist, opinionated self-hosted RSS feed reader built for speed and keyboard-driven workflows. No JavaScript frameworks, no bloat — just fast, clean RSS reading. Feedly charges $8/month for unlimited sources. Miniflux is free, stores only what you need, and provides a Fever API so existing RSS apps like Reeder and Unread work seamlessly.
Key Takeaways
- Miniflux: Apache 2.0, ~6K stars, Go — minimalist, keyboard-driven RSS reader
- Fever API: Compatible with Reeder, Unread, and other Fever-compatible iOS/Android apps
- Full-text extraction: Fetch full article content from sites that only provide summaries
- Anti-adblock proxying: Fetch articles through a proxy to bypass paywalls (experimental)
- Fast: SQLite or PostgreSQL, built in Go — extremely fast even with thousands of feeds
- vs FreshRSS: Miniflux is more opinionated and minimal; FreshRSS has more customization
Part 1: Docker Setup
# docker-compose.yml
services:
miniflux:
image: miniflux/miniflux:latest
container_name: miniflux
restart: unless-stopped
ports:
- "8080:8080"
environment:
DATABASE_URL: "postgres://miniflux:${DB_PASSWORD}@db/miniflux?sslmode=disable"
RUN_MIGRATIONS: 1
CREATE_ADMIN: 1
ADMIN_USERNAME: admin
ADMIN_PASSWORD: "${ADMIN_PASSWORD}"
BASE_URL: "https://rss.yourdomain.com"
# Fetch full content for truncated feeds:
FETCH_YOUTUBE_WATCH_TIME: 1
POLLING_FREQUENCY: 60 # Check feeds every 60 minutes
CLEANUP_FREQUENCY_HOURS: 24
depends_on:
db:
condition: service_healthy
db:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_DB: miniflux
POSTGRES_USER: miniflux
POSTGRES_PASSWORD: "${DB_PASSWORD}"
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U miniflux"]
interval: 5s
start_period: 20s
volumes:
db_data:
docker compose up -d
Visit http://your-server:8080 → log in with admin credentials.
Part 2: HTTPS with Caddy
rss.yourdomain.com {
reverse_proxy localhost:8080
}
Part 3: Add Feeds
Via web UI
- + Add Feed → paste RSS URL
- Feed auto-detected and added
Common feed URL patterns:
WordPress sites: https://site.com/feed/
Ghost blogs: https://site.com/rss/
Substack: https://username.substack.com/feed/
YouTube channel: https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID
Hacker News: https://news.ycombinator.com/rss
Reddit subreddit: https://www.reddit.com/r/selfhosted.rss
GitHub releases: https://github.com/owner/repo/releases.atom
Import OPML
- Settings → Import/Export → Import OPML
- Upload your
subscriptions.opmlfrom Feedly, Newsblur, etc.
Export from Feedly:
Feedly → Organize → Export → OPML → Download
Part 4: Keyboard Shortcuts
Miniflux is optimized for keyboard-driven reading:
| Key | Action |
|---|---|
j |
Next unread item |
k |
Previous item |
v |
Open original article |
o |
Open original in new tab |
f |
Toggle starred |
m |
Toggle read/unread |
d |
Fetch full content |
g u |
Go to Unread |
g s |
Go to Starred |
g h |
Go to History |
g f |
Go to Feeds |
? |
Show shortcuts |
Part 5: Full-Text Fetching
For sites that only provide article summaries in their RSS feed:
Automatic (per feed)
- Feed settings → Fetch original content: Enable
- Miniflux fetches the full article and stores it locally
Custom scraper rules
# Feed settings → Scraper rules (CSS selectors):
.article-body, article, .post-content
Built-in scrapers
Miniflux has built-in full-text scrapers for 100+ popular sites including:
- The New York Times, The Guardian, BBC
- Ars Technica, Wired, The Verge
- Medium articles
Part 6: Mobile App Integration
Miniflux supports the Fever API for compatibility with RSS apps:
Enable Fever API
- Settings → Integration → Fever API: Enable
- Username: your Miniflux username
- Password: set a separate Fever password
Fever API endpoint: https://rss.yourdomain.com/fever
Compatible apps
| App | Platform | Notes |
|---|---|---|
| Reeder 5 | iOS/macOS | Best iOS RSS reader, Fever native |
| Unread | iOS | Clean, focused reading |
| NetNewsWire | iOS/macOS | Free, open source, excellent |
| ReadKit | macOS | Feature-rich desktop app |
| Fluent Reader | Windows/Linux | Cross-platform |
| Feeder | Android | Simple, open source |
NetNewsWire setup
- File → New Miniflux Account
- URL:
https://rss.yourdomain.com - Username + API key (Settings → Integrations → API keys)
Part 7: Filters and Categories
Categories
- Categories → + Add category
- Name:
Tech,News,Blogs - Add feeds to categories when adding them
Filters (keep rules)
Automatically mark articles as read or starred based on patterns:
-
Feed settings → Keep entry rules:
-
EntryTitle =~ kubernetes→ Keep only articles about Kubernetes
-
-
Block entry rules:
-
EntryTitle =~ sponsored→ Auto-skip sponsored articles
-
Part 8: REST API
# Get API token:
# Settings → API Keys → + Create
TOKEN="your-api-token"
BASE="https://rss.yourdomain.com/v1"
# Get unread entries:
curl "$BASE/entries?status=unread&limit=10" \
-H "X-Auth-Token: $TOKEN" | jq '.[].title'
# Mark entry as read:
curl -X PUT "$BASE/entries" \
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{"entry_ids": [1, 2, 3], "status": "read"}'
# Add a feed:
curl -X POST "$BASE/feeds" \
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{"feed_url": "https://example.com/feed/", "category_id": 1}'
# Star an entry:
curl -X PUT "$BASE/entries/42/bookmark" \
-H "X-Auth-Token: $TOKEN"
Maintenance
# Update:
docker compose pull
docker compose up -d
# Backup:
docker exec miniflux-db-1 pg_dump -U miniflux miniflux \
| gzip > miniflux-db-$(date +%Y%m%d).sql.gz
# Logs:
docker compose logs -f miniflux
# View feed errors:
# Feeds → Filter by "Parse error" to see broken feeds
See also: FreshRSS — more customization and Google Reader API
See all open source RSS tools at OSSAlt.com/categories/productivity.
Top comments (0)