Miniflux is a minimalist, opinionated RSS reader: a single Go binary plus PostgreSQL, a clean and fast interface, keyboard shortcuts, and privacy features like stripping tracking pixels and fetching original content. If you want something that just works, with almost no maintenance, Miniflux is an excellent choice for a small VPS.

For a more feature-rich reader with extensions, see FreshRSS.

Requirements

  • Any small VPS. Miniflux uses tens of MB of RAM, and PostgreSQL slightly more.
  • Docker and Docker Compose, or the binary plus PostgreSQL. See install Docker.

Docker Compose

# /opt/miniflux/compose.yaml
services:
  miniflux:
    image: miniflux/miniflux:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:8080"
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://miniflux:change-me-db@db/miniflux?sslmode=disable
      RUN_MIGRATIONS: "1"
      CREATE_ADMIN: "1"
      ADMIN_USERNAME: admin
      ADMIN_PASSWORD: change-me-long-password
      BASE_URL: https://rss.example.com
      POLLING_FREQUENCY: "30"           # minutes
  db:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: miniflux
      POSTGRES_PASSWORD: change-me-db
      POSTGRES_DB: miniflux
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      start_period: 30s
cd /opt/miniflux && docker compose up -d

After the first start, remove CREATE_ADMIN, ADMIN_USERNAME and ADMIN_PASSWORD from the file (the admin exists in the database now), and change the password in the UI. See Docker Compose.

HTTPS with Nginx

server {
    server_name rss.example.com;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    # listen 443 ssl; certbot --nginx -d rss.example.com
}

BASE_URL must match the public URL. See Let’s Encrypt.

Using Miniflux

  • Add subscriptions by URL (feed discovery included), or import OPML.
  • Read with the keyboard: j/k for next and previous, v to open the original, s to star, m to toggle read. Press ? for the full list.
  • Per-feed settings: fetch the original article content (for truncated feeds), custom rules to rewrite or block entries, user agents, and cookies.
  • Categories, starred entries and full-text search.

Privacy is built in: Miniflux removes tracking pixels, proxies media optionally (MEDIA_PROXY_MODE), and supports reading without loading third-party content.

Integrations

Settings → Integrations connects Miniflux to read-later and bookmarking services (Wallabag, Pocket alternatives, Linkding, Shiori), Telegram (new entries to a chat), Pinboard, Notion, webhooks and more. See Wallabag.

Mobile apps via APIs

Enable the Fever API or the Google Reader API in Settings → Integrations, and set a username and password. Then use clients such as Reeder, NetNewsWire, Read You or FeedMe with https://rss.example.com. Miniflux also has its own REST API with client libraries.

Maintenance

  • Polling: POLLING_FREQUENCY and BATCH_SIZE control how often and how many feeds are refreshed. Be polite to small sites.
  • Cleanup: read entries are archived and removed after a configurable period (CLEANUP_ARCHIVE_READ_DAYS), which keeps the database small.
  • Backups: dump PostgreSQL regularly:
docker compose exec -T db pg_dump -U miniflux miniflux > /backups/miniflux-$(date +%F).sql

See pg_dump and backup strategy.

  • Updates: docker compose pull && docker compose up -d. Migrations run automatically with RUN_MIGRATIONS=1. See updating self-hosted apps.

Quick reference

Task Setting / command
Database DATABASE_URL=postgres://…
Public URL BASE_URL
Poll interval POLLING_FREQUENCY (minutes)
Keyboard help ?
APIs Fever / Google Reader in Settings → Integrations
Backup pg_dump miniflux

Related: FreshRSS and Docker security.

  • Self-Hosting
  • RSS
  • Docker