Why RSS Still Wins for News Control
RSS never died – it just got buried under algorithmic feeds and notification spam. For anyone who wants to read the web on their own terms, without a platform deciding what surfaces and when, a self-hosted RSS reader remains the cleanest solution available. Miniflux is built exactly for that use case: minimal, fast, and completely under your control.
Unlike Feedly or Inoreader, Miniflux runs on your own server. No subscription fees, no data harvesting, no UI bloat forcing you toward “discovery” features you never asked for. The application is written in Go, uses PostgreSQL as its backend, and ships as a single binary – which makes deployment straightforward even on modest hardware. A small VPS or a Raspberry Pi running at home handles it without complaint.
This guide covers the full setup: installing Miniflux with Docker Compose, configuring the database, securing it behind a reverse proxy, and getting your feeds imported.

What You Need Before You Start
The setup assumes a Linux server – Ubuntu 22.04 or Debian 12 work well – with Docker and Docker Compose already installed. You will also need a domain name or subdomain pointed at your server’s IP if you plan to expose Miniflux over HTTPS, which you should. Running it purely on localhost is fine for testing, but a proper reverse proxy setup with SSL makes the reader accessible from any device without VPN friction.
Your server should have at least 512MB of RAM. Miniflux and PostgreSQL together are light, but giving the database room to breathe matters as your feed count grows. A single-core VPS at the lowest tier from most providers is genuinely sufficient. If you are already running other self-hosted services on the same machine – a music server like Navidrome, for example – Miniflux adds almost no meaningful load on top.
Create a working directory for the project before writing any configuration files. Something like /opt/miniflux keeps things organized and separates your Miniflux data from other services. All the files below go inside that directory.
Setting Up with Docker Compose
The fastest path to a working Miniflux instance is Docker Compose. Create a file named docker-compose.yml in your working directory with the following content:
services:
miniflux:
image: miniflux/miniflux:latest
ports:
– “127.0.0.1:8080:8080”
depends_on:
db:
condition: service_healthy
environment:
– DATABASE_URL=postgres://miniflux:your_password@db/miniflux?sslmode=disable
– RUN_MIGRATIONS=1
– CREATE_ADMIN=1
– ADMIN_USERNAME=admin
– ADMIN_PASSWORD=your_secure_password
db:
image: postgres:15-alpine
environment:
– POSTGRES_USER=miniflux
– POSTGRES_PASSWORD=your_password
– POSTGRES_DB=miniflux
volumes:
– miniflux-db:/var/lib/postgresql/data
healthcheck:
test: [“CMD”, “pg_isready”, “-U”, “miniflux”]
interval: 10s
start_period: 30s
volumes:
miniflux-db:
Replace your_password and your_secure_password with actual strong passwords before running anything. The RUN_MIGRATIONS=1 flag tells Miniflux to create the necessary database tables on first launch. The CREATE_ADMIN block only applies on first run – once the admin account exists, Miniflux ignores those variables on subsequent starts, so there is no need to remove them. Binding the port to 127.0.0.1 rather than 0.0.0.0 ensures Miniflux only accepts connections locally, which matters once you put it behind a reverse proxy.
Start the stack with docker compose up -d. Watch the logs briefly with docker compose logs -f miniflux to confirm the database migrations completed and the service is listening. The first startup takes slightly longer than usual because PostgreSQL needs to initialize its data directory before Miniflux can connect.

Reverse Proxy and HTTPS with Nginx
With Miniflux running locally on port 8080, the next step is putting Nginx in front of it so you can reach it over HTTPS from anywhere. If Nginx is not installed, run sudo apt install nginx. Create a new site configuration at /etc/nginx/sites-available/miniflux with this server block:
server {
listen 80;
server_name rss.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name rss.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/rss.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/rss.yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Enable the site with sudo ln -s /etc/nginx/sites-available/miniflux /etc/nginx/sites-enabled/, then run sudo nginx -t to validate the configuration. For the SSL certificate, install Certbot and run sudo certbot –nginx -d rss.yourdomain.com. Certbot will handle the certificate issuance and modify your Nginx config to include the certificate paths automatically if you prefer that approach over the manual block above. After reloading Nginx with sudo systemctl reload nginx, your Miniflux instance should be live at your subdomain over HTTPS.
One setting worth adjusting inside Miniflux after logging in for the first time: go to Settings and change the fetch interval for feeds. The default polls every hour. For most reading habits, every 15 or 30 minutes is a better balance between freshness and server load. You can also set per-feed intervals for sources that update rarely, which keeps the polling efficient across a large subscription list.
Importing Feeds and Mobile Access
Miniflux accepts OPML files for bulk feed import, which means migrating from any other RSS reader takes under a minute. Export your OPML from Feedly, NewsBlur, or wherever you were reading before, then upload it through Settings > Import/Export. Miniflux will queue each feed for an initial fetch, and your entries start appearing within a few minutes depending on how many subscriptions you imported.
For mobile reading, Miniflux exposes a Fever API and a Google Reader-compatible API, both of which third-party apps support. On iOS, Reeder and NetNewsWire both connect to Miniflux using the Google Reader API. On Android, FeedMe and ReadYou work the same way. The API endpoint is your Miniflux URL followed by /fever/ for Fever or /v1/ for the native Miniflux API. Generate an API key inside Settings > API Keys rather than using your admin password for these connections.
The web interface itself is usable on mobile without any app – Miniflux’s default theme is responsive and loads fast even on slower connections. Keyboard shortcuts work throughout the web UI, and the reading view strips most page chrome so articles display cleanly without pulling you to the original site unless you want to go there.

Keeping It Running Long Term
Miniflux requires almost no ongoing maintenance once it is running. Updates come through pulling the new Docker image – docker compose pull && docker compose up -d handles it in seconds. Database backups are worth automating: a simple cron job running docker exec against the PostgreSQL container with pg_dump and copying the output somewhere off-server is enough. The one issue that occasionally catches people off guard is feed authentication – some sites require HTTP basic auth or cookies to serve their RSS feeds, and Miniflux supports both, configured per feed under the feed settings menu. If a previously working feed suddenly returns no entries, that is usually the first thing to check.





