Taking Back Your News Feed
RSS never died – it just got buried under algorithmic feeds, notification badges, and subscription prompts. For anyone who wants to read the web on their own terms, a self-hosted RSS reader offers something most modern news apps cannot: full control over what you see, when you see it, and where your reading data lives. Miniflux delivers exactly that in a stripped-down, fast, and surprisingly capable package.
Unlike heavier alternatives that bundle in JavaScript frameworks, plugin systems, and elaborate dashboards, Miniflux is a single binary written in Go. It runs on minimal hardware, loads instantly in the browser, and stores everything in a PostgreSQL database you control. This guide walks through setting it up on a Linux server or a Raspberry Pi from scratch, including the database, the service configuration, and optional reverse proxy access.

What You Will Need Before Starting
This setup assumes a machine running Ubuntu 22.04 or Debian 12, though most steps apply to any systemd-based Linux distribution. You will need sudo access, a working internet connection on the server, and PostgreSQL installed. If you are running this on a Raspberry Pi, a Pi 4 with 2GB of RAM is more than enough – Miniflux at idle uses under 30MB of memory.
PostgreSQL is the only supported database for Miniflux. The project deliberately avoids SQLite to support concurrent access cleanly, which matters if you plan to use the API with mobile clients like Reeder or NetNewsWire. Install it with sudo apt install postgresql postgresql-contrib and make sure the service is running before proceeding. From there, you will create a dedicated database user and database for the application.
Run sudo -u postgres psql to enter the PostgreSQL shell. Then create the user and database with these three commands: CREATE USER miniflux WITH PASSWORD ‘yourpassword’; followed by CREATE DATABASE miniflux OWNER miniflux; and finally CREATE EXTENSION hstore; – though that last one is optional and only needed if you plan on extended metadata storage. Exit the shell with \q and confirm the database is accessible by running psql -U miniflux -d miniflux -h localhost.
Installing the Miniflux Binary
Miniflux distributes precompiled binaries through its GitHub releases page. For a Debian or Ubuntu system, the project also maintains an APT repository, which is the cleanest install path. Add the repository key with curl -fsSL https://apt.miniflux.app/KEY.gpg | sudo gpg –dearmor -o /usr/share/keyrings/miniflux-archive-keyring.gpg, then add the source list entry and run sudo apt update && sudo apt install miniflux. The binary installs to /usr/bin/miniflux and a default configuration file appears at /etc/miniflux.conf.
Open that configuration file and update the DATABASE_URL line to match the credentials you created: postgres://miniflux:yourpassword@localhost/miniflux?sslmode=disable. The RUN_MIGRATIONS flag should be set to 1 so Miniflux automatically builds its database schema on first launch. Set a LISTEN_ADDR value of 127.0.0.1:8080 if you plan to put a reverse proxy in front of it, or 0.0.0.0:8080 to expose it directly on your local network. Save the file and move to service activation.

Running Miniflux as a System Service
The APT installation registers a systemd service automatically. Enable and start it with sudo systemctl enable miniflux && sudo systemctl start miniflux. Check that it came up cleanly with sudo systemctl status miniflux – you should see “active (running)” within a few seconds. If the database connection fails, the error message in the journal is clear enough to diagnose: run sudo journalctl -u miniflux -n 50 to read the recent output.
Once the service is running, create your admin account from the command line before opening the web interface. Run sudo miniflux -create-admin and follow the prompts for a username and password. Miniflux does not create a default admin account automatically, so skipping this step leaves you locked out of the UI entirely. With the account created, navigate to http://your-server-ip:8080 in a browser and log in.
The interface is minimal by design. There are no widgets, no recommendation engines, no read-count graphs shaped like a LinkedIn dashboard. You add feed URLs directly, organize them into categories, and read. Keyboard shortcuts cover almost every action – j and k move between entries, v opens the original article, and m marks as read. The reading experience is closer to a text editor than a social media app, which is the point.
If you want to access Miniflux outside your home network without exposing port 8080 directly, running it behind a reverse proxy like Caddy or Nginx is the standard approach. Caddy handles HTTPS certificate provisioning automatically, which makes it the lower-friction option. A minimal Caddyfile entry looks like: rss.yourdomain.com { reverse_proxy localhost:8080 }. For access over a private tunnel instead, Tailscale on a Raspberry Pi lets you reach your Miniflux instance from anywhere without opening firewall ports at all.

Connecting Mobile Apps and the Fever API
Miniflux supports two external API formats: its own native API and the Fever API, which is compatible with a wider range of third-party clients. To use the Fever API, enable it under Settings – Integrations inside the web interface and set a dedicated Fever password. This is separate from your login password and gets hashed before storage. Once enabled, apps like Reeder on iOS can connect using your server URL appended with /fever/ as the endpoint.
The native Miniflux API uses token authentication and works with clients like Unread and NetNewsWire on Apple platforms, as well as FeedMe on Android. Generate an API key from Settings – API Keys, then enter your server URL and the token in your client of choice. Sync is fast because Miniflux does feed fetching server-side on its own schedule – the default polling interval is every hour, but you can drop it to every fifteen minutes per feed under the feed settings if you are following time-sensitive sources.
Feed management at scale benefits from the category system. You can create categories for topics like Development, News, or Design and assign feeds accordingly. The filtering rules feature goes further: you can write keyword rules that automatically mark entries as read or hide them entirely, which is useful for high-volume feeds where only a fraction of posts are worth reading. Rules use basic string matching against the entry title and are applied at fetch time, so they work even in clients that sync through the API.
One thing to plan for early is database maintenance. PostgreSQL does not automatically reclaim space from deleted rows, so running VACUUM periodically keeps the database size reasonable. Miniflux stores article content locally by default, which means the database grows steadily as you add feeds. The CLEANUP_FREQUENCY_HOURS and ARCHIVE_READ_DAYS settings in the config file control how aggressively old entries are pruned – setting the archive threshold to 60 days on a feed-heavy setup is a reasonable starting point, though feeds that post infrequently may lose historical entries faster than you would want.





