Tech Digest

Feeds

Karakeep

Bookmark-everything app (formerly Hoarder) with LLM tagging and full-text search

FeedsAGPL-3.0Youngarm64 buildsNative OIDC
Last reviewed Profile maintained against the project's own documentation
Operational load
3 / 5
Moderate
Idle memory
700 MB
typical use ~1300 MB
Moving parts
3
containers in a normal deployment
Backup shape
SQLite backup
needs a dump or a stop

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.

ToolOps loadIdle RAMLicence
Miniflux3, Moderate40 MBApache-2.0
wallabag3, Moderate180 MBMIT
FreshRSS2, Light90 MBAGPL-3.0
linkding1, Set and forget90 MBMIT

Where Karakeep comes up elsewhere#

Sources#

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