Saves links, notes, images and PDFs, crawls each page with a headless Chrome, indexes the text in Meilisearch and can tag and summarize with an LLM. It replaces Raindrop.io, Evernote's web clipper and Pocket in one stack.
Our verdict on Karakeep#
Karakeep was called Hoarder until the 2025 rebrand, so if you are searching for hoarder-app/hoarder, ghcr.io/hoarder-app/hoarder or old tutorials, this is the same project under a new name and the old images stopped getting updates. It is the maximalist option in this category: three containers (app, Meilisearch, a headless Chrome), SQLite plus a search index, and a crawler that will store the readable text, a screenshot, a full-page archive and a PDF of everything you save. It is also still 0.x (v0.33.2, August 2026), and releases have moved container layout before. Two numbers to plan around. AI tagging is not free: with OpenAI it is per-request cost, and running it locally through Ollama means a separate host with roughly 5 GB of RAM or VRAM for a 7B-class quantized model, on top of Karakeep's own ~700 MB idle. Full-page archival is off by default for a reason: the docs mark it as leading to much higher disk usage, and it is the difference between kilobytes and megabytes per bookmark.
Who Karakeep is for#
Choose it if
- Someone who saves screenshots, PDFs and images as often as links and wants one searchable pile rather than three tools
- People who want full-text search across the content of saved pages, not just titles and tags
- Anyone with a GPU box already running Ollama who can get automatic tagging without sending anything to a vendor
- Users migrating a large Pocket, Omnivore or Raindrop export who want the article bodies crawled and kept, not just the URLs
Look elsewhere if
- You want one container and one file to back up; that is linkding, and it does the bookmark part just as well
- You are running on 1 GB of RAM, because Meilisearch and Chrome alone will not fit comfortably
- You need a stable API and container layout to build against; it is pre-1.0 and the 0.16 release already merged and removed containers once
What running it actually looks like#
The reference compose is three services: ghcr.io/karakeep-app/karakeep on 3000 with a /data volume, ghcr.io/karakeep-app/karakeep-chrome for crawling, and getmeili/meilisearch for search. You must set NEXTAUTH_SECRET (openssl rand -base64 36), MEILI_MASTER_KEY and NEXTAUTH_URL pointing at the address you actually browse to, or signout and OAuth redirects go to the wrong host. DATA_DIR=/data is required. The first account to sign up is promoted to administrator automatically, so create yours immediately and then set DISABLE_SIGNUPS=true. There is a documented minimal single-container mode that drops Meilisearch (search off), Chrome (no screenshots, JavaScript-heavy sites crawl badly) and inference (no AI tagging). Set DB_WAL_MODE=true unless the database is on a network drive; the docs say there is no reason not to.
Resource profile#
- Memory
- 700 MB idle, around 1300 MB in ordinary use. Three processes: the Next.js app, Meilisearch and a headless Chrome that wakes for every crawl. Local LLM tagging is on top of this and not inside it, and a 7B-class model quantized to 4-bit typically wants around 5 GB of RAM or VRAM on the Ollama host, which is an estimate rather than a documented figure.
- CPU and acceleration
- Crawling is the cost: `CRAWLER_NUM_WORKERS` defaults to 1 deliberately to avoid consuming a lot of resources. A bulk import of 2,000 bookmarks is hours of one-at-a-time Chrome renders. Tesseract OCR on saved images and local inference are the other spikes.
- Storage growth
- Text-only archiving is small. Turning on `CRAWLER_FULL_PAGE_ARCHIVE`, `CRAWLER_FULL_PAGE_SCREENSHOT` or `CRAWLER_STORE_PDF` changes the picture entirely: the docs mark all three as off by default because each leads to much higher disk usage, and a full-page archive plus screenshot plus PDF can be several megabytes per bookmark.
- Operational load
- 3 of 5, Moderate. Three coupled services with a shared secret each, a SQLite database plus a separate search index that has to be reindexed if it is lost, and a project still in 0.x where releases carry container topology changes. Restores have an order and are worth doing once on purpose.
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#
Back up the /data volume: it holds db.db (SQLite) and, unless ASSETS_DIR moved them, every crawled asset, screenshot, archive and PDF. That directory is the whole system of record. The Meilisearch volume is not a backup target in the same sense; it is an index built from the database and can be rebuilt by re-running the search indexing worker, so exclude it if you want a smaller archive and accept a reindex on restore. Stop the container or use sqlite3 .backup for the database rather than copying it live, especially with WAL mode on. Karakeep also has a built-in backup API (trigger, list, download), which is the easiest way to get a consistent export without stopping anything.
Derived backup shape
SQLite backup. sqlite3 <db> ".backup out.db" while running, or stop the container and copy. A live cp of a WAL-mode SQLite file can restore corrupt.
Traps and surprises#
It used to be called Hoarder
The rename happened in 2025, from hoarder-app/hoarder to karakeep-app/karakeep. The migration doc states the old Docker image might not get new updates after the rebranding, so anyone still pulling ghcr.io/hoarder-app/hoarder is quietly frozen. Change the image line in your compose file; the data and the HOARDER_VERSION variable both keep working, and there is a karakeep-linux.sh migrate path for baremetal installs.
Full-page archival and screenshots multiply disk use
CRAWLER_FULL_PAGE_ARCHIVE, CRAWLER_FULL_PAGE_SCREENSHOT and CRAWLER_STORE_PDF all default to false, and the docs say each one leads to much higher disk usage. With all three on, a bookmark can cost several megabytes instead of a few kilobytes, so 5,000 saved pages is tens of gigabytes. Turn them on selectively and check the assets directory size a week later before enabling them retroactively.
Losing the admin password means editing SQLite
There is no CLI password reset for the administrator. The official FAQ tells you to stop Karakeep, open db.db with sqlite3, run an UPDATE user SET password=..., salt='' WHERE email=... with a published bcrypt hash that sets the password to adminadmin, then restart and change it. Set up a second admin account or store the password properly, because the recovery path is genuinely hand-editing the database.
AI tagging needs a provider you have configured
Automatic tagging is skipped entirely unless OPENAI_API_KEY or OLLAMA_BASE_URL is set, and it fails silently in the sense that bookmarks simply arrive untagged. If you point it at Ollama you must also change INFERENCE_TEXT_MODEL and INFERENCE_IMAGE_MODEL away from the OpenAI defaults, pick a vision-capable model for images, and probably raise INFERENCE_JOB_TIMEOUT_SEC from 30 seconds because local inference on CPU will not finish in time.
The 0.16 release changed the container layout
Karakeep 0.16 merged the separate web and workers containers into one and removed the Redis dependency. If you are restoring an old compose file or following a pre-0.16 tutorial you will stand up a topology that is no longer supported: delete the workers service, drop Redis and its volume, move any worker-only environment variables onto the single container. Pin KARAKEEP_VERSION rather than tracking release if surprises like this are unwelcome.
Specifications#
- Category
- Feeds, bookmarks and read-it-later
- Licence
- AGPL-3.0 (Copyleft)
- Written in
- TypeScript / Next.js
- First release
- 2024
- Maturity
- Young
- Datastore
- SQLite for data, Meilisearch for the search index
- Default ports
3000- Ships as
- docker compose, kubernetes, debian/ubuntu install script, arch aur
- arm64 builds
- Yes
- Identity
- Native OIDC. Any OIDC-compliant provider via `OAUTH_WELLKNOWN_URL`, `OAUTH_CLIENT_ID` and `OAUTH_CLIENT_SECRET`, with `DISABLE_PASSWORD_AUTH` and `OAUTH_AUTO_REDIRECT` to make it the only path; the callback is `/api/auth/callback/custom`.
- Replaces
- Raindrop.io, Pocket, Evernote Web Clipper, MyMind
- Project site
- karakeep.app
- Source
- github.com/karakeep-app/karakeep
- Documentation
- docs.karakeep.app
Alternatives to Karakeep#
Everything else in feeds, bookmarks and read-it-later, closest in operational weight first.
| Tool | Ops load | Idle RAM | Licence |
|---|---|---|---|
| Miniflux | 3, Moderate | 40 MB | Apache-2.0 |
| wallabag | 3, Moderate | 180 MB | MIT |
| FreshRSS | 2, Light | 90 MB | AGPL-3.0 |
| linkding | 1, Set and forget | 90 MB | MIT |
Where Karakeep comes up elsewhere#
Head to head
Sources#
Facts on this page were checked against the project's own material. Where a number is our own estimate rather than a published figure, the text says so.
- Hoarder to Karakeep migration, including the image rename
- Environment variables: crawler archival flags, inference, OAuth, DB_WAL_MODE
- Reference docker-compose with web, chrome and meilisearch
- Minimal installation: what you lose without Meilisearch, Chrome and inference
- FAQ: administrator password reset via SQLite
- Legacy container upgrade: 0.16 consolidation and Redis removal
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.