Pocket Died. Your 3,847 Saved Links Deserve Better.
If you were a Pocket user, you already know the story. Mozilla announced the shutdown in mid-2025, gave everyone a polite wave, and suddenly thousands of people were left with years of saved articles, half-read tabs, and the dawning realization that “read it later” had become “read it never, and also now it’s gone.”
Raindrop.io got a traffic spike. Pinboard quietly cackled. And a bunch of home-labbers started asking: why am I trusting a third party with my reading list at all?
Enter Karakeep — formerly called Hoarder until it was renamed in 2025, presumably because “hoarder” tests poorly with people who have feelings about their bookmark collections. Same project, new name, and it’s genuinely one of the more useful self-hosted tools I’ve set up this year.
Here’s the thing: it’s not just a link dump. Karakeep connects to a local or remote LLM and automatically tags, summarizes, and full-text indexes everything you throw at it. Save a link, get back organized metadata without lifting a finger. No more “I know I saved that article about Postgres partitioning, I just can’t find it.”
Full example: Clone the working Compose files at github.com/KingPin/sumguy-examples/self-hosting/karakeep-ai-tagged-bookmarks
What Karakeep Actually Does
Before we spin up containers, let’s be clear about what you’re getting:
- Auto-tagging via LLM — Save a link, Karakeep fetches the page content and sends it to an LLM (Ollama locally or OpenAI via API) to extract relevant tags and a summary. No manual taxonomy required.
- Full-text indexing — Every saved page gets indexed via Meilisearch so you can search inside article content, not just titles.
- Archive snapshots — Pages are saved locally so your bookmarks don’t 404 on you in three years. Pocket promised this. It’s a requirement here.
- PDF support — Drop in a PDF, it gets OCR’d and indexed. Useful if you compulsively save research papers you’ll definitely read someday.
- Browser extensions — Chrome/Firefox extensions for one-click saving. There’s also a mobile app (iOS + Android) so you can bookmark from your phone without opening a laptop.
- OPML import — Migrate from Pocket, Raindrop, or Pinboard with an export/import flow. Your 3,847 links can come with you.
- RSS support — Subscribe to feeds and have items auto-added to your library.
The stack is: Next.js frontend, Meilisearch for search, a background worker for AI processing, and either Ollama (local LLM) or an OpenAI-compatible API for tagging.
The Compose Stack
Here’s a production-ready setup with Ollama for fully local AI tagging. No API keys, no per-token costs, no explaining to your accountant why your AWS bill has a line item for “reading articles.”
services: karakeep: image: ghcr.io/karakeep-app/karakeep:latest container_name: karakeep restart: unless-stopped depends_on: - meilisearch - chrome ports: - "3000:3000" environment: NEXTAUTH_SECRET: "${NEXTAUTH_SECRET}" NEXTAUTH_URL: "http://localhost:3000" MEILI_ADDR: "http://meilisearch:7700" MEILI_MASTER_KEY: "${MEILI_MASTER_KEY}" BROWSER_WEB_URL: "http://chrome:9222" # Local Ollama — swap these for OPENAI_BASE_URL + OPENAI_API_KEY if preferred OLLAMA_BASE_URL: "http://ollama:11434" INFERENCE_TEXT_MODEL: "llama3.2:3b" INFERENCE_IMAGE_MODEL: "llava:7b" DATA_DIR: "/data" volumes: - karakeep_data:/data
meilisearch: image: getmeili/meilisearch:v1.11 container_name: karakeep_meili restart: unless-stopped environment: MEILI_MASTER_KEY: "${MEILI_MASTER_KEY}" MEILI_NO_ANALYTICS: "true" volumes: - meili_data:/meili_data
chrome: image: gcr.io/zenika-hub/alpine-chrome:123 container_name: karakeep_chrome restart: unless-stopped command: - --no-sandbox - --disable-gpu - --disable-dev-shm-usage - --remote-debugging-address=0.0.0.0 - --remote-debugging-port=9222 - --hide-scrollbars
ollama: image: ollama/ollama:latest container_name: karakeep_ollama restart: unless-stopped volumes: - ollama_models:/root/.ollama # Uncomment for GPU pass-through: # deploy: # resources: # reservations: # devices: # - driver: nvidia # count: all # capabilities: [gpu]
volumes: karakeep_data: meili_data: ollama_models:NEXTAUTH_SECRET=change_this_to_a_random_64_char_stringMEILI_MASTER_KEY=change_this_to_another_random_stringGenerate your secrets properly — don’t use password123:
openssl rand -hex 32 # run twice, use once for each variableFirst launch sequence:
docker compose up -d# Pull the text model (3B is fast, 8B is smarter)docker exec karakeep_ollama ollama pull llama3.2:3b# Optional: pull the vision model for image-in-bookmark analysisdocker exec karakeep_ollama ollama pull llava:7bKarakeep will be at http://localhost:3000. Create your account on first visit — there’s no pre-seeded admin, you’re the admin.
Exposing It Properly
Running this behind Caddy or Nginx Proxy Manager is the move if you want it accessible outside your home network. The only thing to update is NEXTAUTH_URL in your .env to match your actual domain:
NEXTAUTH_URL=https://bookmarks.yourdomain.comIf you’re using Cloudflare Tunnels (the preferred approach for avoiding port-forwarding drama), point the tunnel at localhost:3000 and update the URL. Done.
The AI Tagging Flow in Practice
Save a link. Watch what happens.
The background worker fetches the page via the headless Chrome container, extracts the text, and ships it to Ollama with a prompt that basically says “read this, give me 3-5 relevant tags and a one-sentence summary.” The result gets written back to the bookmark record and Meilisearch picks it up.
For a typical tech article, you’ll get tags like kubernetes, networking, tutorial and a summary like “Explains how to configure pod networking in K8s using Calico.” Accurate enough to be useful. Not perfect — the 3B model will occasionally tag a Docker tutorial as python if the examples use Python — but it’s dramatically better than manually filing things.
For PDFs, the pipeline runs through a text extraction step first. Research papers and technical docs come out surprisingly well-tagged.
Model tuning: llama3.2:3b is the sweet spot for CPU-only setups — fast enough that tagging happens in the background without you noticing. If you’re running with a GPU or don’t mind waiting 20 seconds per bookmark, llama3.1:8b produces noticeably better tags. For the vision model (used when a page is mostly images), llava:7b is reasonable if your hardware can handle the memory hit.
OpenAI fallback: If you don’t want to run Ollama at all, swap these environment variables:
OPENAI_API_KEY=sk-...OPENAI_BASE_URL=https://api.openai.com/v1INFERENCE_TEXT_MODEL=gpt-4o-minigpt-4o-mini tagging costs fractions of a cent per bookmark. At the volume most people save links, it’s basically free. Your call.
Migrating From Pocket (or Anywhere Else)
Pocket export gives you an HTML file. Raindrop gives you CSV or HTML. Pinboard gives you JSON. Karakeep handles all of them via the import screen at Settings → Import.
One thing to know: imported bookmarks get queued for AI processing, not processed instantly. If you dump in 3,000 links, expect the background worker to chew through them over the next few hours. The Ollama container will be earning its keep. Don’t restart the stack mid-import — it picks up where it left off, but there’s no progress indicator that would make you feel better.
The OPML import is specifically for RSS feeds, not bookmarks. Don’t confuse them.
Karakeep vs. the Competition
You’ve got options in the self-hosted bookmarking space. Here’s an honest comparison:
LinkAce — Solid, mature, Laravel-based. Great for pure link archiving. No AI tagging built in. If you just want a clean bookmark database with tags you manage yourself, LinkAce is excellent. Lighter resource footprint than Karakeep.
Linkwarden — More modern UI, supports collaborative collections (shared bookmark folders with your team or household). Also no AI tagging natively. Better choice if multiple people need to curate links together.
Shiori — Minimalist Go binary, dead simple to run. Archive + search, manual tags only. If you want the smallest possible footprint and don’t care about AI features, Shiori is 30MB and will run on a Raspberry Pi Zero. Karakeep needs a real machine.
Karakeep — Wins when you want AI-assisted organization, don’t want to manually tag hundreds of saved links, and need full-text search inside page content. The tradeoff is resource cost: Ollama + Meilisearch + Chrome is a heavy stack. Budget 4GB RAM minimum, 8GB comfortable.
If you’re on a NAS with 2GB to spare, run Shiori. If you’re on a proper home server and hate organizing things manually, Karakeep is the answer.
A Few Gotchas Worth Knowing
The Chrome container is not optional. Karakeep uses headless Chromium to render JavaScript-heavy pages before extracting content. Static fetching via curl would miss half the modern web. The container is lightweight in practice but it needs to be running.
Meilisearch v1.11+ matters. Earlier versions have API incompatibilities. Pin the version in your Compose file like the example above — don’t use latest for Meilisearch in production or a surprise update will break your search index.
Model downloads happen at first tag. The first time Karakeep tries to process a bookmark, Ollama will download the model if it isn’t already present. That first bookmark will take a few minutes. Pull the models manually right after launch (the commands above) to avoid confusion.
Data directory permissions. If you’re bind-mounting DATA_DIR to a host path instead of a named volume, make sure the directory is writable by the container user (UID 1000). Named volumes handle this automatically — another reason to use them.
Browser Extensions and Mobile
The browser extension (Chrome/Firefox) adds a toolbar button that sends the current tab to Karakeep in one click. No copy-paste, no tab-switching. It also supports a quick-add mode where you can add notes or override tags before saving, which is useful when you know the LLM is going to miscategorize something.
The mobile app (available for iOS and Android) is genuinely useful — the share sheet integration means you can save links from any app that supports sharing a URL. Read something in your RSS reader, tap Share, tap Karakeep. It lands in your library and gets queued for AI processing like anything else.
Both clients authenticate against your instance using the same credentials as the web UI. There’s no separate API key setup needed — the session cookie flow handles it.
One subtle feature: the extension has a “bulk import from tabs” option. If you have 47 open tabs you’ve been meaning to deal with (we don’t judge), you can send them all at once and let Karakeep sort them out. Meilisearch and Ollama will be having a long night, but you’ll wake up to a tagged, searchable library.
Reverse Proxy With Caddy
If you’re already running Caddy as your reverse proxy — and you should be — adding Karakeep is one stanza:
bookmarks.yourdomain.com { reverse_proxy localhost:3000}Update NEXTAUTH_URL in your .env to match, restart the stack, and you’re done. Caddy handles TLS automatically. No nginx config file archaeology required.
If you’re on Cloudflare Tunnels instead, the setup is even simpler: create a tunnel pointing to http://localhost:3000 and update the URL. Either way, don’t expose port 3000 directly to the internet — there’s no rate limiting on the login page by default.
Closing Thoughts
Pocket’s death was annoying, but honestly it was a forcing function. Pocket never did AI tagging, full-text content search, or local archiving at the same time. Karakeep does all three, and you own the data.
The setup is heavier than a simple read-later app has any right to be — you’re essentially running a mini search engine with an LLM on the side. But that’s the price of actually finding things later instead of just saving them to a black hole. Your 2 AM self searching for “that article about Postgres I saved six months ago” will appreciate it.
Start with the llama3.2:3b model, let the queue drain, and then decide if you want to upgrade to 8B. You probably will.
Tagged and archived automatically by the stack described above. No manual taxonomy was harmed in the writing of this article.