Category
Feeds, bookmarks and read-it-later: pick for the export, not the reader
Every tool here exists because something else closed. That makes portability the first specification, not the last one, and OPML plus a readable archive format is the whole test.
Judge these tools on the way out, not the way in#
Google Reader closed in 2013 and created this entire category. Pocket was shut down by Mozilla in 2025. Omnivore went the same way. Even inside self-hosting, Hoarder renamed itself to Karakeep in 2025 and the old ghcr.io/hoarder-app/hoarder image stopped receiving updates, which is a smaller version of the same event.
So the first specification is not the reading experience. It is what the tool hands back when you leave, and how long that artifact stays readable.
Three answers, in order of durability. OPML is the strongest for feeds: every reader imports it, it is a few kilobytes, and it carries your subscription list and folders. It does not carry read state, filter rules or starred items, which is the right tradeoff, because your feed list is the part you cannot rebuild from memory. Self-contained HTML is the strongest for saved pages: a SingleFile snapshot with inlined assets opens in any browser in ten years with no server. Extracted plain text, which is what wallabag stores and exports as JSON, is smaller, uglier and just as durable.
What is weakest is a proprietary archive bundle that only its own importer can read.
The default#
Miniflux for feeds, linkding for bookmarks. Miniflux is one static Go binary with no plugin API and a maintainer who declines features deliberately, which is why 2.x has been boring for years in the good sense. linkding is one container, one SQLite file, ops load 1, and search results appear before you finish typing. Together they idle at roughly 130 MB, and both have a documented, scriptable export.
The cost is Miniflux's PostgreSQL requirement. There is no SQLite option and there never will be, so a one-container app becomes two containers, a pg_dump in your backup script and a database major-version upgrade to plan for.
There are two situations where that is the wrong call. Three people in the house want their own accounts, and half your feeds publish excerpts only: FreshRSS does per-feed scraping, filter rules and both the Google Reader and Fever APIs from one SQLite container at about 90 MB. You save PDFs, screenshots and images as often as links, and want search across their contents: Karakeep, at three containers and around 700 MB.
The mistakes#
- No
CRON_MINon FreshRSS. The image starts no refresh cron without it. Nothing errors; new articles simply stop arriving. - Leaving Miniflux on
LISTEN_ADDR=127.0.0.1:8080. That is the documented default, and inside a container it means your published port connects to nothing. Set0.0.0.0:8080. - Forgetting
RUN_MIGRATIONS=1. Without it a new Miniflux starts against an old schema and fails. Set it permanently, and take the dump before the pull, since migrations are forward-only. - Copying
db.sqlite3out of linkding. The documentation says outright that this is not transaction safe and can yield a corrupted database. Usemanage.py full_backup, which zips the database and the data directory consistently, and open the zip once. - A 403 on every linkding login behind nginx. The Origin check fails when the proxy does not forward
X-Forwarded-ProtoandHost. Fix the headers or setLD_CSRF_TRUSTED_ORIGINS. - Turning on all three Karakeep archive options.
CRAWLER_FULL_PAGE_ARCHIVE,CRAWLER_FULL_PAGE_SCREENSHOTandCRAWLER_STORE_PDFare off by default because each raises disk use sharply. With all three on, 5,000 bookmarks is tens of gigabytes. - Losing the Karakeep admin password. There is no CLI reset. The official answer is stopping the app and running an
UPDATEagainstdb.dbinsqlite3. - Setting wallabag's
SYMFONY__ENV__DOMAIN_NAMEto a test URL. It is baked into every absolute link, including password reset emails, and changing it later means clearingvar/cachetoo. Its default credentials arewallabag/wallabag, which are in every wordlist. - Unbounded retention. FreshRSS keeps articles until you tell it not to. Set a global and per-feed policy before the database gets slow.
Read next#
FreshRSS vs Miniflux decides the reader question properly. Replace Feedly and Replace Pocket are the migration paths, including the OPML and CSV import steps. Then Backing up a running database for the Miniflux dump, and Backups that actually restore for proving the archive opens.
Every feeds tool we profile#
Sorted by operational load, lightest commitment first. Every row links to a full profile with the resource numbers, the upgrade traps and the restore path.
| Tool | Ops load | Idle RAM | Licence | Identity | Backup shape |
|---|---|---|---|---|---|
| linkding | 1, Set and forget | 90 MB | MIT | Native OIDC | SQLite backup |
| FreshRSS | 2, Light | 90 MB | AGPL-3.0 | Native OIDC | SQLite backup |
| Karakeep | 3, Moderate | 700 MB | AGPL-3.0 | Native OIDC | SQLite backup |
| Miniflux | 3, Moderate | 40 MB | Apache-2.0 | Native OIDC | Postgres dump |
| wallabag | 3, Moderate | 180 MB | MIT | Auth proxy only | SQLite backup |
Profiles#
linkding
A bookmark manager that is one container, one SQLite file and no opinions about your workflow
ops 2/5 · 90 MBFreshRSS
Multi-user PHP feed aggregator with extensions, scraping and both Fever and Google Reader APIs
ops 3/5 · 700 MBKarakeep
Bookmark-everything app (formerly Hoarder) with LLM tagging and full-text search
ops 3/5 · 40 MBMiniflux
One static Go binary, one PostgreSQL database, and a feature list the author will not extend
ops 3/5 · 180 MBwallabag
Read-it-later that keeps the article text, not a link that rots
Head to head in this category#
- FreshRSS vs MinifluxOne static binary with a fixed feature set, against PHP with extensions and an XPath scraper.
Leaving a cloud service in this category#
- Replace FeedlyOPML moves your feeds and nothing else. Which self-hosted reader to run, and what you lose.
- Replace PocketPocket is gone and the export window closed. Read-later, bookmarking and page archival are three different tools.
Questions#
FreshRSS or Miniflux?
Miniflux if you want to stop thinking about your reader: one static Go binary, no plugin API, and a maintainer who refuses features on purpose. The cost is PostgreSQL, which is the only supported database, so a one-container app becomes two containers and a real dump-and-restore procedure. FreshRSS if you want configurability: SQLite in one container at about 90 MB, both the Google Reader and Fever APIs so essentially every mobile client works, and extensions that scrape full article text from excerpt-only feeds. Those extensions are third-party PHP in your process and are what breaks on upgrade.
What happens to my subscriptions if the reader shuts down?
If you exported OPML, nothing much: every reader here imports it and you are back in ten minutes. OPML carries your feed list and folder structure and nothing else, so read state, per-feed filter rules and starred items do not travel. That is fine, because the feed list is the part you cannot rebuild from memory. Schedule the export rather than intending it: both FreshRSS and Miniflux export OPML from the UI, and a monthly copy into the same place as your other backups costs a few kilobytes.
Why have my FreshRSS feeds stopped updating?
You almost certainly did not set CRON_MIN. The Docker image only starts its internal refresh cron when that variable is present, so without it FreshRSS looks perfectly healthy, logs nothing alarming, and simply stops showing new articles until someone triggers a refresh by hand. Set CRON_MIN=1,31 and confirm the last refresh time moves on the admin page. If you are on Miniflux instead, the equivalent surprise is batching: POLLING_FREQUENCY is 60 minutes and BATCH_SIZE is 100, so 400 feeds get checked roughly every four hours.
linkding or Karakeep?
linkding is one container, one SQLite file, about 90 MB, and it does tags, search and optional local HTML snapshots. Karakeep is three containers (app, Meilisearch, a headless Chrome), roughly 700 MB idle, and adds full-text search across the content of saved pages, PDF and image saving, and optional LLM tagging that needs either an OpenAI key or a separate Ollama host with around 5 GB of RAM or VRAM for a 7B-class quantized model. Choose Karakeep only if you save screenshots and PDFs as often as links.
Is wallabag still maintained?
Stable and slow, not abandoned. The last release was 2.6.14 in October 2025 and there has been no release since, so the published Docker image is roughly a year old as of September 2026. There is daily activity on master, mostly dependency maintenance, and wallabag 3.0 with its Symfony rebuild has still not landed years after it was announced. It works, it has mobile apps and browser extensions, and 2.6.14 specifically added Pocket CSV import. If a year between releases is unacceptable to you, that is a fair reason to look elsewhere.
What should I use now that Pocket is gone?
Mozilla shut Pocket down in 2025, and there are two shapes of replacement. wallabag is the direct one: it fetches the page, extracts the readable text, and keeps it, with EPUB, MOBI and PDF export and per-tag feeds for e-readers. Karakeep is the maximalist one: it stores the text plus a screenshot, a full-page archive and a PDF, which is the difference between kilobytes and several megabytes per saved item. Both import Pocket exports. Whichever you pick, turn on a scheduled JSON or archive export straight away.
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.