Tech Digest

Feeds

Miniflux

One static Go binary, one PostgreSQL database, and a feature list the author will not extend

FeedsApache-2.0Maturearm64 buildsNative OIDC
Last reviewed Profile maintained against the project's own documentation
Operational load
3 / 5
Moderate
Idle memory
40 MB
typical use ~90 MB
Moving parts
2
containers in a normal deployment
Backup shape
Postgres dump
needs a dump or a stop

A minimalist feed reader distributed as a single static binary that talks to PostgreSQL and nothing else. It replaces Feedly or Inoreader for people who want to read feeds and are actively uninterested in a reader that does anything more.

Our verdict on Miniflux#

Miniflux is the right answer if you want to stop thinking about your feed reader. The application is a single static binary; there is no PHP runtime, no extension directory and no plugin API, and the project's own page says the purpose is to read feeds, nothing else. That constraint is enforced by refusing features, and it is why 2.x has been boring for years in the best sense. The cost is PostgreSQL: it is the only supported database, deliberately, because supporting several multiplies the testing surface, and that turns a one-container app into two containers and a real backup procedure. Version 2.3.0 (May 2026) tightened things further, capping entry limits at 1000 across UI, API and storage, restricting WebAuthn to discoverable passkeys and replacing the removed entry status with a tombstone table. If you find yourself wishing it had per-feed scraping rules or tags, you have picked the wrong reader; go to FreshRSS.

Who Miniflux is for#

Choose it if

  • Someone who already runs PostgreSQL for something else and can add one more database rather than one more stack
  • Readers who want a fast keyboard-driven UI and integrations that push to Wallabag, Linkding, Pinboard or Shaarli in one keystroke
  • Anyone deploying without Docker, since there are official deb, rpm and Alpine packages plus a plain binary
  • People who want OIDC login and passkeys in core rather than bolted on with a proxy

Look elsewhere if

  • You are not willing to run and back up PostgreSQL; there is no SQLite option and there never will be
  • You want per-user extensions, themes or scraping rules configured through a UI
  • You want the reader to be the place where you also archive and annotate articles; Miniflux hands off to Wallabag instead

What running it actually looks like#

Two containers: miniflux/miniflux and a postgres image, sharing a network. Miniflux listens on 8080 (LISTEN_ADDR defaults to 127.0.0.1:8080, so set it explicitly in Docker or nothing reaches it). Set DATABASE_URL, RUN_MIGRATIONS=1 so schema changes apply on boot, and CREATE_ADMIN=1 with ADMIN_USERNAME and ADMIN_PASSWORD for the very first start; the docs note you can drop the admin variables afterwards. The image ships a healthcheck (miniflux -healthcheck auto) worth wiring into compose so the app waits for the database. Multi-arch covers amd64, arm64, armv7 and armv6, and 2.3.0 added riscv64 builds. Upgrades are pull, restart, migrations run themselves. The awkward upgrade is PostgreSQL's own major version bump, which is a dump and reload, not a container swap.

Resource profile#

Memory
40 MB idle, around 90 MB in ordinary use. The Miniflux process itself is a static Go binary with a tiny resident set; the number to plan around is PostgreSQL next to it, which will want 150 MB or more with default settings. Figures are observed estimates, not documented minimums.
CPU and acceleration
Effectively idle between polls. The scheduler wakes on `POLLING_FREQUENCY` (60 minutes by default) and hands `BATCH_SIZE` feeds (default 100) to the fetchers, so CPU comes in short, predictable bursts rather than a constant load.
Storage growth
Growth is entirely PostgreSQL: article rows plus content. 2.3.0 added a tombstone table so deleted entries stay deleted, which adds a small permanent row per removed entry. Set per-feed cleanup and it stays in the hundreds of megabytes for years.
Operational load
3 of 5, Moderate. The app itself is a 1: one process, no state, upgrade by replacing the binary. The score is a 3 because you are now running PostgreSQL, which means a real dump-and-restore procedure, a major version upgrade path for the database, and a documented order on restore.

Figures describe a small single-household install and are the working assumptions behind our stack planner. Your numbers will differ with library size, user count and hardware. See methodology.

Data and backup surface#

There is exactly one thing to back up and it is the PostgreSQL database. Miniflux keeps no local state: no config file, no cache directory, no uploads, nothing on a volume that matters. Use pg_dump and not a copy of the data directory, and if you are running the official compose file note that the Postgres 18 image changed the volume layout, so a restore that assumes the old path will silently start an empty database. Icons and cached entry content live in the same database and are technically refetchable, but they are not separable, so dump the whole thing. Restore order is: database up, restore dump, then start Miniflux with RUN_MIGRATIONS=1. Export an OPML file periodically as a portable fallback.

Derived backup shape

Postgres dump. pg_dump (or pg_dumpall) into a file, then snapshot that file plus the app's data volume.

Traps and surprises#

LISTEN_ADDR defaults to localhost

The documented default is 127.0.0.1:8080. Inside a container that means the process binds to the container's own loopback and your published port connects to nothing, which presents as an immediate connection refused with a container that looks healthy. Set LISTEN_ADDR=0.0.0.0:8080 in any containerized deployment, or use a Unix socket path if you are running behind a local proxy.

RUN_MIGRATIONS is not on by default

Without RUN_MIGRATIONS=1 a new Miniflux version starts against an old schema and fails rather than upgrading. This bites people who pinned a version, upgraded months later, and had forgotten the variable was ever needed. Set it permanently in your compose file; the migrations are forward-only, so take the database dump before the pull, not after.

2.3.0 removed the `removed` entry status

Miniflux 2.3.0 replaced the removed status with a tombstone table so that archived or deleted entries stop reappearing as unread when the feed re-serves them. It is a data model change applied by migration, so upgrade through it in order rather than jumping several versions on a database you care about, and take a dump first.

AUTH_PROXY_HEADER without trusted networks is an open door

Header authentication tells Miniflux to trust a username in an HTTP header. It must be paired with TRUSTED_REVERSE_PROXY_NETWORKS scoped to the proxy's actual address, and the proxy must strip any inbound copy of that header, or anyone who can reach the port can assert any username. This is the same failure mode every header-auth app has, and it is worth checking rather than assuming.

Polling is batched, not continuous

The scheduler runs on POLLING_FREQUENCY (60 minutes) and only queues BATCH_SIZE feeds (100) per interval. With 400 feeds and defaults, a given feed is checked roughly every four hours no matter what per-feed interval you set. Raise BATCH_SIZE or shorten the frequency to match your feed count instead of blaming the individual feeds.

Specifications#

Category
Feeds, bookmarks and read-it-later
Licence
Apache-2.0 (Permissive)
Written in
Go
First release
2017
Maturity
Mature
Datastore
PostgreSQL only
Default ports
8080
Ships as
docker, deb/rpm package, native binary, alpine package
arm64 builds
Yes
Identity
Native OIDC. Generic OIDC and Google are built in via `OAUTH2_PROVIDER`, plus header-based proxy auth through `AUTH_PROXY_HEADER` (which requires `TRUSTED_REVERSE_PROXY_NETWORKS`), and WebAuthn passkeys for local accounts.
Replaces
Feedly, Inoreader, NewsBlur, The Old Reader
Project site
miniflux.app
Source
github.com/miniflux/v2
Documentation
miniflux.app/docs

Alternatives to Miniflux#

Everything else in feeds, bookmarks and read-it-later, closest in operational weight first.

ToolOps loadIdle RAMLicence
Karakeep3, Moderate700 MBAGPL-3.0
wallabag3, Moderate180 MBMIT
FreshRSS2, Light90 MBAGPL-3.0
linkding1, Set and forget90 MBMIT

Where Miniflux comes up elsewhere#

Sources#

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.