Karakeep — Maintainer Roadmap

karakeep-app/karakeep · self-hostable "bookmark everything" — hoard links, notes & files; auto-crawl, AI-tag, full-text index, search & read.
shipped v0.32.0 · 2026-05-08 next: 0.33.0 milestone · 15 open generated 2026-06-27 · live state re-verified

Next 3 moves

  1. Ship the 0.33.0 slice (D5). 15 issues committed in the milestone (all status/approved except #441). Start with the four maintainer-authored high-priority ones: #2669 (DB-lock-on-delete, pri/high size/XL), #2660 (agentic extraction), #2694 (trash/undo), #2667 (rule preview).
  2. Review + merge the clean community PRs — MERGEABLE right now, no rebase: #2887 (Reddit OAuth, fixes pinned #2885), #2890 (Anthropic provider), #2785 (LLM temperature), #2771 (Ollama timeout), #2804 (screenshot precrawled), #2675 (strip X replies), #2864 (scrollbar → closes #2817).
  3. Decide the two big substrate PRs before they rot. #2825 (Postgres, +7627/−1416) and #2684 (tagging evals) are CONFLICTING — rebase before merge, not review. #2488 (platform renderers) is DRAFT + CONFLICTING — un-draft + rebase. Resolve RFC #2849 (Firefox stealth) to adopt/reject.
Substrate already landed: three maintainer carrier-PRs merged since harvest — #2857 (bookmark embeddings), #2861 (AI-assistant prep), #2858 (embeddings-relevant tags into LLM context). The semantic-search and chat arcs (D1, D2) are in flight, not speculative.

What this product is today

Figure on ground: every direction below transforms a capability that already ships. Current version v0.32.0 (gh release tag, 2026-05-08). Each line is cited to a real primitive — module path, config flag, db table, or release tag.

SubsystemCited primitive
Crawler / archivalapps/workers/workers/crawlerWorker.ts; config CRAWLER_*
AI inference (tag + summarize)inference/; shared/inference.ts; config OPENAI_* / OLLAMA_* / INFERENCE_*
Search & indexingsearchWorker.ts, embeddingsWorker.ts; search.ts, vectorStore.ts, searchQueryParser.ts
Organization (lists, tags, rules, highlights)trpc/routers/{lists,tags,rules,highlights}.ts; db bookmarkLists(manual|smart), ruleEngineRulesTable
Capture surfaces (web, ext, mobile, CLI, MCP, API)apps/{web,browser-extension,mobile,cli,mcp}; packages/{api,sdk,open-api}; zBookmarkSourceSchema
Ingestion & sync (RSS, importers, webhooks){feedWorker,importWorker,webhookWorker}.ts; db rssFeedsTable, importSessions, webhooksTable
Media processing (OCR, video, assets){assetPreprocessingWorker,videoWorker}.ts; config OCR_* / CRAWLER_VIDEO_* / MAX_ASSET_SIZE_MB
Auth, accounts & admintrpc/routers/{users,admin,apiKeys,invites,subscriptions}.ts; config OAUTH_* / DISABLE_SIGNUPS
Storage & backupspackages/db/{schema.ts,migrate.ts,drizzle}; backupWorker.ts; config DATA_DIR
Core capabilities (each cited)
Automatic link crawl & metadatacrawlerWorker.ts; metascraper
Full-page archival (link-rot) — config CRAWLER_FULL_PAGE_ARCHIVE
SSRF-hardened crawlingCRAWLER_IP_VALIDATION_*; v0.32.0
LLM auto-tagging & summarizationshared/inference.ts
Full-text searchsearch.ts; searchQueryParser.ts
Smart (saved-search) lists — db bookmarkLists.smart (L489)
Rule engineruleEngineWorker.ts; v0.32.0 (#2547)
List collaboration — db listCollaborators (L539)
Highlightshighlights.ts; db (L338)
OCR from images — config OCR_*; tesseract.js
Auto video archivingvideoWorker.ts; yt-dlp
RSS auto-hoardingfeedWorker.ts; db rssFeedsTable
Bookmark importersimportWorker.ts; v0.32.0 (#2495,#2690)
Browser-bookmark sync — floccus (README)
Outbound webhookswebhookWorker.ts; WEBHOOK_*
Browser extensionsapps/browser-extension/; v0.32.0 (#2197)
Mobile apps (iOS/Android)apps/mobile/; v0.32.0 revamp
CLIapps/cli/; v0.32.0 revamp
MCP server (agent tools)apps/mcp/src/; v0.32.0 (#2717)
REST API + SDKpackages/{api,sdk,open-api}
Scoped API keysapiKeys.ts; v0.32.0
SSO / OIDC — config OAUTH_*
BackupsbackupWorker.ts; db backupsTable (L694)
Bulk actions & shortcutsapps/web/; v0.32.0
Core entities (db schema.ts): Bookmark (L188) · Link (L252) · Asset (L298) · Tag (L421) · List manual/smart (L489) · Highlight (L338) · User (L32) · scoped API key (L165) · RSS feed (L618) · Rule (L728) · Webhook (L646) · Import session (L854) · Embedding vector.

How it works today — one estafeta, end to end

The product's spine: the relay one bookmark travels from capture to read-back. Traced over the core-flow kriyas in the graph (Capture → Crawl → AI-enrich → Index → {Search&read, Organize}).

  1. Capture — a URL, note, or file enters as a Bookmark row tagged with its source (web/extension/mobile/CLI/MCP/API). trpc/routers/bookmarks.ts · zBookmarkSourceSchema
  2. Crawl & archive — for a link, fetch page + metadata, optional screenshot / full-page archive / video → a Link record + Assets. crawlerWorker.ts · videoWorker.ts
  3. AI-enrich — crawled content → LLM → auto Tags + summary; status → success. inference/inferenceWorker.ts · shared/inference.ts
  4. Index for search — enriched bookmark → Meilisearch document and an Embedding vector. searchWorker.ts · embeddingsWorker.ts · vectorStore.ts
  5. Search & read — indexed library → full-text query → reader view + Highlights (the outlet). In parallel, Organize files it into Lists and runs Rules. search.ts · apps/web reader · highlights.ts · ruleEngineWorker.ts
  6. Alternate inlet — Ingest — RSS entries & import files become Bookmarks that re-enter at step 2 (Crawl). feedWorker.ts · importWorker.ts · importSessions.ts

D1 grows steps 4–5 (index/search) · D2 grows step 3 (enrich) · D3 hardens step 2 (crawl) · D4 hardens the storage every step writes to.

Directions

Five directions in dependency order. No hard inter-direction block exists — every arc is independently ready. D5 is the committed near-term slice that cross-cuts D1–D4; it does not require the full arcs to finish.

D5 (0.33.0 ships) COMMITTED — the immediate near-term slice; no prerequisite direction
D1, D2, D3, D4 READY — four independent subsystem arcs, partly delivered by D5

D5 · The 0.33.0 release ships COMMITTED

Extends: cross-subsystem — the committed next-release milestone over the whole product (shipped v0.32.00.33.0). The single most actionable block.
Telos: all 15 open 0.33.0 milestone issues close. Live milestone state re-verified: 15 open / 2 closed, all status/approved except #441.
Every open 0.33.0 issue (verbatim — all 15, none cherry-picked)
#Title (verbatim)Author / assocPri
#2669bug: removing accounts with large number of bookmarks can lock the database for a long period of time (aka background reaping support)MohamedBassem / COLLABORATORhigh · XL
#2660feat: Agentic interaction improvements for search and content extractionMohamedBassem / COLLABORATORmedium
#2694feat: Introduce bookmark "trash" and undo deletion buttonesimkowitz / COLLABORATORmedium
#2667feat: allow previewing rule engine rulesMohamedBassem / COLLABORATORlow
#2594Links from collaborators are not visible in public listskarabays / NONEhigh
#2172Uncertain origin of alpine chrome imageMemQu / NONEhigh
#2882Add title and favourites button to browser extensionshannonr / NONEmedium
#2817Screenshot previewer does not show scroll barSummon528 / CONTRIBUTORmedium
#2798[bug][ux] Autosaving tags can autoclose the edit window when in the removed tag's feedNotaInutilis / NONEmedium
#2752RSS downstream should return full contentwesamjabali / NONEmedium
#2591[FR] Basic article TTSzblesk / NONEmedium
#2502Saving a page that was previously saved failsGarrett-R / NONEmedium
#863Chat about your bookmarkssherry-ummen-zalando / NONEmedium
#1592Share single bookmark to anyoneDraky50110 / NONElow
#441[Feature request] Selfhosted semantic searchJojiiOfficial / NONEunlabeled
Next actions (state-precise, re-verified)
Completeness: shipping 0.33.0 means all 15 close, not only the subset highlighted. Several map onto D1–D4: semantic search #441 → D1, agentic #2660 → D1, chat #863 → D2, supply-chain chrome #2172 → D3, DB-lock #2669 → D4.
Anantara: none. Deliberate honest call — D5 is the immediate commitment; making it depend on the full completion of D1–D4 would invert the truth (the milestone ships a slice drawn from the arcs, which continue after 0.33.0).

D1 · Search becomes semantic and agent-shaped READY

Extends (figure on ground): Search & indexing (searchWorker.ts/search.ts) — today's full-text search + the per-bookmark Embedding vector (vectorStore.ts).
Telos: full-text search grows into embedding-based semantic similarity and an agent-shaped retrieval surface (matched content slices / byte offsets, not whole documents).
Drivers
Open risks: D1 has no driving risk/question — carried by committed feature work + the merged substrate, not open inquiry. Flagged honestly.
Anantara / next: the embeddings substrate (#2857) is already mergedready now; build #441 + #2660 on the merged column. Unblocks: the chat assistant in D2 and the agentic MCP retrieval surface.

D2 · AI enrichment becomes conversational and customizable READY

Extends (figure on ground): AI inference (inference/, shared/inference.ts) — today's LLM auto-tagging & summarization, background-only.
Telos: background-only enrichment becomes a surface users converse with (chat) and control (custom prompts, configurable provider/model/temperature), on a broader provider set.
Drivers
Open risks: raw <think> tags leaking (#2894); text-item inference stuck at unprocessed (#1953); highest-reacted issue #2189 rides context, risk of under-weighting.
Anantara / next: none. Parallel-with-D1 is a heuristic (kalpita) read, hedged — no maintainer statement makes either a prerequisite of the other. Review + merge the three MERGEABLE PRs (#2785 #2890 #2771); rebase #2684; build chat (#863) on the merged scaffold. Unblocks: richer agent tools over the MCP server.

D3 · Crawler becomes anti-bot resilient READY

Extends (figure on ground): Crawler / archival (crawlerWorker.ts) — today's link crawl & metadata, full-page archival, SSRF-hardened crawling — one generic path repeatedly broken by anti-bot defenses.
Telos: the generic path that breaks on Reddit / X → reliably fetches them via platform-specific renderers, survives failing images / CSP changes, rests on a pinned/trusted chrome image.
Drivers
Open risks: Reddit blocked (#2885, pinned), uncertain chrome-image origin (#2172), chrome 500 host-header (#2576), CSP-broken archives (#1977), no image-download timeout (#1667).
Anantara / next: none — independent, ready now. Pinned #2885 has a MERGEABLE community fix #2887review + merge the contributor PR, not "blocked." #2488 is DRAFT + CONFLICTING → un-draft + rebase. Resolve RFC #2849. Unblocks: reliable archival for the whole pipeline.

D4 · Storage becomes durable at scale READY

Extends (figure on ground): Storage & backups (packages/db/schema.ts, Drizzle) — today SQLite-only, with an unbounded-memory worker and DB-locking deletes.
Telos: SQLite-only + memory-leaking worker + DB-locking deletes → an optional external Postgres backend, bounded memory under big imports/crawls, and background-reaped large deletions that don't lock the DB.
Drivers
Open risks: the unbounded memory leak (#2344, pinned), large-import memory (#1748), DB-lock-on-delete (#2669) — these resource risks are independent of Postgres (they bite SQLite too).
Anantara / next: none — independent, ready now. Postgres (#1782) is in flight via the conflicting PR #2825 → "next, after rebase," not blocked. The huge size + conflict make rebase the gate; memory/DB-lock risks proceed in parallel. Unblocks: larger self-host & multi-instance deployments.