Skip to main content

How to Self-Host Miniflux: Minimalist RSS Reader for Developers 2026

·OSSAlt Team
minifluxrssself-hostingdockerfeed-reader2026

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/k for 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

ReaderLicenseLanguageStorageSelf-hostMobile
MinifluxAGPL 3.0GoPostgreSQLVia Fever API
FreshRSSAGPL 3.0PHPMySQL/PG/SQLiteVia API
Tiny Tiny RSSGPL 3.0PHPMySQL/PGOfficial app
SelfossMITPHPMySQL/SQLiteMobile web
NewsBlurMITPythonMongoDBNative 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

  1. Add Subscription → enter feed URL
  2. Miniflux auto-detects RSS/Atom/JSON Feed URLs
  3. 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

  1. Settings → Categories → Create category
  2. Examples: Tech News, Dev Blogs, Newsletters, Podcasts
  3. Assign feeds to categories when adding them
  4. Filter the sidebar by category in the reader

Part 4: Keyboard Shortcuts

Miniflux is designed for keyboard-first navigation:

KeyAction
j / kNext / previous item
oOpen article in new tab
mMark as read/unread
sStar/save article
vView original in new tab
hGo back to feed list
g uGo to Unread
g sGo to Starred
g hGo to History
fAdd subscription
RRefresh 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

  1. Settings → API Keys
  2. Enable Fever API
  3. Note the Fever endpoint: https://rss.yourdomain.com/fever
  4. The password for Fever is an MD5 hash — set it in Settings → API Keys → Fever API

Mobile App Setup

iOS:

Android:

Configure any Fever-compatible app:

  1. Select "Fever" as server type
  2. URL: https://rss.yourdomain.com/fever
  3. Email: your Miniflux username
  4. 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:

  1. Settings → Integrations → Wallabag
  2. Enter your Wallabag URL and credentials
  3. A "Save to Wallabag" button appears on each article

Send to Kindle

  1. Settings → Integrations → Send to Kindle
  2. Enter your @kindle.com address
  3. 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:

  1. Settings → Integrations → Readwise
  2. Enter your Readwise API key
  3. 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.

Comments