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/kfor next and previous,vto open the original,sto star,mto 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_FREQUENCYandBATCH_SIZEcontrol 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 withRUN_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.