Karakeep — Product Roadmap

karakeep-app/karakeep (prev. Hoarder) · a self-hosted "bookmark-everything" app — save links/notes/images, auto-archive, AI-tag & summarize, full-text + semantic search, read.
v0.32.0current ship · released 2026-05-08 · live state re-verified 2026-06-27

Figure-on-ground roadmap: a verified product model (vartamana ground) under an issue/PR-derived backlog (shabda), assembled into the transformations the project is actually under. Directions are hypotheses until the maintainer confirms them. mergeable=null / UNSTABLE treated as unknown — never "clean."

Next 3 moves

  1. Ship the 0.33.0 cut (D6). Milestone is live at 15 open / 2 closed — the two mobile issues (#2777, #2779) already closed since harvest. The committed maintainer core remains: #2660 agentic search, #2667 rule preview, #2694 trash/undo, #2669 DB-lock fix — the gating spine.
  2. Land the scale-hardening foundation (D4) — it gates D1 and D5. Root-cause the memory leak (#2344, 54 comments — most-commented open bug in this harvest; 2nd overall behind the #414 cookie-wall FR) and the DB-lock-on-delete (#2669, committed). Note: the one carrier PR #2625 "split docker builders" is a drive-by (kapdon, NONE) and conflicting — rebase needed; hardening is maintainer-owned via the issues, not that PR.
  3. Decide on the #1 community demand: offline mobile (D2). #1077 "Offline cache on Mobile app" is the single most-reacted open issue (51 reactions, status/approved) but has no committed PR — real demand, currently unowned. Commit it or say "not yet" explicitly.

What this product is today (the verified ground)

Karakeep is a worker-pipeline product: a save enqueues async jobs (crawl → AI-enrich → index) that turn a bare URL into archived, tagged, searchable content. Each line is cited to a real primitive.

Subsystems

SubsystemCited primitive
📦 Ingestion / Crawlerapps/workers/workers/crawlerWorker.ts; CRAWLER_* env
📦 AI / Inferenceapps/workers/workers/inference/, embeddingsWorker.ts; OPENAI_*/OLLAMA_*/INFERENCE_*/EMBEDDING_*/OCR_* env
📦 SearchsearchWorker.ts; packages/shared/search; README (Meilisearch)
📦 Reader / Web UIapps/web/app/*; Next.js app router, tRPC
📦 Content Managementpackages/trpc/routers/{lists,tags,highlights,rules,feeds}.ts; ruleEngineWorker.ts, feedWorker.ts, importWorker.ts
📦 Integrations / Clientsapps/{cli,mcp,browser-extension,mobile}; packages/{sdk,open-api}; webhookWorker.ts
📦 Platform / Storage & Authpackages/db/schema.ts; NextAuth; apiKeys router; backupWorker.ts; DATA_DIR/ASSET_STORE_S3_* env

Core capabilities

CapabilitySubsystemCited primitive
⚙️ Headless-browser crawlingCrawlercrawlerWorker.ts; CRAWLER_HEADLESS_BROWSER/STORE_SCREENSHOT/STORE_PDF
⚙️ Full-page archival (monolith)CrawlerCRAWLER_FULL_PAGE_ARCHIVE/MONOLITH_* env; README
⚙️ Video archiving (yt-dlp)CrawlervideoWorker.ts; CRAWLER_VIDEO_DOWNLOAD env
⚙️ Client-side crawl (SingleFile)Crawlerrelease 0.32.0 (#2197); apps/browser-extension
⚙️ AI auto-taggingAI/Inferenceinference/tagging.ts; INFERENCE_ENABLE_AUTO_TAGGING
⚙️ AI summarizationAI/Inferenceinference/summarize.ts; INFERENCE_ENABLE_AUTO_SUMMARIZATION
⚙️ Embeddings generationAI/InferenceembeddingsWorker.ts; EMBEDDING_TEXT_MODEL/DIMENSIONS
⚙️ OCR text extractionAI/InferenceOCR_LANGS/OCR_USE_LLM env; tesseract.js
⚙️ Full-text search (Meilisearch)SearchsearchWorker.ts; packages/shared/search
⚙️ Rule-engine automationContent MgmtruleEngineWorker.ts; routers/rules.ts; 0.32.0 (#2547)
⚙️ RSS feed auto-hoardingContent MgmtfeedWorker.ts; rssFeedsTable
⚙️ Bookmark importersContent MgmtimportWorker.ts; 0.32.0 (#2495 OneTab, #2690 Readwise)
⚙️ Reader viewReader/Web UIapps/web/app/reader/[bookmarkId]; 0.32.0 (#2527/#2691/#2696)
⚙️ REST API + SDK + OpenAPIIntegrationspackages/open-api/karakeep-openapi-spec.json; packages/sdk
⚙️ CLI + MCP + agentic skillIntegrationsrelease 0.32.0 (CLI revamp, agentic skill, MCP #2717)
⚙️ Browser extensions + mobile appsIntegrationsapps/browser-extension, apps/mobile; 0.32.0 Safari (#10), mobile revamp (#2685)
⚙️ WebhooksIntegrationswebhookWorker.ts; WEBHOOK_* env
⚙️ Granular-scope API keysPlatformrelease 0.32.0; routers/apiKeys.ts
⚙️ Auth + SSO + self-hostingPlatformNextAuth; OAUTH_*, ASSET_STORE_S3_* env; README

How it works today (one core estafeta, end-to-end)

The product's spine is a 5-step relay — a save fans out into async worker jobs and ends at the reader. Each step consumes(ahara) / produces(utpatti) a typed phenomenon:

🔄 Save bookmark [End user] ─produces→ Bookmark │ routers/bookmarks.ts createBookmark (enqueue LinkCrawler / OpenAI / Embeddings) ▼ 🔄 Crawl & archive [Worker fleet] Bookmark → Archived content / Asset │ crawlerWorker.ts · upadhi: Headless-browser crawling, Full-page archival ▼ 🔄 AI-enrich (tag & summ.) [Worker fleet] Asset → Tag │ inference/inferenceWorker.ts (runTagging, runSummarization) ▼ 🔄 Index for search [Worker fleet] Tag → Searchable index state │ searchWorker.ts (runSearchIndexing) · upadhi: Meilisearch, Embeddings ▼ 🔄 Search & read [End user] Index → (read) apps/web/app/dashboard/search · reader/[bookmarkId] · upadhi: Reader view

The core spine is structurally clean (0 relay-gaps, 0 no-actor kriyas, 0 lifecycle gaps). The structural risk is at the edges of this spine — see Reading of the field.

The directions (anantara order)

D4 Hardens for scale ──┬─→ D1 AI conversational ──┐ ├─→ D5 Storage pluggable ├─→ D6 0.33.0 release lands └──────────────────────────→┘ D2 Mobile offline ─────────────────────────────────→ D6 (milestone evidence) D3 Crawling resilient (independent, ready now)

Ready now: D2, D3, D4. Sequenced after a prerequisite: D1 (after D4), D5 (after D4), D6 (after D1+D2+D4). Dependency evidence marked evidenced (milestone) or heuristic (architectural inference — a hypothesis).

D4 — Karakeep hardens for scale ready now critical-path foundation

Capability extended — Platform/Storage (#825) + AI/Inference (#820), cross-capability; risk vimarshas vimarsha_of the subsystems.
Telos — instance stops degrading under load: memory leak root-caused, large imports/deletes no longer lock the DB or peg CPU, inference jobs stop failing.
Driving karta — 👤 Maintainer (MohamedBassem), graph-wired via the committed issues. Correction: carrier PR #2625 is authored by kapdon (NONE), a drive-by & conflicting — not maintainer-authored. Ownership rides on issues #2669 / #2885.
anga — worker memory (#1748), 0.30 memory leak (#2344), chromium idle CPU (#2369), DB lock on delete (#2669), CPU max (#902), inference stuck/400/failed (#1953/#2852/#424).
Drivers
Open risks — diffuse, no single kriya owns the scale problems (structural risk S3). Budget standing capacity work, not a discrete ticket.
Unblocks — D1 (inference reliability) and D5 (Postgres after DB-lock root-cause).
Actions — work the maintainer issues #2669/#2344; rebase/reauthor #2625 before merge (cannot merge as-is).

D3 — Crawling becomes resilient to anti-bot & site-specific breakage ready now

Capability extended — Headless-browser crawling (#838) & Full-page archival (#839); driving kriyas upadhi/context, Reddit kriya specifies.
Telos — archival stops silently failing on hostile/special sites (Reddit/Substack/X, cookie walls) via stealth backends, OAuth flows, site-specific scrapers — "save anything" true again.
Driving karta — 👤 Contributor community, graph-wired (scraper/stealth PR kriyas actor → #829). Contributor-led & needs-review.
anga — Reddit blocked (#2885), CSP-broken archives (#1977), 1.32 GB asset (#770), screenshot scrollbar (#2817), Substack 403 (#1133), browser retry loop (#674), content-type (#815).
Drivers
Actionsreview #2675 (clean) & #2887 (wait on CI); #2849 is a draft — request ready; rebase #2626/#2525 before review.

D2 — Mobile becomes offline-capable & first-class ready now top demand, partly unowned

Capability extended — Browser extensions + mobile apps (#853); offline phenomenon specifies → #853, fixes context to Integrations subsystem.
Telos — mobile stops being an online-only thin client: offline cache/queue, share-sheet, swipe, web parity.
Driving karta — split. Mobile bug-fix PR kriyas graph-wired to 👤 Contributor community (actor → #829). The headline offline feature is community-requested & unowned (no PR) — flagged deferred-but-real.
anga — unreliable mobile hoarding (#513), Android crash (#2596), reader-toolbar inset (#2802), iOS Edge share sheet (#1753).
Drivers
Open risks — the strongest community theme (offline, ~89 combined reactions across #1077/#2401/#274) has no committed work.
Actions — offline-cache needs a product decision (commit or defer), not a merge. Mobile-fix PRs feed the bug-fix anga; review per-PR readiness.

D1 — AI becomes a conversational, agentic layer over the hoard after D4

Capability extended — AI summarization (#843), Embeddings (#844), Meilisearch search (#846); driving kriyas upadhi.
Telos — AI stops being a passive auto-tagger and becomes an active retrieval + conversation layer: semantic search, chat-with-bookmarks, richer custom tagging prompts.
Driving karta — 👤 Maintainer (MohamedBassem), graph-wired (agentic-search & AI-assistant kriyas actor → #828). Maintainer-led & committed (#2660 → 0.33.0).
anga — agentic search (#2660), agentic slicing (PR #2820), AI-assistant prep (merged), embeddings substrate (merged #2857/#2858/#2860), Ollama question (#185).
Drivers
Open risks — the agentic/MCP surface this builds on is a bare release fact with no producing flow (structural risk S2). Inference reliability (D4) must land first.
DependencyD1 after D4, epistemic kalpita (HEURISTIC): architectural inference, not a maintainer statement — a hypothesis.
Actions — #2660 is committed work, proceed. #2820 is a draft & conflicting — cannot merge; needs rebase + ready. #2189 (28 reactions) has no PR — decide scoping.

D5 — Storage & deployment become pluggable after D4 · deferred-but-real

Capability extended — Auth + SSO + self-hosting (#856); Postgres kriya upadhi → #856, phenomenon specifies → #856.
Telos — Karakeep stops being locked to bundled SQLite + fixed deploy: external Postgres backend and flexible deployment (Render blueprint, explicit hostname/config).
Driving karta — 👤 Contributor community, graph-wired (actor → #829). Community-requested, contributor-led, deferred (driving PR conflicting & drive-by).
anga — Postgres backend (PR #2825), explicit HOSTNAME (PR #2498), Render blueprint (PR #2910), OAuth ID-token algo (PR #2850); password-change risk (#784), OAuth-login question (#898).
Drivers
Open risks — Postgres touches the same storage layer D4 is hardening; doing it first risks compounding the scale pain.
DependencyD5 after D4, epistemic kalpita (HEURISTIC): best approached once DB-lock pains are root-caused; also gated by the conflicting PR. A hypothesis.
Actions#2825 conflicting — rebase before review, do not merge. #2910/#2850 mergeable-but-CI-red — wait on green CI. #1782 is the demand; no committed maintainer plan yet.

D6 — The 0.33.0 release lands after D1 + D2 + D4 · committed cut

Capability extended — cross-cutting; carrier kriyas reach Rule-engine automation (#847) & Content Management. Most of the surface lives in D1/D2/D4.
Telos — the maintainer's scheduled 0.33.0 set moves from open to released as one coherent cut. Gathers the committed remainder; does NOT claim "every issue resolved" — most issues below remain open.
Driving karta — 👤 Maintainer (MohamedBassem), graph-wired (rule-preview & trash/undo carrier kriyas actor → #828). Maintainer-led & committed.
DependencyD6 after D1/D2/D4, epistemic anumita (EVIDENCED) by milestone membership. Not inferred.
0.33.0 milestone — ALL 15 OPEN issues (live: 15 open / 2 closed)
#title (verbatim)authorassocmaps to
2882Add title and favourites button to browser extensionshannonrNONED2 / clients
2817Screenshot previewer does not show scroll barSummon528CONTRIBUTORD3 (risk)
2798[bug][ux] Autosaving tags can autoclose the edit window when in the removed tag's feedNotaInutilisNONED6 (risk)
2752RSS downstream should return full contentwesamjabaliNONERSS (dark branch S1)
2694feat: Introduce bookmark "trash" and undo deletion buttonesimkowitzCOLLABORATORD6
2669bug: removing accounts … can lock the database … (background reaping support)MohamedBassemCOLLABORATORD4
2667feat: allow previewing rule engine rulesMohamedBassemCOLLABORATORD6
2660feat: Agentic interaction improvements for search and content extractionMohamedBassemCOLLABORATORD1
2594Links from collaborators are not visible in public listskarabaysNONED6 (risk)
2591[FR] Basic article TTSzbleskNONEreader (D2/web)
2502Saving a page that was previously saved failsGarrett-RNONED6 (risk)
2172Uncertain origin of alpine chrome imageMemQuNONED6 (risk)
1592Share single bookmark to anyoneDraky50110NONED6 / content
863Chat about your bookmarkssherry-ummen-zalandoNONED1
441[Feature request] Selfhosted semantic searchJojiiOfficialNONED1

Closed since harvest (now done): #2779 "Mobile app - Layout optimizations" (jostrasser, NONE); #2777 "Mobile app lacks sort controls available on web" (Ben-Jian, NONE). Gating subset: #2660, #2667, #2694, #2669 (maintainer/collaborator-authored, committed). The remaining 11 open issues stay in the milestone.

Backlog milestone — ALL 12 OPEN issues (live: 12 open / 7 closed · enumerated in full, NOT sampled)
#title (verbatim)authorassocmaps to
2781Add swipe actions on mobile appsjibe-bNONED2
1977BUG: Full page archives no longer render correctly after the CSP blocklistdvshenryNONED3 (risk)
1953Bug: … inference status in the backend remains unprocessedmapleshadowNONED4 (inference)
1939Detect products on all sitesflexagoonNONEcapture plugins (deferred)
1913Add button to edit notesdaviddavisNONED2 / web
1800Allow to create pretty URLs for public lists and their RSSlandureNONEcontent / sharing
1782Support for external databases (like Postgres)MrtenzNONED5
1773Allow for rules to be run manually in Rule Enginekausar007NONED6 / content
1748Bug: High memory usage on karakeep worker during large imports (and crawlings in general)Garrett-RNONED4 (risk)
1667Bug: Add timeouts for the image download to avoid failing the entire crawling …FmstratNONED3 / D4
1611[FR] Preflight checks on inference / browser service health before … background jobspdc1NONED4
1581List sorting inconsistent in "dropdown"enkelmediaNONED6 / web (risk)

Closed since harvest, no longer open Backlog: #1666, #1404, #1863, #1905, #1865, #1969, #1669.

Reading of the field (methodology view)

The part a flat ticket list cannot produce — the graph's read of who drives the work, what structural gaps it computed, and how each direction grounds on a real capability.

Driving kartas (graph-wired, not labeled)

KartaLayerDrivesWiring
👤 Maintainer (MohamedBassem)dev-driverD1, D4, D6 (committed)actor → agentic-search, AI-assistant, rule-preview, trash/undo kriyas; owned via 0.33.0 issues. D4's carrier PR #2625 is a drive-by — ownership via issues.
👤 Contributor communitydev-driverD2 fixes, D3, D5 (needs-review)actor → scraper/stealth/Postgres/mobile-fix PR kriyas
👤 Worker fleetruntimeCrawl / AI-enrich / Index core flowsruntime actor only — distinct from backlog drivers
👤 End user (data hoarder)runtimeSave + Search&readruntime actor only

Offline-mobile (D2) and Postgres (D5) are the two top-demand themes with no maintainer commitment — unowned/deferred. A solo-maintainer roadmap is a map of finite attention; making that explicit is the point.

Structural risks (the graph's own tensions lens — not from any single issue)

S1 — A third of the shipped capability surface is "dark" (unwired to any flow)

Six vollzug capabilities have no upadhi from any flow: Video archiving, OCR, RSS auto-hoarding, Bookmark importers, REST API+SDK, Webhooks. The modeled core spine only applies crawl/AI/search — so bugs in those branches (RSS full-content #2752, image-download timeout #1667, list-sorting #1581) have no lifecycle to reason about. The directions cluster on the crawl→AI→search spine and under-serve the secondary ingestion/output branches. Either model a 2nd estafeta (RSS → import → archive → export) or declare those out-of-spine.

S2 — The agentic-skill surface (D1's substrate) has no producing flow

⚙️ CLI + MCP + agentic skill is a bare 0.32 release fact referenced as upadhi but produced by no flow. If the conversational layer (D1) is to be first-class, this capability needs a producing estafeta — otherwise "agentic Karakeep" stays bolted to the side.

S3 — Performance risks anchor to holons, not to a flow → no estafeta to fix along

The D4 risk cluster (#1748, #2344, #2369, #2669, #902) all carry vimarsha_of to the Platform/AI subsystems, not a single kriya — cross-cutting with no flow owner. This is why D4 is the critical-path foundation, and why it should be standing capacity work, not a discrete ticket.

All other structural detectors clean: 0 leaked estafetas, 0 relay gaps, 0 no-actor kriyas, 0 lifecycle gaps, 0 deadlocks, 0 mode conflicts. (Excluded as modeling artifacts: shipped-state facts #841 client-side crawl & #855 granular API keys legitimately have no producing flow.)

Figure-on-ground map (each direction → the capability it extends, via the graph)

DirectionGround capability extendedGraph link
D1 AI conversationalAI summarization (#843), Embeddings (#844), Meilisearch (#846)driving kriyas → upadhi
D2 Mobile offlineBrowser extensions + mobile apps (#853)offline phenomenon specifies; fixes context
D3 Crawling resilientHeadless-browser crawling (#838), Full-page archival (#839)driving kriyas upadhi/context; Reddit kriya specifies
D4 Hardens for scalePlatform/Storage (#825) + AI/Inference (#820) (cross-capability)risks vimarsha_of subsystems
D5 Storage pluggableAuth + SSO + self-hosting (#856)Postgres kriya upadhi; phenomenon specifies
D6 0.33.0 releaseRule-engine automation (#847) + Content Mgmtcarrier kriyas upadhi/context

Signal audit (is anything high-signal silently dropped?)

Query basis: all 588 open issues (PRs excluded), issues?state=open paginated via REST; reaction_count = reactions.total_count, comments = comments; author_association per-number. Raw, full-set figures — rankings computed over the complete open-issue set, not the capped subset.

Top reacted OPEN issues (full-set ranking)

Rank#titleauthor (assoc)reactionsdisposition
11077Offline cache on Mobile app.venci1ty (NONE)51D2 — included (unowned, flagged)
2414Bypassing cookie and GDPR bannerTurbulenceDeterministe (NONE)40D3 — included
31782Support for external databases (like Postgres)Mrtenz (NONE)32D5 — included (deferred)
42189Enhanced Prompt Customization for Advanced Tagging WorkflowsDaveG7 (NONE)28D1 — included (folded, no PR)
5274Cache Hoards while away from server.hockeygoalie35 (NONE)20D2 — included
62401"Offline" mode for mobile app …alexlucasdev (NONE)18D2 — included
7705"Remind me of this" featurearcb01 (NONE)16out-of-scope — reminders, no modeled capability (deferred)
8739Reddit full page archiving.nicktheone (NONE)15D3 — included
9295[Feature request] Allow Epub generation from multiple bookmarkswinston0410 (NONE)15out-of-scope — export, dark branch S1 (deferred)
10863Chat about your bookmarkssherry-ummen-zalando (NONE)15D1 — included (0.33.0)
111652[FR] Option to enable archive.org as a middle-manMelanieTanaka (NONE)15D3-adjacent — archival fallback (deferred, untriaged)
1275Feature: Import / Export for backup purposesgeorgzoeller (NONE)14out-of-scope — import/export, dark branch S1 (deferred)
13329[FR] Support uploading SingleFile .html files from local filesystemhuyz (NONE)12D3-adjacent — ingestion (deferred)
14237Mobile app: don't open after hoardingDominikBritz (NONE)12D2 — included (mobile UX)
15836PDF Highlighting FeatureDavidMoffatt-web (NONE)11out-of-scope — reader feature (deferred)

Top commented OPEN issues (full-set ranking)

Rank#titleauthor (assoc)commentsdisposition
1414Bypassing cookie and GDPR bannerTurbulenceDeterministe (NONE)63D3 — included
22344Memory leak in 0.30 … RAM growingnkkfs (NONE)54D4 — included (top driver)
31166provide a VNC client to log in user websites on the puppeteer instancemaelp (CONTRIBUTOR)39out-of-scopestatus/icebox (deferred upstream)
4739Reddit full page archiving.nicktheone (NONE)31D3 — included
5674Failed to connect to the browser instance, will retry in 5 secssnowdream (NONE)24D3 — included (risk)
6517Degraded performance when rendering large images in the bookmarkgridAntebios (NONE)22D4-adjacent — perf (deferred, S3 theme)
775Import / Export for backup purposesgeorgzoeller (NONE)20out-of-scope — dark branch S1 (deferred)
8185How to verify hoarder app is working with the local ollamalihw (NONE)20D1 — included (Ollama samshaya)
9424inference job failedhujh818 (NONE)19D4 — included (risk)
10902Loading main page makes server CPU max outfreakshock88 (NONE)16D4 — included (driver)
11511[FR] Add support for authentication proxy headerscyruz-git (NONE)15D5-adjacent — auth (deferred, icebox)
121748High memory usage on karakeep worker during large importsGarrett-R (NONE)15D4 — included (Backlog)
132401"Offline" mode for mobile app …alexlucasdev (NONE)14D2 — included
14815Failed to determine the content-type for the urlGreenMonito (NONE)14D3 — included (content-type samshaya)
15978Link Banners Not Loadinglmalmoreno (NONE)14out-of-scopequestion, unreproduced (deferred)

Survival check: the top-3 reacted (#1077, #414, #1782) and top-3 commented (#414, #2344, #1166) all appear above with an explicit disposition. The only top-ranked items not pulled into a direction are out-of-scope by capability (#705 reminders, #295/#75 export, #836 PDF-highlight, #1166 VNC/icebox, #978 unreproduced) — each marked deferred/out-of-scope, none silently dropped. The export/import cluster (#75, #295) corroborates structural risk S1.

Generated by the repo-roadmap skill · realm github-skill-test · focus holon 📦 Karakeep (#818) · 6 bianhua (#1002–#1007). Live item state re-verified 2026-06-27 via gh; mergeable=null / UNSTABLE treated as unknown, never "clean." Directions are hypotheses (shabda) until the maintainer confirms them.