Karakeep — Roadmap

karakeep-app/karakeep  ·  role-played as maintainer  ·  derived from an NKS reasoning graph
current version 0.32.0 8 directions open milestone 0.33.0 (15 open) state re-verified live via gh
Self-hostable "bookmark everything" — save links, notes, images, PDFs; crawl, archive, AI-tag, embed, full-text-index, then search, read & organize across web, mobile, browser extension, CLI and an agent-facing MCP server. Directions are hypotheses (shabda) until the maintainer confirms them.

Next 3 moves

  1. Land the committed 0.33.0 milestone (D8). 15 open / 17 total. Gating items: the maintainer-authored DB-lock fix #2669 (pri/high, size/XL) and chat/semantic-search (#863, #441). Quick wins: PR #2785 and PR #2864 are MERGEABLE/CLEAN today.
  2. Decide the offline-mobile theme (D1). #1077 "Offline cache on Mobile app." has 51 reactions (most-reacted open issue in the repo, full-set of 588) and is in no milestone. Schedule it or mark it deferred openly — don't let it stay silently un-owned.
  3. Give the stability cluster an owner (D5). The pinned memory-leak report #2344 (54 comments) has no PR. It sits on the worker-fleet spine every flow uses.

What this product is today — the verified ground, each line cited

Subsystems (real module boundaries)

Web app (Next.js)apps/web/ — app router, tRPC, NextAuth
Worker fleet (background jobs)apps/workers/workers/; queues.ts (11 queues)
AI / inferenceinference/, embeddingsWorker.ts; INFERENCE_*/EMBEDDING_*/OLLAMA_*
Crawler / archivalcrawlerWorker.ts, videoWorker.ts; CRAWLER_*/BROWSER_*
SearchsearchWorker.ts; Meilisearch; SEARCH_*
Data / persistencepackages/db/schema.ts — Drizzle / SQLite
API surface (tRPC + REST + SDK)packages/trpc/routers/, open-api, sdk; 0.32.0 granular API keys
Mobile app (React Native)apps/mobile/; 0.32.0 mobile revamp
Capture clients (ext + CLI + MCP)apps/browser-extension/, apps/cli/, apps/mcp/src/
Automation (RSS + rules + webhooks)feedWorker.ts, ruleEngineWorker.ts, webhookWorker.ts

Core capabilities

Full-text search (Meilisearch)searchWorker.ts; SEARCH_*
Vector embeddings / auto-indexingembeddingsWorker.ts; EMBEDDING_ENABLE_AUTO_INDEXING
LLM auto-tagginginferenceWorker.ts; INFERENCE_ENABLE_AUTO_TAGGING
LLM summarizationINFERENCE_ENABLE_AUTO_SUMMARIZATION; queues.ts type=summarize
OCR (image text extraction)OCR_*; tesseract.js
Link crawling & metadata fetchcrawlerWorker.ts (link_crawler_queue); CRAWLER_*
Full-page archival (monolith)CRAWLER_FULL_PAGE_ARCHIVE / CRAWLER_MONOLITH_*
Video archival (yt-dlp)videoWorker.ts; CRAWLER_VIDEO_DOWNLOAD
RSS auto-importfeedWorker.ts (feed_queue)
Rule-based automation engineruleEngineWorker.ts (rule_engine_queue)
Outbound webhookswebhookWorker.ts; schema webhooksTable
Bookmark importersimportWorker.ts; schema importSessions
Reader view + reading progressschema userReadingProgress/highlights; 0.32.0 reader
Collaborative & shared listsschema listCollaborators; trpc publicBookmarks.ts
Auth & SSO (NextAuth + OAuth)OAUTH_*; 0.32.0 granular API keys
Public REST API + SDK + API keyspackages/open-api + sdk; 0.32.0
MCP server (agent-facing)apps/mcp/src/; 0.32.0 official skill
CLIapps/cli/; 0.32.0 revamped CLI
Browser extensions (Chrome/FF/Safari)apps/browser-extension/; 0.32.0 Safari + SingleFile
Native mobile apps (iOS/Android)apps/mobile/; 0.32.0 mobile revamp
Bulk actions & multi-language UIREADME bulk/i18n/dark mode; 0.32.0 shortcuts

Domain entities: Bookmark · List · Tag · Highlight · Asset · User & account · RSS feed · Rule · Custom prompt — all in packages/db/schema.ts.

How it works today — one core estafeta, traced over the Bookmark lifecycle

Save bookmark (capture)   user saves link/note/file (web/mobile/extension/CLI/MCP)
                          → Bookmark row created, crawl job enqueued   [trpc bookmarks.create; mcp create-bookmark]
        ↓
Crawl & enrich link       crawler fetches title/description/image/screenshot, optional archive/video
                          → stores Assets → enqueues AI + index jobs   [crawlerWorker.ts / link_crawler_queue]
        ↓
AI tag, summarize & embed inference + embeddings workers call OpenAI/Ollama → attach Tags + summary,
                          produce embedding vector   [inferenceWorker.ts / openai_queue; embeddingsWorker.ts]
        ↓
Index for search          search-indexing writes Meilisearch full-text index; embeddings persist the vector
                          [searchWorker.ts / searching_indexing]
        ↓
Search & retrieve         user/agent queries → full-text Meilisearch search → returns Bookmarks
                          [trpc bookmarks search; mcp search-bookmarks]
        ↓
Read & highlight          user reads in reader view → reading progress persisted → Highlights stored
                          [schema userReadingProgress/highlights]

The whole chain runs on the Worker fleet over the shared SQLite substrate — which is why the stability cluster (D5) sits under every direction.

Directions — in anantara order

D8 — The 0.33.0 release ships committed

Extends cross-cuts all subsystems — a scheduled release slice, not a single capability.
Telos the committed next-release milestone lands.
Karta Lead maintainer (@MohamedBassem, OWNER) — committed.
#Title (verbatim)AuthorState
#2882Add title and favourites button to browser extension@shannonropen
#2817Screenshot previewer does not show scroll bar@Summon528open · fix PR #2864 CLEAN
#2798[bug][ux] Autosaving tags can autoclose the edit window when in the removed tag's feed@NotaInutilisopen
#2752RSS downstream should return full content@wesamjabaliopen
#2694feat: Introduce bookmark "trash" and undo deletion button@esimkowitzopen
#2669bug: removing accounts with large number of bookmarks can lock the database for a long period of time (aka background reaping support)@MohamedBassemopen · pri/high, size/XL · also D5
#2667feat: allow previewing rule engine rules@MohamedBassemopen
#2660feat: Agentic interaction improvements for search and content extraction@MohamedBassemopen · also D2
#2594Links from collaborators are not visible in public lists@karabaysopen · pri/high
#2591[FR] Basic article TTS@zbleskopen
#2502Saving a page that was previously saved fails@Garrett-Ropen
#2172Uncertain origin of alpine chrome image@MemQuopen · pri/high
#1592Share single bookmark to anyone@Draky50110open · 8 reactions
#863Chat about your bookmarks@sherry-ummen-zalandoopen · 15 reactions · also D2
#441[Feature request] Selfhosted semantic search@JojiiOfficialopen · 7 reactions · also D2
Honest scope: telos is "the milestone lands", not "every issue resolved". 15 open + 2 closed = 17 total; several items also drive D2/D5 and progress there. Next: merge PR #2864 (CLEAN); land #2669; decide chat/semantic scope.

D1 — Mobile becomes offline-first ready

Extends Native mobile apps (iOS/Android)apps/mobile/; 0.32.0 mobile revamp.
Telos usable on the phone without a live server — saves queue offline, content caches for offline reading, Android share/save stops dropping items.
Karta Mobile maintainer (@esimkowitz, MEMBER) + contributor community.
#Title (verbatim)AuthorLive engagement
#1077Offline cache on Mobile app.@venci1ty51 reactions / 8 comments — most-reacted open issue in the repo (full-set, 588 open); no milestone
#274Feature Request: Cache Hoards while away from server.@hockeygoalie3520 reactions / 3 comments; no milestone
#2401"Offline" mode for mobile app to store links until it's connected again@alexlucasdev18 reactions / 14 comments; no milestone
#237Mobile app: don't open after hoarding@DominikBritz12 reactions, pri/high; no milestone
#880SSO on android@jakob1379open (shared with D6)
#2781Add swipe actions on mobile apps@jibe-bopen, Backlog milestone

Carrier PRs (mobile polish under the revamp) — all currently CONFLICTING, need a rebase: #2538, #2733, #2306, #2282. Already merged: #2837, #2788, #2794.

Open risks: offline-first needs a conflict/sync design (queued saves vs server state), not yet modeled; four mobile reliability bugs (Android share-menu save, frequent hoard failures, a crash, action-bar whitespace — pri/high) must be fixed before any offline path is trusted.
anantara none — client-side offline queueing does not block on backend work.

D3 — AI tagging becomes provider-flexible and operator-tunable ready

Extends LLM auto-tagginginferenceWorker.ts; INFERENCE_ENABLE_AUTO_TAGGING.
Telos the AI subsystem becomes model-agnostic + operator-controllable — native Anthropic provider, configurable temperature/reasoning, richer custom prompts, an eval harness.
Karta Contributor community + Lead maintainer (@MohamedBassem).
#Title (verbatim)AuthorLive state
#2189Feature Request: Enhanced Prompt Customization for Advanced Tagging Workflows@DaveG7open · 28 reactions / 0 comments
#2612Feature Request: Allow configuring reasoning behavior (e.g. disable reasoning) for LLM calls@dennisvanderpoolopen
#185How to verify hoarder app is working with the local ollama@lihwopen (support question)
PR #2785feat(inference): make it possible to configure llm temp and default to 0@MohamedBassemMERGEABLE/CLEAN — ready
PR #2890feat(inference): add native Anthropic (Claude) provider@johnford2002MERGEABLE, CI UNSTABLE — get CI green
PR #2888Fix headers timeout for AI interference jobs.@eriktewsMERGEABLE, CI UNSTABLE
PR #2876fix(inference): add OpenAI request timeout config@optix2000merged
#2189 (28 reactions) asks to improve custom prompts, which already ship (schema customPrompts; trpc routers/prompts.ts) — a delta on an existing capability, not a new one.
anantara none inbound; D2 is sequenced heuristically after this.

D4 — Crawler becomes resilient on hostile pages ready

Extends Link crawling & metadata fetchcrawlerWorker.ts (link_crawler_queue); CRAWLER_*.
Telos archival becomes dependable on the pages it currently fails — GDPR/cookie walls, Reddit, Twitter/X, content-type detection, image-download failures stop breaking the whole crawl; archive.org fallback.
Karta Contributor community.
#Title (verbatim)AuthorLive state
#414Bypassing cookie and GDPR banner@TurbulenceDeterministeopen · 40 reactions / 63 comments, pri/high, v0.27.0 (never shipped) — top crawler pain
#739Reddit full page archiving.@nicktheoneopen · 15 reactions / 31 comments
#1652[FR] Option to enable archive.org as a middle-man@MelanieTanakaopen · 15 reactions
#1468[Request] Save Twitter/x.com thread@AlejandroAkbalopen · 11 reactions
#329[FR] Support uploading SingleFile `.html` files from local filesystem.@huyzopen · 12 reactions, v0.27.0
#815Failed to determine the content-type for the url@GreenMonitoopen (bug)
PR #2675fix(crawler): strip Twitter/X reply articles before Readability extraction@howwohmmMERGEABLE/CLEAN — ready
PR #2804feat(crawler): add ability to screenshot precrawled archives@MohamedBassemMERGEABLE/CLEAN — ready
PR #2887feat(workers): implement Reddit OAuth client credentials flow to bypass restrictions@kunal-rathore-111MERGEABLE, CI UNSTABLE
PR #2488feat: Add content quality assessment and platform-specific renderers@MohamedBassemDRAFT + CONFLICTING — cannot merge
Open risks: #414 (GDPR, 40 reactions) is the most-reacted crawler item but is unscheduled (never-shipped v0.27.0 milestone) — top pain, no committed fix. Also: full-page archives broken after CSP blocklist; a single image-download failure failing the whole crawl.
anantara none.

D5 — The server becomes stable under load deferred-but-real

Extends Link crawling / Worker fleetapps/workers/workers/, queues.ts (the shared spine).
Telos a self-hosted instance becomes trustworthy on a small box over time — memory growth, CPU spikes, idle-Chromium burn, large-image grid lag, DB locks resolved.
Karta community-requested & maintainer-owned but UNCOMMITTED — no PR carriers yet (the explicit deferred-but-real direction).
#Title (verbatim)AuthorLive engagement
#2344[BUG] Memory leak in 0.30 (with Pangolin) - RAM usage continuously growing over time@nkkfsopen · 54 comments, pinned; no PR — loudest stability signal, unowned
#1748Bug: High memory usage on karakeep worker during large imports (and crawlings in general)@Garrett-Ropen · 15 comments, pri/high, Backlog
#517[Bug] Degraded performance when rendering large images in the bookmarkgrid@Antebiosopen · 22 comments
#2669bug: removing accounts with large number of bookmarks can lock the database for a long period of time (aka background reaping support)@MohamedBassemopen · 0.33.0, pri/high, size/XL — the one committed stability item
#902Loading main page makes server CPU max out@freakshock88open · 16 comments
#674Failed to connect to the browser instance, will retry in 5 secs@snowdreamopen (browser-instance retry loop)
Open risks: the whole direction is risk-carried. The pinned #2344 (54 comments) has no PR — the loudest stability signal is unowned. These sit on the shared spine (see Reading of the field → S1).
anantara none formally; in practice instability undercuts every other direction's runtime.

D6 — Auth re-platforms to better-auth ready

Extends Auth & SSO (NextAuth + OAuth) — config OAUTH_*; 0.32.0 granular API keys.
Telos auth moves off next-auth onto better-auth — configurable OAuth signing, reverse-proxy header auth, consistent SSO across web + Android.
Karta Lead maintainer (@MohamedBassem), contributor-supported.
#Title (verbatim)AuthorLive state
#511[FR] Add support for authentication proxy headers@cyruz-gitopen (icebox)
#880SSO on android@jakob1379open (shared with D1)
PR #2057feat: Migrate from next-auth to better-auth@MohamedBassemCONFLICTING/DIRTY — rebase before merge (large)
PR #2850feat: Add support for configurable ID token signing algorithm in OAuth@CertStoneMERGEABLE, CI UNSTABLE
PR #2546fix: disable password change when password auth is disabled@xingzihaiMERGEABLE/CLEAN — ready
PR #2630fix(browser-extension): API login error when server address includes /api/v1@xingzihaiMERGEABLE/CLEAN — ready
Open question (graph): does the better-auth migration preserve existing OAuth/SSO sessions and password logins? Answer before cutover. Next: rebase #2057 (do not merge while DIRTY); merge the clean fixes #2546 and #2630 now.
anantara none.

D7 — Backup and portability become round-trip ready

Extends Bookmark importersimportWorker.ts; schema importSessions.
Telos the library becomes fully portable — import + export round-trip bookmarks plus list membership and nested structure, so self-hosters back up / migrate without loss.
Karta Contributor community.
#Title (verbatim)AuthorLive state
#75Feature: Import / Export for backup purposes@georgzoelleropen · 14 reactions / 20 comments, pri/high, v0.27.0 (never shipped)
#2214Feature Request: Include Bookmark Lists When Exporting Bookmarks@a21ns1g4tsopen · pri/high
#329[FR] Support uploading SingleFile `.html` files from local filesystem.@huyzopen · 12 reactions, v0.27.0 (shared with D4)
PR #2746fix: Netscape to export nested structures@california-gnatcatcherMERGEABLE/CLEAN — ready
Open question (graph): what must a full export include to be a true round-trip (lists, nesting, assets)? Bookmarks-only export is not a true backup; #75 has sat since v0.27.0 without shipping. Next: merge #2746 (clean); settle export scope.
anantara none.

D2 — Search becomes semantic and conversational sequenced after D3 (heuristic)

Extends Vector embeddings / auto-indexingembeddingsWorker.ts; EMBEDDING_ENABLE_AUTO_INDEXING.
Telos retrieval becomes meaning-based and conversational — the embeddings substrate grows into self-hosted semantic search + chat/RAG over the user's bookmarks.
Karta Lead maintainer (@MohamedBassem) — both flagship asks are in the 0.33.0 milestone.
#Title (verbatim)AuthorLive state
#863Chat about your bookmarks@sherry-ummen-zalandoopen · 15 reactions, milestone 0.33.0
#441[Feature request] Selfhosted semantic search@JojiiOfficialopen · 7 reactions, milestone 0.33.0
#2660feat: Agentic interaction improvements for search and content extraction@MohamedBassemopen · milestone 0.33.0

Carrier PRs (embeddings substrate, shipping): #2857 bookmark embedding support, #2858 embeddings-based relevant tags in LLM context, #2861 AI assistant component prep — all merged (@MohamedBassem).

anantara — HEURISTIC (kalpita, hypothesis, not fact): sequenced after D3. No issue or PR states this dependency; the inference is architectural — chat/RAG reuses the inference-provider layer, so it lands cleaner once AI tagging is provider-flexible. Both can progress in parallel; D3 is not a hard blocker.
Open risks: "self-hosted" semantic search and chat lean on the under-anchored MCP/embeddings spine and the REST/MCP surface — capabilities with no modeled flow (structural risk S1).

Deferred-but-real — high-signal items not yet on a direction deferred-but-real

Two of the repo's top-signal open issues don't cleanly fit any direction above. They are not dropped — explicitly parked so the strongest community signal stays visible.

#Title (verbatim)AuthorLive engagement / where it lands
#1782Support for external databases (like Postgres)@Mrtenz32 reactions / 5 comments — 3rd-most-reacted open issue, milestone Backlog. A SQLite→Postgres re-platform on the Data/persistence substrate under D5; own architectural bet, no carrier PR. Decide before chat/agentic load grows the DB.
#1166Feature request: provide a VNC client to log in user websites on the Hoarder puppeteer instance@nicktheone0 reactions / 39 comments — 3rd-most-commented open issue. An authenticated-crawl / login-wall ask adjacent to D4; candidate to fold into D4's hostile-page scope.

Reading of the field — the methodology view

Driving kartas (who owns each direction)

Maintainer-led & committed: D8 0.33.0, D2 search/chat (0.33.0-milestoned), D6 auth (PR #2057), D5's one committed item #2669 — all Lead maintainer @MohamedBassem.
Contributor-led & needs-review: D3 AI tagging, D4 crawler, D7 backup — carriers split between MERGEABLE/CLEAN and CONFLICTING; several need a rebase.
Mobile-maintainer-led: D1 offline-first (@esimkowitz) + community.
Community-requested & largely UNOWNED: D5 server-stability (pinned leak #2344, 54 comments, no PR); D1's offline-cache theme is community-loud (#1077, 51 reactions) but unscheduled.

The real constraint is @MohamedBassem's finite attention: he already carries D8 + D2 + D6 + the one committed stability fix. D1 has a second owner; D3/D4/D7 are contributor-carried and need review bandwidth, not authoring.

Structural risks (from the graph's own tensions lens)

S1 — Five shipped capabilities have no producing/consuming flow ("dead-recipe"). OCR, RSS auto-import, outbound webhooks, the public REST API + SDK, and the agent-facing MCP server are marked as shipped but no modeled flow exercises them. This matters because four of the eight directions lean on exactly this under-anchored spine: D2 (chat/semantic) on MCP + embeddings; D8's agentic item (#2660) and chat (#863) on the REST/MCP surface; the RSS-full-content ask (#2752) on the webhook/RSS corner. Either Step 2 under-modeled these (seed the missing flows) or they are genuinely passive surfaces — worth knowing before building chat/agentic on top of MCP/REST.
Core-spine backlog risks with structural weight (they sit on the estafeta every flow passes through): #2344 memory leak (54 comments, pinned) degrades the Worker fleet; #2669 DB lock sits on the SQLite substrate (the only committed stability item, 0.33.0); #902 / #674 CPU/idle-Chromium exhaustion make the box unusable regardless of feature work. These drive D5.

Figure-on-ground map (each direction → the capability it consumes)

DirectionExtends (shipped capability)Primitive
D1 Mobile offline-firstNative mobile apps (iOS/Android)apps/mobile/
D2 Search semantic & conversationalVector embeddings / auto-indexingembeddingsWorker.ts
D3 AI tagging provider-flexibleLLM auto-tagginginferenceWorker.ts
D4 Crawler resilient on hostile pagesLink crawling & metadata fetchcrawlerWorker.ts
D5 Server stable under loadLink crawling / Worker fleet (shared spine)apps/workers/workers/, queues.ts
D6 Auth re-platforms to better-authAuth & SSO (NextAuth + OAuth)config OAUTH_*
D7 Backup & portability round-tripBookmark importersimportWorker.ts
D8 0.33.0 release shipscross-cuts all subsystems — a release slicemilestone 0.33.0

Every direction transforms something that already exists — none is a free-floating wish. The two whose ground is under-anchored (D2 on MCP/embeddings; any chat/agentic work on REST/MCP) are flagged by S1 — the one place where building forward outruns the modeled product.