When a service disappears and takes your data with it
On July 8, 2025, Pocket switched to read-only mode. Mozilla had announced the closure one month earlier, citing a shift in strategic priorities. Users had approximately 90 days to export their library via getpocket.com/export before the November 12, 2025 deadline: on that date, Mozilla disabled exports and permanently deleted every account's data. Those who had not exported in time lost everything. Mozilla kept no copy, and the Pocket API is now offline. Omnivore, an annotated reading tool acquired by ElevenLabs, had closed a few months earlier under similar conditions. These two successive closures highlighted a risk that is often underestimated: ten years of bookmarks, highlights, and organized tags can vanish in a matter of weeks, with no appeal process. The question is no longer whether such an event can happen, but how frequently.
What you gain by self-hosting your reading list
Hosting your own reading list on a VPS fundamentally changes your relationship with your data. Here are the concrete benefits compared to a cloud service like Pocket or Omnivore.
- Data longevity — your archived articles remain accessible as long as your server runs, regardless of a third-party vendor's commercial or financial decisions; a startup closure no longer affects you
- Reading privacy — no advertising profile is built from your reading habits; saved URLs, tags, and annotations never leave your own infrastructure
- Full backup control — you define the frequency, destination (S3, Backblaze, local NAS), and retention period of your snapshots, without depending on a paid plan or a storage quota
- Open integration with your stack — the REST API of Karakeep or Wallabag connects to any tool (n8n, Zapier, custom scripts, browser extensions) at no extra cost and without volume restrictions
- Storage without artificial quotas — the limit is your disk; you do not pay a premium for archiving 50,000 articles rather than 1,000
- Upgrades on your schedule — you decide when to apply a major release, can test in staging, and roll back if an update introduces a regression
- Permanent portability — your data lives in a SQLite or PostgreSQL database that you can export, migrate, or transform at any time, without depending on a proprietary format
Prerequisites: choosing the right VPS
A self-hosted reading list application is not a resource-heavy workload. Karakeep needs somewhat more RAM than Wallabag, because it runs Meilisearch for semantic search and a headless rendering engine (Puppeteer) for full-content archival. The recommended minimum configuration is a VPS with 2 GB of RAM, 1 vCPU, and 20 GB of SSD storage. For a team of fewer than ten people, this configuration holds without adjustment. Wallabag is even lighter: 512 MB of RAM is enough for individual use. In both cases, ports 80 and 443 must be open in the firewall, Docker and Docker Compose v2 must be installed, and a domain name pointing to the server IP is needed to enable HTTPS via Let's Encrypt or Caddy. The certificate is obtained automatically by your reverse proxy — you do not need to manage renewal manually.
Deploy Karakeep on a VPS and import your Pocket data
The steps below assume a VPS with at least 2 GB of RAM, Docker and Docker Compose v2 installed, and a domain name pointing to the server IP. The whole operation takes less than 30 minutes on a fresh instance.
Locate your Pocket export
If you exported before November 12, 2025, you have a file called ril_export.html. This is an HTML document containing all your saved URLs along with their titles, tags, and read/unread status. This file is your only data source: keep a copy on external storage before you begin.
Create a working directory on the VPS
Connect over SSH and run: mkdir -p /opt/karakeep && cd /opt/karakeep. This directory will hold the Compose file and the environment file.
Download the official Compose file
Retrieve the service definition from the official repository: wget https://raw.githubusercontent.com/karakeep-app/karakeep/main/docker/docker-compose.yml. This file orchestrates three services: the main application, Meilisearch (search engine), and the crawl service.
Configure environment variables
Create the .env file with the minimum required values. Set KARAKEEP_VERSION=release to always use the latest stable release. Set NEXTAUTH_SECRET to a long random string (at least 32 characters), MEILISEARCH_MASTER_KEY to another random string, and NEXTAUTH_URL to the public URL of your instance, for example https://reading.your-domain.com. Without a correct NEXTAUTH_URL, authentication redirects will fail.
Start the containers
Run docker compose up -d. The first start downloads the images (around 500 MB) and initializes the database. Verify that all three services show running status with docker compose ps. The interface is available on port 3000; configure your reverse proxy (Caddy or nginx) to serve the domain over HTTPS before opening it to the public.
Create the administrator account
On first login, Karakeep prompts you to create an account. Choose a strong password; there is no email-based password reset by default unless you have configured an SMTP service.
Import the Pocket file
In the interface, open Settings → Import and select Pocket. Upload your ril_export.html file. Karakeep reads this format natively and imports titles, URLs, tags, and statuses in a few seconds for an average-sized library. Full content crawling happens in the background: a progress indicator appears in the detail view of each article.
Verify the import and set up backups
Browse the All Bookmarks view to confirm your articles are present. Then schedule a Docker volume backup in cron: docker run --rm -v karakeep_data:/data -v /opt/backups:/backup alpine tar czf /backup/karakeep-$(date +%Y%m%d).tar.gz /data. Keep at least 7 days of retention on remote storage.
Deploy Wallabag as an alternative
If you prefer a more mature and lighter tool, Wallabag has existed since 2013 and has a proven user base. It is particularly well-suited if you need stable mobile apps, integration with e-readers (Kobo, Kindle), or a more minimal interface. Docker deployment follows the same pattern.
Create the directory and Compose file
Run mkdir -p /opt/wallabag && cd /opt/wallabag. Create a docker-compose.yml file based on the official template available at hub.docker.com/_/wallabag. The minimal configuration exposes port 80 and mounts a volume for the SQLite database.
Start the service
Run docker compose up -d. The first initialization takes a few minutes as Wallabag creates database tables and installs assets. Watch the logs with docker compose logs -f wallabag to confirm the startup completes successfully.
Secure the default account
Log in with wallabag / wallabag, then immediately go to User Management to change the password. This default account is publicly known — do not expose it without changing it.
Enable Redis for large imports
Without Redis, imports of several hundred articles exceed the default PHP timeout. In the admin interface under Internal Settings → Import, enable Use Redis. Add a Redis service to your docker-compose.yml if one is not already defined.
Import from Pocket
Go to Import → Pocket. Wallabag accepts the Pocket CSV format (columns url, title, tags, time_added, status) or a converted HTML file. If you only have the Pocket HTML export, a short Python script is enough to extract the URLs and write them to CSV format. Wallabag also supports direct import from Instapaper and Pinboard.
Configure HTTPS and mobile apps
Put Wallabag behind a reverse proxy with HTTPS. The official mobile apps (Android) use your instance URL and account credentials — they work as soon as HTTPS is active. The iOS app is not official; third-party clients such as Silica or Lire support the Wallabag API.
Karakeep or Wallabag: a comparison
The choice between Karakeep and Wallabag mainly depends on your priorities: enriched archiving versus lightness. The table below summarizes the most important differences for daily use.
| Criterion | Karakeep | Wallabag |
|---|---|---|
| Native Pocket import | HTML (`ril_export.html`) | Pocket CSV or converted HTML |
| Content archival | Full (Puppeteer, OCR, PDF) | Text extraction only |
| Search | Semantic via Meilisearch | Full-text (SQL) |
| Mobile interface | Official iOS and Android apps | Official Android, iOS via third-party clients |
| Automatic tagging | Yes, via optional LLM | Manual only |
| Recommended RAM | 2 GB minimum (includes Meilisearch) | 512 MB is enough |
| Project maturity | Recent, active community | Stable since 2013, wide adoption |
Whatever solution you choose, schedule a daily backup of the Docker volume to remote storage (S3, Backblaze B2, or a second VPS). A reading list without backups remains vulnerable to disk failure — exactly the risk you are trying to eliminate by leaving a cloud service. Test a restore at least once before considering your setup reliable.
Common problems and solutions
The most common errors encountered when deploying or using Karakeep and Wallabag follow predictable patterns. Here are the causes and fixes for the most frequent cases.
- Port 3000 unreachable from outside — verify the container is running with
docker compose psand that the firewall allows inbound traffic; then configure a reverse proxy (Caddy or nginx) rather than exposing port 3000 directly on the public IP - Import stuck at 0% or making no progress — with Wallabag, check that Redis is enabled in the admin internal settings; with Karakeep, verify that the
crawlerservice showsrunningstatus indocker compose ps - Redirect loop back to localhost — if Karakeep keeps redirecting,
NEXTAUTH_URLin.envdoes not match the actual public URL; correct it, recreate the container withdocker compose up -d --force-recreate, and clear your browser cache - Content not archived after import — Karakeep uses Puppeteer to render pages; some sites detect headless browsers and block the request. Titles and URLs are always saved; full text may be absent for protected sites or paywalled content
- 502 error right after a restart — Meilisearch can take 10 to 30 seconds to start and index; wait and reload. If the error persists, check
docker compose logs meilisearchto identify a potential permissions issue on the data volume
Taking lasting control of your reading
Pocket's closure in July 2025 is not an isolated incident. It is a clear signal about the lifespan of free services funded by data or by investors whose priorities shift. Karakeep and Wallabag offer a concrete alternative: two hours of setup are enough to go from zero to a working reading list on your own VPS, with content archival, full-text search, and automated backups. The Docker commands shown in this guide have been stable across multiple releases and require no particular system administration expertise. What you deploy today can run in production for five years without intervention, as long as you keep images updated and your backups are tested. The difference from Pocket is that the decision to shut down now belongs to you alone.