Karakeep

Productivity

A bookmark-everything app with AI-powered tagging and full-text search, formerly Hoarder.

Latest v0.33.1 · by KarakeepWebsitekarakeep-app/karakeep

Release activity

Release activity — 10 releases across 10 days since Sep 13, 2025. Each cell is one day; darker means more releases that day. Nothing is recorded before Sep 13, 2025. Older weeks are hidden at this screen width.
MayJunJulAug
SundayNo releases on Apr 26, 2026No releases on May 3, 2026No releases on May 10, 2026No releases on May 17, 2026No releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026
MondayNo releases on Apr 27, 2026No releases on May 4, 2026No releases on May 11, 2026No releases on May 18, 2026No releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026
TuesdayNo releases on Apr 28, 2026No releases on May 5, 2026No releases on May 12, 2026No releases on May 19, 2026No releases on May 26, 2026No releases on Jun 2, 2026No releases on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 2026No releases on Aug 4, 2026No releases on Aug 11, 2026
WednesdayNo releases on Apr 29, 2026No releases on May 6, 2026No releases on May 13, 2026No releases on May 20, 2026No releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 2026No releases on Jul 29, 2026No releases on Aug 5, 2026
ThursdayNo releases on Apr 30, 2026No releases on May 7, 2026No releases on May 14, 2026No releases on May 21, 2026No releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 2026No releases on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 2026No releases on Aug 6, 2026
FridayNo releases on May 1, 20261 release on May 8, 2026No releases on May 15, 2026No releases on May 22, 2026No releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 2026No releases on Jul 17, 2026No releases on Jul 24, 2026No releases on Jul 31, 2026No releases on Aug 7, 2026
SaturdayNo releases on May 2, 2026No releases on May 9, 2026No releases on May 16, 2026No releases on May 23, 2026No releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 20261 release on Aug 1, 2026No releases on Aug 8, 2026

10 releases since Sep 13, 2025

Changelog

v0.33.1

0.33.1

Added 12
  • Semantic search mode using embeddings to find bookmarks by meaning instead of exact keywords
  • Hybrid search mode that combines full text and semantic search results
  • Readable content API endpoint to retrieve bookmark article content as markdown or plain text
  • Offline reading on mobile app with ability to save articles for offline viewing
  • Recent cache on mobile that persists bookmark lists, tags, and highlights for 7 days of offline access
  • New compact list layout for mobile app bookmarks
Changed 6
  • Default mobile app layout changed from card layout to compact list layout
  • Default OpenAI model changed from gpt-4.1-mini to gpt-5.6-luna
  • Re-saving an existing bookmark now un-archives it and bumps it to the top of the list instead of showing already exists message
  • Bookmark previews now assess article quality for Reader View and default to page-overview panel for non-article content
  • Crawled page metadata extraction now uses pre-flight HTTP request results for faster metadata appearance
  • Mobile app bookmark management sheet now includes favourite, archive, share and highlights actions instead of just delete

0.33.1

Welcome to the 0.33 release of Karakeep! The headline of this release is semantic search. Karakeep can now generate embeddings for your bookmarks, letting you search by meaning instead of exact keywords (and making auto-tagging noticeably more consistent along the way). The mobile app gets offline reading, so you can save articles to your device and read them on a plane, along with new layouts, sorting, and one-tap clipboard saving. Cookie and GDPR consents should be something of the past with this release (finally). Plus a big batch of crawler, security and performance fixes.

Thanks to everyone who contributed to this release: @esimkowitz, @joestump, @zerone0x, @ElectricTea, @optix2000, @thiswillbeyourgithub, @jcgoodwin86, @InventorB, @VrtxOmega, @pike00, @KayMi, @TanishValesha, @mahirhir, @moduvoice, @eviaaaaa, @archit-goyal, @CertStone, and everyone who shipped code, triaged bugs, or shared feedback.

Note: the changes mentioned here for the extension and mobile releases will need to go through the different store (apple, google, mozilla) reviews. So it might take a couple of days until all of them are released.

If you enjoy using Karakeep, consider supporting the project here ☕️ or via GitHub here. Also share Karakeep's managed offering (☁️ link) with your friends who're not into selfhosting.

New Features 🚀

  • Semantic Search (#2959, #2960) - Search is no longer limited to exact keyword matching. There are now three search modes, switchable from a dropdown in the search bar:
    • Full text - the existing keyword search (still the default).
    • Semantic [Experimental] - pure meaning-based search powered by embeddings. Searching for "how to make coffee" will find your espresso bookmarks even if they never use those words.
    • Hybrid [Experimental] - fuses the results of both.
    • The new mode is also available in the API, MCP and CLI which is going to be the most useful with agents.
    • Semantic search is still new and experimental, so results might not be super accurate yet, but it's a start.
    • ⚠️ Semantic search requires embeddings to be enabled, read the upgrade notes for details about how to enable them.
  • Smarter auto-tagging using embeddings (#2858) - When tagging a new bookmark, Karakeep now looks up semantically similar bookmarks and feeds their existing tags into the LLM prompt as suggestions. The result is a lot less tag sprawl (no more k8s, kubernetes and Kubernetes all coexisting). This also requires embeddings to be enabled, read the upgrade notes for details about how them.
  • Cleaner saved pages (#2973): the crawler now detects common consent dialogs (cookies and GDPR) and automatically opts out before capturing the article, screenshot and PDF.
  • Offline reading on mobile (#2957) - The mobile app can now work without a connection:
    • Save articles for offline: from a bookmark's "…" menu, pick Make available offline. The full article is downloaded and kept on device until you remove it.
    • Recent cache: everything you browse (bookmark lists, tags, lists, highlights) is now persisted for 7 days, so recently visited screens still open when you're offline.
  • Mobile app improvements:
    • New layouts (#2837): switch between the existing card layout and a new compact list layout. Note: the default is now the list layout.
    • Sorting (#2777): sort your bookmarks newest-first or oldest-first (overdue, sorry!).
    • Save from clipboard (#2868): a new Clipboard entry in the "+" menu saves whatever is in your clipboard in one tap. Thanks @InventorB!
    • The manage bookmark sheet now has favourite, archive, share and highlights actions instead of just delete.
  • Karakeep for agentic usage - continuing where 0.32 left off:
    • MCP server went from 8 to 29 tools. Newly added: full list CRUD, full tag CRUD, highlights, delete-bookmark, and get-asset. Big thanks to @joestump for the list/tag CRUD work (#2917)!
    • New readable content API (#2660): GET /api/v1/bookmarks/{bookmarkId}/content returns a bookmark's article content as markdown or plain text, cursor-paginated in LLM-friendly chunks that snap to paragraph boundaries.
  • Much faster bookmark metadata (#2932): Karakeep's pre-flight http request to the website can now contribute to its metadata extraction. This results into some metadata (e.g. title) appearing much faster. A new CRAWLER_PREFLIGHT_USER_AGENT option lets you set a user agent for that probe request, and let's just say that a good user agent makes a huge difference.
  • The default OpenAI model has changed from gpt-4.1-mini to gpt-5.6-luna which is half as cheap, though a bit slower given that it's a reasoning model.

UX Improvements ✨

  • Re-saving an existing bookmark now actually does something (#2962) - Saving a link you've saved before used to just tell you "Bookmark already exists" and do nothing. Now it re-saves it: the bookmark is un-archived and bumped back to the top of your list.
  • Smarter bookmark previews (#2975) - Newly crawled pages are now assessed for how well they work in Reader View. Articles continue to open in the clean reader, while homepages, search results, product pages and other non-article content default to a screenshot or a new page-overview panel instead of showing a poor text extraction. You can still switch among the overview, Reader View, screenshot, PDF and archived page from the preview selector.
  • Bulk edit is now one hover away: instead of first switching bulk edit on from the toolbar, a selection circle appears directly on a bookmark card when you hover it. Selecting one card puts you into bulk edit mode for the rest.
  • The sidebar is now wider on large screens, and its scrollbar only appears when you hover it instead of sitting there permanently.
  • Mobile polish: a proper loading state while an article is still being crawled, better reader contrast in dark mode, a rebuilt login screen with much clearer connection errors, faster Manage Tags page on large libraries (server-side search instead of loading every tag), iPad/tablet reader toolbar and FAB fixes by @esimkowitz (#2788, #2793, #2794), and a bunch of redundant success toasts removed.
  • Karakeep is now installable as a PWA in Chrome again, allowing you to use karakeep on your desktop as if it's one of the apps.
  • New Instagram renderer (#2836): Instagram posts and reels now render as the actual embedded post in the bookmark preview, joining the existing YouTube, X, TikTok and Amazon renderers.

Fixes 🐛

  • Security fixes:
    • Fixed a DNS rebinding / TOCTOU hole in the crawler's SSRF protection (#2945). Reported by @celinke97 (GHSA-vc53-r298-c6h6).
    • API key and signed asset token verification now use timing-safe comparisons, reported by @xancyber (GHSA-hjm9-gc55-5hgv).
    • Bookmark URLs are now restricted to http/https on create and update. Reported by @therawdev and @shukla304 (GHSA-6mfw-xrw2-h5x3).
    • Legacy bookmarks with unsafe schemes are filtered out of RSS feeds and Netscape HTML exports, and the exported URLs are HTML-escaped. Reported by @karen93shieh and @MuxiLyuLucy (GHSA-4vx2-9j8p-jg8v).
    • Tag names are now HTML-escaped in Netscape bookmark exports, preventing a crafted or AI-generated tag from breaking out of the TAGS attribute when the export is opened in a browser.
    • User-supplied names (user names, list names, inviter names) are HTML-escaped in outgoing emails, fixing HTML injection in the list invitation email. Reported by @therawdev and @shukla304 (GHSA-pvj2-rgwm-r7f8).
    • Password logins are now rate limited (10 attempts per 15 minutes per IP + email). Note that this requires RATE_LIMITING_ENABLED=true.
    • Closed account-enumeration side channels in login and password reset.
  • Much faster bookmark deletion (#2669): added the missing indexes that should make deletions less IO intensive for large libraries.
  • Old completed import sessions are now archived after 30 days: their summary counts are kept, but the per-bookmark staging rows are deleted, which keeps the DB from growing unboundedly after big imports.
  • YouTube/video downloads work again - yt-dlp now uses the bundled node as its JS runtime, by @pike00 (#2805).
  • Fixed BROWSER_WEB_URL failing to resolve on IPv6-only Docker networks by @VrtxOmega (#2863).
  • Fixed the X/Twitter renderer, which broke after the API changed its response shape.
  • Inline images in SingleFile archives are no longer clobbered by the lazy-load normalization, by @zerone0x (#2928).
  • Banner/preview image extraction now works for SingleFile and precrawled archives that inline the image as a data URI.
  • Fixed summarization producing garbled output for users running with INFERENCE_OUTPUT_SCHEMA=json, by @eviaaaaa (#2926).
  • New OPENAI_TIMEOUT_SEC option to control the per-request inference timeout, useful for slow self-hosted providers, by @optix2000 (#2876).
  • Hardened the tagging prompt: tags are now capped to 1–3 words, and Karakeep explicitly returns no tags for error pages, Cloudflare/CAPTCHA interstitials, cookie banners and login walls - so no more just a moment or cloudflare tags on failed crawls.
  • Fixed the MCP get-bookmark-content tool crashing on bookmarks that haven't been crawled yet, by @joestump (#2915).
  • Fixed scrolling in the bookmark preview's screenshot view by @VrtxOmega (#2864).
  • The browser extension now requests host permissions at runtime for client-side crawling (#2784), instead of asking for them up front.
  • Added missing Japanese translations by @mahirhir (#2903) and filled in the missing Korean translation keys by @moduvoice (#2938).
  • PDF previews now render via <embed> so they display in Safari, by @KayMi (#2806).
  • Import progress is now tracked per import job (#2950), so running two imports at once no longer makes their progress bars fight each other. Thanks @jcgoodwin86!

For Developers 🛠️

  • Docker healthchecks now respect a custom PORT by @zerone0x (#2948).
  • OAuth providers can now use a configurable ID token signing algorithm via OAUTH_ID_TOKEN_SIGNED_RESPONSE_ALG, by @CertStone (#2850).

Community Projects 💡

Checkout our community projects page here.

  • wdoc: A RAG-powered document/knowledge querying tool with Karakeep support, by @thiswillbeyourgithub (#2904)

Screenshots 📸

Offline Reading
New Mobile List Layouts

Please don't judge my saved content

Upgrading 📦

To upgrade:

  • If you're using KARAKEEP_VERSION=release, run docker compose pull && docker compose up -d.
  • If you're pinning it to a specific version, upgrade the version and then run docker compose pull && docker compose up -d.
Enabling Embeddings
  1. Karakeep's embedding uses your existing meilisearch installation as the default vector store. If you're an OG, and running an old meilisearch version, you'll need to ensure you're on meilisearch version (1.13 or higher). Check this guide for info on how to update.
  2. If you're using the default OpenAI based configuration, auto embeddings of new bookmarks will be enabled automatically and will use the text-embedding-3-small model.
  3. If you're using a custom provider, you'll need to pass in the EMBEDDING_TEXT_MODEL=<your_mode>, the size of the dimension of the model via EMBEDDING_DIMENSIONS and then pass EMBEDDING_ENABLE_AUTO_INDEXING=true to enable embeddings. Check out our docs for example models and configurations.

Once you've enabled embeddings, you'll need to regenerate embeddings for all existing bookmarks. Head to the admin panel's Background Jobs page (new "Embeddings" card) and regenerate embeddings for all/pending bookmarks. This might take a while depending on how many bookmarks you have, and will cost you money (though embeddings are usually pretty cheap).

NOTE: Changing the model or its dimension after embedding even a single bookmark will require you to regenerate embeddings for all bookmarks.

All Commits

  • fix(tagging): loosen the captcha rejection in the prompt a bit - @MohamedBassem in 8550eb09
  • fix(workers): wait for autoconsent in parallel with page load - @MohamedBassem in 98c52b85
  • fix(tests): fix failing test after changing default model - @MohamedBassem in f249307b
  • feat: change default inference model to gpt-5.6-luna - @MohamedBassem in 1bc351a7
  • fix: enable auto embedding by default for default inference configuration (#2976) - @MohamedBassem in bcbb5776
  • fix: enable auto embedding by default for default inference configurations - @MohamedBassem in 7722c6ae
  • deps: upgrade docusaurus - @MohamedBassem in ccddfcf3
  • feat: Add support for configurable ID token signing algorithm in OAuth (#2850) - @CertStone in b2b2579b
  • feat(landing): 28k starts - @MohamedBassem in 385ec1df
  • feat: add new article quality assessment (#2975) - @MohamedBassem in 76b477c4
  • fix: make queue registration idempotent - @MohamedBassem in 6f120133
  • i18n: some translation fixes - @MohamedBassem in 3b7982c1
  • i18n: Sync weblate translations - Hosted Weblate in 590c6700
  • feat(web): some UX improvements in signin and password forms - @MohamedBassem in b4b94740
  • feat(workers): auto-dismiss consent dialogs with autoconsent (#2973) - @MohamedBassem in c333f240
  • deps: upgrade nextjs to 16.2.12 - @MohamedBassem in 11488896
  • fix(workers): fix workers in dev mode - @MohamedBassem in 3a0421d0
  • deps: bump a bunch of deps - @MohamedBassem in a90034d1
  • i18n: Sync weblate translations - Hosted Weblate in 8b4b9170
  • docs: hide the chat flags for now - @MohamedBassem in 36c36e3e
  • fix(auth): close account enumeration oracles in login and password reset - @MohamedBassem in 036da4c0
  • fix(mobile): don't silently swallow mutations fired while offline - @MohamedBassem in 9188958c
  • fix(plugins): don't cache a rejected init promise in the meilisearch providers - @MohamedBassem in 64ec6cbc
  • fix(export): escape tag names in the netscape bookmark export - @MohamedBassem in f0381b42
  • feat: add support for resaving already existing bookmarks (#2962) - @MohamedBassem in f2f6431d
  • feat(web): move keyboard shortcuts inside the profile options menu - @MohamedBassem in a6987247
  • fix(web): fix preview screenshot scrolling (#2864) - @VrtxOmega in 595392a9
  • feat(web): allow triggering bulk edit on hover - @MohamedBassem in 28a48ec5
  • fix(workers): denoise the log messages coming from the feedWorker - @MohamedBassem in d155fa0e
  • fix(ux): make the sidebar wider on larger screens - @MohamedBassem in f417b900
  • feat: make it possible to trigger admin jobs for a certain duration - @MohamedBassem in 0a1821ba
  • release(mobile): release mobile v1.10.0-1 - @MohamedBassem in 369f5a68
  • fix(mobile): improve reader contrast in dark mode - @MohamedBassem in c007bc76
  • feat(mobile): add semantic search mode selector - @MohamedBassem in 8175539e
  • feat(mobile): show offline storage usage - @MohamedBassem in ec810158
  • release(mobile): release mobile v1.10.0 - @MohamedBassem in 3a6f2822
  • feat(web): add semantic search to the UI (#2960) - @MohamedBassem in 2f740d00
  • feat: add semantic search (#2959) - @MohamedBassem in 71ea4d9b
  • feat(mcp): more MCP tools - @MohamedBassem in 8de38d48
  • feat(cli): expose assets and readable conent in the CLI - @MohamedBassem in a2968718
  • feat(api): add an api for fetching readable content of a bookmark. #2660 - @MohamedBassem in f3911139
  • feat(mcp): add ability to fetch assets via signed URLs - @MohamedBassem in 06d99bd6
  • fix(mobile): better error message in the login page - @MohamedBassem in e88a606c
  • fix(mobile): fix formsheet colors - @MohamedBassem in b8fe26ad
  • feat(mobile): offline reading (#2957) - @MohamedBassem in 2075c33a
  • feat(mobile): minor cleanups to the login page - @MohamedBassem in 9b1b2b73
  • fix(mobile): add a loading indicator to article content - @MohamedBassem in 198ea1e5
  • readme: drop heavy dev notice now that it's stable enough - @MohamedBassem in bc506307
  • ci: fix failing trpc test - @MohamedBassem in bf2749e8
  • fix: add timeSafe checks for signed tokens and api keys - @MohamedBassem in e8a138f1
  • fix: drop redundant db indicies - @MohamedBassem in 7ced044b
  • feat: archive old completed sessions - @MohamedBassem in 1717af84
  • fix: upgrade some packages - @MohamedBassem in f0d254d0
  • fix: respect PORT in Docker healthchecks (#2948) - @zerone0x in 7d703b8b
  • fix: track import progress per-job (#2950) - @jcgoodwin86 in 4224da4f
  • feat: prep for sub tier overrides - @MohamedBassem in 5e5692f7
  • feat: add chat configuration and persistence schema - @MohamedBassem in 28cb149d
  • refactor(web): replace AI Elements message components with shadcn chat components - @MohamedBassem in 4423da19
  • [mobile] Upgrade mobile app to Expo SDK 56 (#2946) - @MohamedBassem in 08fd866b
  • fix: rename root package to @karakeep/root. fixes #2939 - @MohamedBassem in 7ff5a46f
  • [network] fix dns rebinding problems post internal hostname validation (#2945) - @MohamedBassem in 978544df
  • fix: add missing indicies needed for bookmark deletion. #2669 - @MohamedBassem in eb1f4727
  • i18n: fill missing Korean (ko) translation keys (#2938) - @moduvoice in 7b19b0da
  • fix(mobile): propagate error message in sharing screen - @MohamedBassem in 1b7b2477
  • revert: remove --headless=new flag from default chrome docker compose (#2936) - @MohamedBassem in 4af8bb2f
  • release(mcp): Bump mcp server to 0.32.1 - @MohamedBassem in aa78aa8f
  • feat(mcp): add list CRUD, tag CRUD, delete-bookmark (#2917) - @joestump in 831d6bf5
  • refactor: split crawler file into separate modules (#2933) - @MohamedBassem in b2c52c9c
  • feat: add extra metadata parse in the probe fetch (#2932) - @MohamedBassem in 84399288
  • fix(crawler): preserve inline GIF data images (#2928) - @zerone0x in 28d321ce
  • feat: add a script to adhocly test the crawler + improve chrome flags (#2929) - @MohamedBassem in 5b0d7fe6
  • fix(inference): only set JSON response_format for schema requests (#2926) - @eviaaaaa in 545e6f80
  • fix: fix banner extraction of singlefile archives - @MohamedBassem in ba6adfce
  • fix: ratelimit password login attempts - @MohamedBassem in f7d04297
  • fix: sanitize input url and list names - @MohamedBassem in ffd10589
  • feat: tagging prompt hardening - @MohamedBassem in 9ceb077c
  • fix(mcp): coerce null htmlContent before turndown in get-bookmark-content (#2915) - @joestump in 1ebf5b08
  • [codex] Document browser extension dev port (#2918) - @archit-goyal in fc1c127d
  • fix: forget password workflow - @MohamedBassem in c3d60280
  • feat(stripe): add a trpc command for force syncing customer detail - @MohamedBassem in a787ee47
  • fix(billing): pick the latest active subscription when user has multiple subs - @MohamedBassem in 9bcac9cc
  • ci: disable plugin tests - @MohamedBassem in 43425e1d
  • chore: drop jemalloc support - @MohamedBassem in e862bf3b
  • fix(restate): lower inactivity timeouts on dispatchers (#2911) - @MohamedBassem in ac51b359
  • feat(i18n): add missing Japanese (ja) translations (keyboard shortcuts, admin embeddings) (#2903) - @mahirhir in 475483e3
  • docs(community): add wdoc to community projects (#2904) - @thiswillbeyourgithub in c93cbc2a
  • feat(landing): 26k stars. Take 2 - @MohamedBassem in 9879eb5d
  • docker: fix monolith build in docker - @MohamedBassem in 05c4e04a
  • feat(landing): 26k stars - @MohamedBassem in 3afe675a
  • fix(inference): add OpenAI request timeout config (#2876) - @optix2000 in c0ac8a47
  • feat(mobile): easy clipboard saving (#2868) - @InventorB in 207016e8
  • fix(workers): Fix BROWSER_WEB_URL IPv6 host resolution (#2863) - @VrtxOmega in cf1964ff
  • chore: AI assistant component prep (#2861) - @MohamedBassem in 76cbbf39
  • fix(api): make metrics registration idempotent - @MohamedBassem in 4ae50c52
  • fix: fast track tagging after embedding generation (#2860) - @MohamedBassem in 63694167
  • feat: add embeddings-based potentially relevant tags to LLM context d… (#2858) - @MohamedBassem in 2fbd77bd
  • feat: add bookmark embedding support (#2857) - @MohamedBassem in 84ab354d
  • deps: upgrade meilisearch client package - @MohamedBassem in af3677a1
  • feat(cli): add --description flag to bookmarks update command (#2856) - @TanishValesha in 8463ad07
  • fix: fix twitter renderer - @MohamedBassem in dc268202
  • fix: fix plugin and stats registration in nextjs across reloads - @MohamedBassem in a043c889
  • fix(workers): fix misleading error message when rss import fails to create bookmark. fixes #2838 - @MohamedBassem in 9651c79c
  • release(mobile): release mobile v1.9.5-2 - @MohamedBassem in 78e012f2
  • fix(mobile): fix taglist skeleton - @MohamedBassem in 8d9a0154
  • release(mobile): release mobile v1.9.5-1 - @MohamedBassem in a031d433
  • fix(mobile): remove redundant toasts in the bookmarks info page - @MohamedBassem in 4e677c55
  • fix(mobile): change default layout to be list layout - @MohamedBassem in 5332ca33
  • fix(mobile): add bookmark grid settings to favs and archive pages - @MohamedBassem in c2720375
  • release(mobile): release mobile v1.9.5 - @MohamedBassem in 5d292292
  • feat(mobile): add mobile sorting support. fixes #2777 - @MohamedBassem in d5ea3f5a
  • fix(mobile): fix the padding of the tag pills - @MohamedBassem in 0fe7d706
  • feat(mobile): add different mobile layouts to the mobile app (#2837) - @MohamedBassem in bc29d61d
  • feat(mobile): change tag colors - @MohamedBassem in 633016c7
  • feat(mobile): add archive,fav,share and highlights to info page - @MohamedBassem in c32b7f99
  • refactor(mobile): use a composite component for the bookmark card - @MohamedBassem in 77c6523c
  • feat: instagram renderer (#2836) - @MohamedBassem in 3c1a0201
  • fix(web): fix PWA installaiblity in chrome - @MohamedBassem in 95555f1f
  • fix(web): fix alignment of keyboard button in global actions - @MohamedBassem in 0893e512
  • fix(web): change sidebar collapse toggle to chevrons - @MohamedBassem in e6756e05
  • fix(mobile): remove unncessary toast from manage list actions on mobile - @MohamedBassem in 199d0327
  • fix(docker): set yt-dlp to use bundled node as JS runtime (#2805) - @pike00 in e92f2f02
  • fix(web): render PDFs via so Safari can display them (#2806) - @KayMi in ff288613
  • chore: upgrade to pnpm 11 (#2833) - @MohamedBassem in 8f199631
  • build: stop update old personal docker images - @MohamedBassem in d10effa2
  • chore: pin github action deps (#2832) - @MohamedBassem in 341f7217
  • chore: Add seed snapshot generator (#2829) - @MohamedBassem in 53da5e2b
  • deps: upgrade nextjs to 16 (#2827) - @MohamedBassem in ff57d9c2
  • chore: improve AGENTS.md (#2826) - @ElectricTea in b45d41cc
  • fix: fix error on admin user list due to react query hydration (#2824) - @MohamedBassem in 1997bd38
  • chore: add a .ignore file to filter out noisy dirs from search - @MohamedBassem in 37b37124
  • docs: update SECURITY.md - @MohamedBassem in 4b22229d
  • deps: upgrade nextjs to 15.5.18 - @MohamedBassem in f8237243
  • fix: serve unoptimized nextjs images - @MohamedBassem in 61a2bdeb
  • release(mobile): release mobile v1.9.4 - @MohamedBassem in 01d636f2
  • fix(mobile): improve perf of manage_tags page - @MohamedBassem in 84dfea5e
  • fix(mobile): fix color of list separator in recent searches list - @MohamedBassem in d426cdb2
  • fix(mobile): fix formsheet padding in manage_lists, manage_tags and info sheets - @MohamedBassem in 41633c2a
  • feat(mobile): tablet/iPad UI polish for toolbar and FAB (#2788) - @esimkowitz in d871f57b
  • fix(mobile): stack Upload Image Quality slider on two lines (#2794) - @esimkowitz in 75b6e910
  • fix(mobile): fix insets on new iOS settings formSheet modal (#2793) - @esimkowitz in 7ce940a5
  • docs: update screenshots in the docs - @MohamedBassem in 66a7ac48
  • release(extension): Release version 1.2.11 - @MohamedBassem in f638064e
  • feat(browser-extension): request host permission at runtime for client side crawling (#2784) - @MohamedBassem in 1a7a2fef
  • docs: minor docs update to mention the skills and the new singlefile integration - @MohamedBassem in 1c7872ce
  • release(cli): release CLI 0.32.0 - @MohamedBassem in ad9ef514
  • release: release cli, sdk, mobile and extension - @MohamedBassem in 58f9b302
  • release(docs): release the 0.32 docs - @MohamedBassem in d28ff5fd
View originalPermalink
How v0.33.1 went
v0.32.0

0.32.0

Added 18
  • Safari extension is now available on the App Store
  • Mobile app screens, headers and action buttons redesigned to feel more native
  • Customizable reader toolbar on mobile
  • Ability to keep screen on for bookmark reading on mobile
  • Opening links in reader view now opens them in an in-app browser
  • Ability to default open links in external browser
Changed 3
  • CLI got major improvements to manage more aspects of bookmarks, lists, and tags with more AI friendly formatting
  • Timestamps across the app are now correctly localized instead of showing the server's timezone
  • Default new list emoji changed from 🚀 to 📁

Welcome to the 0.32.0 release of Karakeep! The mobile app is getting a major redesign by @esimkowitz so that it feels more native and friendly to use. Our long-overdue Safari extension is now available on the app store. Karakeep is now more AI-agents friendly with an official skill, revamped and more powerful CLI, granular API keys (and more coming in the next release). SingleFile is now integrated inside the karakeep extension itself for better crawling of authenticated pages. Keyboard shortcuts for faster actions across the app. And tons of fixes!

This release has a huge list of contributors. Some frequent faces, and many contributing their first PRs. Thanks @esimkowitz, @Mxrk, @beluga73, @Ahmed-Abdel-karim, @GSAlex, @cinconueves, @keslerm, @xingzihai, @howwohmm, @vbalko-claimate, @MaximePinot, @apo-mak, @NikhilChowdhury27, @maxim-mityutko, @xuatz, @ir31k0, @Joly0, @larsborn, @venku122, @lmgarret, @hoilc, @zerone0x, @mrInvincible29, @Go2Engle, @faximan.

Note: the changes mentioned here for the extension and mobile releases will need to go through the different store (apple, google, mozilla) reviews. So it might take a couple of days until all of them are released.

If you enjoy using Karakeep, consider supporting the project here ☕️ or via GitHub here. Also share Karakeep's managed offering (☁️ link) to your friends who're not into selfhosting. We're offering yearly subscriptions now.

New Features 🚀

  • Karakeep's Safari extension is now available on the App Store (link), closing Karakeep's oldest open issue (#10).
  • Huge mobile app revamp lead by @esimkowitz:
    • More native screens, headers and action buttons by @esimkowitz (#2685)
    • Customizable reader toolbar by @esimkowitz (#2527)
    • Add ability to keep screen on for bookmark reading by @esimkowitz (#2691)
    • Opening links in the reader view now opens them in an in-app browser so that you can quickly go back to where you left by @esimkowitz (#2696)
    • Add ability to default open links in external browser by @xingzihai (#2516)
  • Karakeep for Agentic usage: Our goal is to make Karakeep very AI agents friendly. This will allow agents (OpenClaw, Hermes, etc) to find and hoard interesting content on your behalf, provide weekly digests, and more.
    • We're publishing an official skill for karakeep on ClawHub and skills.sh (details here). Those skills teach the agent karakeep's concepts and how to use the CLI.
    • CLI improvements:
      • The CLI also got major improvements allowing it to manage more aspects for bookmarks, lists, and tags. Also got more AI friendly formatting, etc.
      • To avoid having to pass the address and API key with every request, karakeep can now store the auth config in a file and use it for further requests. Init that file with karakeep auth init.
    • If you're afraid to give agents full Read/Write access to your data, API keys now have granular scopes to all resources. Which means you can give agents access to your bookmarks but not administrative actions (like deleting users), etc.
  • Keyboard Shortcuts: You can now do more with the keyboard, as we added support for navigating the bookmark grid with keyboard shortcuts, and taking actions such as favouring/archiving and doing bulk actions. This is the beginning, and please send feature requests for the extra features you need.
  • Extension improvements:
    • [Experimental] The extension can now crawl bookmarks from the client-side eliminating the need of using the SingleFile extension separately from Karakeep (Powered by SingleFile core). This allows you to store pages that are behind authentication or unreachable from your Karakeep server. It's currently opt-in until stable, and then will become the default. Enable it from the extension settings (#2197).
    • Added support for manual save (instead of the default save on open) by @keslerm (#2693)
  • More import sources:
    • Add support for importing from OneTab by @apo-mak (#2495)
    • Add support for importing from Readwise Reader by @cinconueves (#2690)
  • Others:
    • Karakeep MCP now has an update-bookmark tool by @vbalko-claimate (#2717)
    • Add support for writing rule engine rules based on bookmark source by @xingzihai (#2547)
    • Add support for configuring OpenAI reasoning effort by @cinconueves (#2718)
    • New extensive event logging for events that happen all over the app. More info about how to enable it here.

UX Improvements ✨

  • Visual revamp for the bookmark preview page with nicer colors and ability to collapse the sidebar (f500129c).
  • Visual revamp for the "All lists" page showing list privacy settings and number of items in each list (145dda9d).
  • List and tags page headers now show more info about the content and type of the list/tag (#2749)
  • Quickly favourite and archive a bookmark by new buttons that appear on hover (98e173d8).
  • Haptic feedback on mobile sidebar navigation (f91ec531).
  • Show "+" in the tag count badges when more pages exist by @zerone0x (432235be).
  • In the add bookmark to list dialog, you no longer need to explicitly save the selection thanks to @xingzihai (#2629)
  • The default new list emoji changed from "🚀" to "📁". Maturity, I guess?
  • You can now add multiple lists to the same rule engine condition by @Ahmed-Abdel-karim (#2620)
  • Timestamps across the app are now correctly localized instead of showing the server's timezone (#2682)

Fixes 🐛

  • Important Security fixes:
    • Reported by @tahirsercan (GHSA-g647-327m-79g9)
      • Fix SSRF validation bypass caused by redirects in crawler and video worker
    • Those issues were reported by Sami Zayn:
      • Add missing ratelimits for the changePassword endpoint
      • Sanitize user names before storing them to avoid stored XSS in karakeep emails (#2724)
      • Invalidate existing password reset tokens before issuing a new one (#2722)
    • Reported by @CE2Sec (GHSA-7rx4-c5vx-g8w3)
      • Fix blind SSRF in crawler favicon extraction
    • Add missing ratelimits for bookmark creation and asset upload APIs
  • Fix a bug where adding a bookmark to a tag or list didn't appear immediately requiring a refresh.
  • Bulk actions used to hammer the server with cache refill requests, those are now debounced.
  • Fix adblocker getting skipped due to the URL validation interception.
  • Fix "Manage tags" page on iOS not scrolling correctly.
  • Prevent highlight popup from stealing focus on Firefox (11dfe74d)
  • Fix rare crash in the crawler worker (d197f595)
  • Increase max feed url length to 2k chars (07454a6a)
  • Fix cropped text in android app when using bold text by @Go2Engle (#2554)
  • Fix occasional problems connecting to server from mobile app when it's behind a reverse proxy by @mrInvincible29 (#2559)
  • Better extraction for lazy loaded images from content by @zerone0x (#2556)
  • Expand $tags/$aiTags/$userTags in AI prompt preview by @zerone0x (#2557)
  • Fix sourceUrl not getting saved when creating asset bookmarks via the API by @hoilc (#2574)
  • Redact internal server error messages in prod responses (c8a75a0b)
  • Correctly parse linkwarden collections during import (722fd8c0)
  • Correctly extract TWZ RSS categories as tags by @venku122 (#2589)
  • Correctly skip tagging and summarization for assets that fail preprocessing to avoid misleading numbers in the admin panel
  • Improve meilisearch request batching for better performance
  • Enable configuring monolith timeout and arguments by @NikhilChowdhury27 (#2659)
  • Fix openai proxy setting not getting respected by the openai client (#2676)
  • Fix formality and tone for a bunch of languages to match that of English
  • Use the same proxy URL for all network interactions within the same crawler job run
  • Fix parsing archived status for bookmarks imported from Pocket by @howwohmm (#2656)
  • Fix parsing archived status and folder for Instapaper bookmarks
  • Upgrade playwright to 1.59 to fix browserless compatibility issues
  • Stricter full text search matching strategy for bookmarks to provide more relevant results (68e73500)
  • Fix unreachable background script on Firefox by @Joly0 (#2649)
  • Update default meilisearch version to 1.41 by @ir31k0 (#2643).
    • If you want to update your instance, check out meilisearch's guide here.
  • Fix truncate long bookmark titles on mobile app by @xuatz (#2699)
  • Dedupe crawl jobs using idempotency key by @NikhilChowdhury27 (#2678)
  • Add ability to finalize/delete a staged import session that might have been stuck before (#2713)
  • Fix low quality video downloads caused by missing ffmpeg dependency to yt-dlp by @MaximePinot (#2721)
  • Better ratelimiting for users behind the same IP (e.g. NAT) by including userId in the ratelimit key
  • Use relative path for logout redirect to avoid port mismatch by @howwohmm (#2655)
  • Skip URL type identification requests if a page is crawled with SingleFile by @GSAlex (#2580)
  • Fix text clipping in bookmark card notes by @beluga73 (#2748)
  • For CLI based server migrations, tags attachedBy is now correctly migrated (462d713f)

For Developers 🛠️

  • The API docs now have much more extensive documentation. (dd2c6cc0)
  • New APIs:
    • For Trigger admin background jobs (4974ce58)
    • For managing feed subscriptions by @larsborn (#2635)
  • Map TOO_MANY_REQUESTS to 429 status code in the API instead of internal server error (5b6402f3)
  • The docker-compose based dev-env is now more stable and documented thanks to @xuatz (#2149)

Community Projects 💡

Checkout our community projects page here.

  • Karatui: A rust based TUI for managing your karakeep instance by @bercribe in 1c177160
  • Karaclean: A Docker sidecar that automatically cleans up Karakeep bookmarks based on declarative YAML rules (e.g. age, tags, lists, etc). @lmgarret

Screenshots 📸

All Lists Page
Mobile App Toolbar
Revamped Bookmark Preview Page
Keyboard Shortcuts
Granular API Keys
List Header
New Extension Settings

Upgrading 📦

To upgrade:

  • If you're using KARAKEEP_VERSION=release, run docker compose pull && docker compose up -d.
  • If you're pinning it to a specific version, upgrade the version and then run docker compose pull && docker compose up -d.

All Commits

  • fix(crawler): proper handling for proxy auth with CDP interceptions - @MohamedBassem in b9b252ec
  • feat(web): add more details to the all lists page - @MohamedBassem in 145dda9d
  • i18n: fix automated i18n strings - @MohamedBassem in f797c4cf
  • i18n: Sync weblate translations - @weblate in f0ad87fb
  • feat: add keyboard shortcuts (#2750) - @MohamedBassem in cb6a25b8
  • docs: add a comment to security docs about SSRF mitigations - @MohamedBassem in 62640bd7
  • fix(mobile): fix scrolling in manage tags page in ios - @MohamedBassem in 4e1610ad
  • refactor: refactor bulk actions to store bookmark ids (#2767) - @MohamedBassem in 517b87f5
  • fix: harden video worker redirect validation against SSRF (#2760) - @MohamedBassem in 43f50e85
  • fix: use correct env variable syntax for perplexity (#2765) - @Mxrk in 9c3a6061
  • fix: use safe favicon resolution in metascraper (#2763) - @MohamedBassem in 3dc321e7
  • fix: fix timezone handling in date displays across the app (#2682) - @MohamedBassem in 9db69a33
  • fix: typo in docker docs (#2762) - @Mxrk in 9b93dab2
  • feat: Add CLI auth config support (#2751) - @MohamedBassem in 90382dc3
  • feat(mobile): open links and images in in-app browser (#2696) - @esimkowitz in bcc8d83e
  • fix: fix SSRF handling with redirects in crawler worker (#2759) - @MohamedBassem in c1547297
  • feat: Add agentic skills links to the landing page (#2761) - @MohamedBassem in 03c9db08
  • fix: fix allow the adblocker to run after request interception - @MohamedBassem in c2d72435
  • deps: upgrade protobufjs - @MohamedBassem in ab498a48
  • feat(landing): add safari links to landing - @MohamedBassem in 9ab522a4
  • feat: redesign list and tag page headers (#2749) - @MohamedBassem in 6ccf1fed
  • fix(ui): resolve text clipping in bookmark cards (#2748) - @beluga73 in dc0c82ef
  • tests: add a test for browser rendering - @MohamedBassem in 4ea8878c
  • chore: use .gitignore as source of truth for oxfmt and oxlint (#2740) - @esimkowitz in 6b99eab9
  • feat: Allow multiple lists for Rule Engine #2490 (#2620) - @Ahmed-Abdel-karim in 8a1f8303
  • fix: debounce bulk query invalidations (#2745) - @MohamedBassem in 2ffe27eb
  • feat(mobile): revamp search and navigation chrome (#2685) - @esimkowitz in 649efb87
  • fix: fix subscription tranisiton event logging - @MohamedBassem in 4688a2e9
  • chore: add event logging for bookmark summarization - @MohamedBassem in 53276718
  • fix: reject user deletion with active subscription - @MohamedBassem in 635f8469
  • fix: upgrade zod resolver to fix form validations (#2744) - @beluga73 in c5ed01dd
  • fix: fix nodejs bundling for the eventLogger - @MohamedBassem in d83e50c8
  • feat: add exhaustive event logging - @MohamedBassem in 6736c5a0
  • chore: add infra for the event logger - @MohamedBassem in b18013e1
  • feat: add metrics for sub status - @MohamedBassem in 3b3eb754
  • feat(mobile): customizable reader toolbar (#2527) - @esimkowitz in 49c28689
  • chore: add portless pnpm scripts - @MohamedBassem in 9d9e4702
  • fix: change the archive button in the manage lists dialog to be a secondary button - @MohamedBassem in f928f975
  • fix: fix promise race leaks in the worker (#2737) - @MohamedBassem in 6610a1aa
  • feat: add granular API key scopes (#2731) - @MohamedBassem in d95e6f8f
  • fix: fix broken cache invalidation requiring refresh after adding a bookmark to a tag or a list - @MohamedBassem in 0949d4f5
  • deps: upgrade astro to 6.1.6. fixes #2728 - @MohamedBassem in 0b15d01d
  • fix: skip url getContentType fetch if precrawledArchiveAssetId exists (#2580) - @GSAlex in b7c9fe86
  • feat: add support for configuring OpenAI reasoning effort (#2718) - @cinconueves in a075ade0
  • feat: change the default new list emoji to folder - @MohamedBassem in 430c035a
  • fix: truncate urls in crawler logs - @MohamedBassem in 44ec0772
  • feat: Add native single-file support to browser extension (#2197) - @MohamedBassem in 1ed39a37
  • chore: fix PR template path - @MohamedBassem in 5e2b85ab
  • chore: add PR template inspired from immich - @MohamedBassem in 0e9b1b63
  • feat(extension): add manual save toggle for browser extension (#2693) - @keslerm in c3975018
  • feat(web): auto-add bookmark to list on selection (#2629) - @xingzihai in a8c5ac94
  • fix: use relative path for logout redirect to avoid port mismatch (#2655) - @howwohmm in 4dbcc414
  • feat(mcp): add update-bookmark tool (#2717) - @vbalko-claimate in c699bc90
  • fix: include userId in ratelimit key if the user is authed (#2726) - @MohamedBassem in 7f18376e
  • fix: fix pnpm symlink conflict (#2725) - @MohamedBassem in b3d0cea9
  • fix: add data: to style-src and font-src CSP directives in serveAsset (#2657) - @howwohmm in e2a39e45
  • fix: sanitize user names before storing them (#2724) - @MohamedBassem in 6109588f
  • fix: add ratelimiting for the changePassword endpoint (#2723) - @MohamedBassem in 8b51bff2
  • fix: invalidate existing password reset tokens before issuing a new one (#2722) - @MohamedBassem in 35dcf80f
  • fix(docker): add ffmpeg as required by yt-dlp (#2721) - @MaximePinot in 34487460
  • fix: add ability to manually finalize/delete staged import sessions (#2713) - @MohamedBassem in f67f1847
  • chore: add tests for the inference worker - @MohamedBassem in 364cb8a4
  • feat: add OneTab import support (#2495) - @apo-mak in 00f9ccc2
  • fix: deduplicate crawl jobs using idempotency key (#2678) - @NikhilChowdhury27 in 95bd4343
  • feat: Add Readwise Reader import (#2690) - @cinconueves in 3d84150a
  • fix: add missing source to createBookmarks from import - @MohamedBassem in 7cc01151
  • deps: upgrade oxlint and oxfmt - @MohamedBassem in cde625ca
  • docs: Update worker list in the environment variable reference (#2710) - @maxim-mityutko in c854e9e6
  • docs: add skills to docs - @MohamedBassem in 2330ad3b
  • fix: fix clawhub skill yaml - @MohamedBassem in b863d7d6
  • fix: add clawhub metadata to karakeep skill - @MohamedBassem in e438b012
  • feat(mobile): add keep screen on toggle for bookmark viewing (#2691) - @esimkowitz in 64ff1cc6
  • chore: freshen up docker-compose.yml for local dev purposes (#2149) - @xuatz in 26545d64
  • deps: upgrade to zod 4 (#2689) - @MohamedBassem in fa24e42e
  • docs(mobile): add SENTRY_DISABLE_AUTO_UPLOAD=true to build apk without sentry dsn (#2700) - @xuatz in 8e6fcdca
  • fix(mobile): remove react-native-keyboard-controller patch (#2697) - @esimkowitz in bb0d050c
  • fix(mobile): truncate bookmark title with tailwind shrink (#2699) - @xuatz in 90821073
  • fix: add support for instapaper archived status and folders - @MohamedBassem in 52f9ce0a
  • feat: start tracking last successful feed fetch (#2688) - @MohamedBassem in 700359e9
  • fix: compile native modules under pnpm 9 and pin Node 24 (#2686) - @esimkowitz in 39395361
  • fix(deps): Update meilisearch version to v1.41.0 (#2643) - @ir31k0 in 8a0f4975
  • fix: restate use lazy loading for semaphore state - @MohamedBassem in 6269175e
  • fix(browser-extension): handle unreachable background script on Firef… (#2649) - @Joly0 in 6d54cd7e
  • feat(mobile): iOS 26 header compatibility and header icon fixes (#2523) - @esimkowitz in e71681de
  • feat(cli): include userId in admin user list output - @MohamedBassem in 2702f0fd
  • fix: add ratelimiting to the asset upload endpoint - @MohamedBassem in 3b145e59
  • deps: upgrade drizzle to 0.45 - @MohamedBassem in 0b278267
  • fix: improve consistency of assetdb between local and s3 when a range is provided - @MohamedBassem in 546a89b0
  • fix(skills): fix the tags of the skill - @MohamedBassem in 7a4c07b2
  • feat: various improvements to the CLI: pretty print results, list creation, highlights, etc - @MohamedBassem in d334df92
  • feat: add an agent SKILL for using karakeep - @MohamedBassem in 1f8cac3a
  • fix: move meilisearch to 'all' matching strategy. fixes #2668 - @MohamedBassem in 68e73500
  • fix: upgrade playwright to 1.59 to fix browserless issues. fixes #2648 - @MohamedBassem in 8f4dbcc9
  • feat(import): thread archived status through Pocket import pipeline (#2656) - @howwohmm in ddf73a07
  • fix: use consistent proxy URL per crawler run (#2681) - @MohamedBassem in db986228
  • fix(landing): some astro optimizations and cleanups - @MohamedBassem in a39b7bae
  • feat(landing): migrate to astro - @MohamedBassem in 7e0d7abe
  • fix(i18n): normalize tone across all translations to match English (#2680) - @MohamedBassem in ce24d99e
  • docs: add karatui to community projects (after karaclean) - @github-actions[bot] in 1c177160
  • docs: add karaclean to community projects (#2615) - @lmgarret in a55292ba
  • fix: fix passing openai proxy to openai client (#2676) - @MohamedBassem in 4c6a95ca
  • fix: switch feed fetch endpoint to POST and add E2E coverage (#2677) - @MohamedBassem in de65a47c
  • fix: fix sdk error return type in callsites - @MohamedBassem in 07ecdcd7
  • release: add a way to publish canary CLI versions - @MohamedBassem in c6a5c626
  • feat(api): expose feed subscriptions via REST API (#2635) - @larsborn in 25ff6a79
  • feat(workers): make monolith timeout and arguments configurable (#2659) - @NikhilChowdhury27 in f54a9b8f
  • fix: dedup bookmarks during meilisearch batching - @MohamedBassem in bc14214b
  • fix: use logger for the meilisearch batch logging - @MohamedBassem in c5a4e545
  • chore: add extra batch size logging to the meilisearch plugin - @MohamedBassem in 885355bb
  • fix(landing): fix responsivness of the self-hostings docs button - @MohamedBassem in 3a217a67
  • feat: add a new counter for new bookmarks by source - @MohamedBassem in f42cb356
  • feat: add support for yearly pricing - @MohamedBassem in 3d4194d6
  • fix: speculative quota check pre-archival - @MohamedBassem in 53a4598e
  • fix(tests): fix rule engine tests - @MohamedBassem in dc59fe2d
  • fix: lower priority of rule engine enqueues - @MohamedBassem in 88d7f401
  • fix: skip tagging and summarization for assets that fail preprocessing - @MohamedBassem in db275f25
  • fix(restate): better error message on abort, preserve error stacktraces and fix stack undeterminsim - @MohamedBassem in 1745f6f9
  • chore: drop plugin deps from trpc package - @MohamedBassem in d534ec9a
  • fix: dont fail indexing job if bookmark is not found - @MohamedBassem in 9cc0246b
  • feat: add more admin APIs to semaphore implementation - @MohamedBassem in 17f4963b
  • fix: don't trigger rule engine jobs unless there's a matching rule (#2614) - @MohamedBassem in 7f118261
  • deps: upgrade metascraper - @MohamedBassem in 5b60f45d
  • deps: upgrade hono - @MohamedBassem in 6e842d89
  • deps: upgrade vite-tsconfig-paths - @MohamedBassem in 1f8d77e5
  • deps: upgrade aws client - @MohamedBassem in 7f7e0546
  • fix: only trigger webhook job if user have webhooks configured - @MohamedBassem in 49d57dfd
  • refactor: split models into repos and services for feed, highlights, webhooks and importSessions (#2613) - @MohamedBassem in ddd578cc
  • fix: ratelimit bookmark creation API - @MohamedBassem in 6e5c2ef0
  • Remove queue size checks from import worker capacity calculation (#2597) - @MohamedBassem in fba7108b
  • fix: add missing queues to queue monitoring - @MohamedBassem in 946e263a
  • Reapply "fix(restate): use queue size from semaphore instead of admin API" - @MohamedBassem in bf1963d5
  • Revert "fix(restate): use queue size from semaphore instead of admin API" - @MohamedBassem in 73720f27
  • feat(landing): minor revamp to the landing page - @MohamedBassem in b690b4c8
  • tests: add feed worker e2e tests - @MohamedBassem in a8b1e8ea
  • fix(workers): handle TWZ RSS category objects (#2589) - @venku122 in 645f2f0b
  • fix(restate): use queue size from semaphore instead of admin API - @MohamedBassem in c455f0a6
  • fix(import): parse linkwarden collections. fixes #2586 - @MohamedBassem in 722fd8c0
  • fix: redact internal server errors in prod responses - @MohamedBassem in c8a75a0b
  • feat(landing): improve SEO of the landing page - @MohamedBassem in 553bb9ee
  • chore: add jean to gitignore - @MohamedBassem in 8bb529c1
  • feat(landing): add Raycast/Obsidian integrations to the apps page (#2585) - @MohamedBassem in 9f57c212
  • fix(mobile): drop the usage of react-native-awesome-slider - @MohamedBassem in dfa56a7d
  • deps: upgrade default meilisearch to 1.37.0 (#2575) - @MohamedBassem in 467c732e
  • fix: map TOO_MANY_REQUESTS to 429 in the api - @MohamedBassem in 5053050d
  • fix(api): ensure sourceUrl is saved when creating asset bookmarks (#2574) - @hoilc in eb976279
  • release(mobile): release mobile v1.9.2 - @MohamedBassem in 3c9349d3
  • feat(mobile): report mobile crashes to sentry - @MohamedBassem in 5a371f4b
  • fix(mobile): replace deprecated ImagePicker.MediaTypeOptions with media type literal (#2528) - @esimkowitz in 1df8acb3
  • feat(mobile): add external browser default bookmark view (#2516) (#2548) - @xingzihai in ba6a6f97
  • fix(web): expand $tags/$aiTags/$userTags in AI prompt preview (#2557) - @zerone0x in 23cd9dae
  • fix(crawler): normalize lazy-load img attributes to src before Readability (#2556) - @zerone0x in 3d18d89c
  • fix(mobile): prevent app hanging behind reverse proxies and fix Hermes compat (#2559) - @mrInvincible29 in 3c70a57a
  • fix(mobile): fix layout issues when Android bold text accessibility option is enabled (#2554) - @Go2Engle in ffba00d9
  • feat: support bookmark source condition in rule engine (#2526) (#2547) - @xingzihai in b5d628cc
  • chore(mobile): add APP_VARIANT to make it easier to install multiple mobile variants (#2422) - @xuatz in bc0d3d27
  • feat(api): add admin REST endpoints to trigger background jobs (#2564) - @MohamedBassem in 4974ce58
  • docs: revise Gemini API documentation for billing and models (#2514) - @faximan in a507f274
  • fix: increase max feed url length to 2k chars. fixes #2572 - @MohamedBassem in 07454a6a
  • feat(cli): add more admin utilities to the karakeep cli - @MohamedBassem in c363c4f6
  • fix(restate): use default retry policy for onError and onComplete handlers - @MohamedBassem in 3868ad69
  • fix(web): show "+" in tag count badges when more pages exist (#2558) - @zerone0x in 432235be
  • fix(workers): prevent crash caused by puppeteer-extra - @MohamedBassem in d197f595
  • fix(workers): retry worker job completion success/failure reporting - @MohamedBassem in e578322e
  • fix(workers): avoid doing empty insertions in the tagging worker - @MohamedBassem in 186b76eb
  • feat(web): allow collapsing the sidebar in bookmark previews - @MohamedBassem in 49d79590
  • feat(web): visual revamp for the bookmark preview page - @MohamedBassem in f500129c
  • chore: migrate to oxfmt - @MohamedBassem in 85e63aec
  • fix: drop the slowMo setting from the crawler - @MohamedBassem in 49c620ce
  • feat(web): add haptic feedback on mobile sidebar navigation - @MohamedBassem in f91ec531
  • feat: switch rapid bookmark creations to use low pri queues - @MohamedBassem in b009585d
  • chore: add a throttled log line when we're failing open in redis ratelimiter - @MohamedBassem in 97cddefb
  • feat(web): add fav and archive actions on hover. fixes #2360 - @MohamedBassem in 98e173d8
  • fix: handle redis network reconnections correcty - @MohamedBassem in ca70f888
  • fix(mobile): status bar text invisible in dark mode - @esimkowitz in 43e9ea03
  • chore: move away from ioredis to node-redis client - @MohamedBassem in 774b2559
  • fix: redact search params from browser url. fixes #2419 - @MohamedBassem in f4a39230
  • feat: redis based ratelimiting plugin (#2535) - @MohamedBassem in b68ac513
  • fix(cli): respect attachedBy when migrating tags. fixes #2273 - @MohamedBassem in 462d713f
  • feat(mobile): search on type instead of search on enter - @claude in 48a6c86b
  • fix: prevent highlight popup from stealing focus on Firefox. fixes #2510 #997 - @claude in 11dfe74d
  • docs: more docs fixing - @MohamedBassem in 57f586fc
  • docs: better api docs (#2530) - @MohamedBassem in dd2c6cc0
  • feat(mobile): add empty stats for bookmarks, tags and highlights - @MohamedBassem in 1f7ea122
  • release(mobile): bump build version for mobile app - @MohamedBassem in ec2d0373
  • fix: skip session redirect from the mobile signup inline browser - @MohamedBassem in 0416ef46
  • feat(mobile): add account deletion support in settings - @claude in 33c8c770
  • docs: update pikapods link to karakeep - @MohamedBassem in a7ea50e9
  • release(mobile): Bump mobile version to 1.9.1 - @MohamedBassem in 119efef6
  • fix(mobile): add manual padding to avoid the native tabs on android. fixes #2518 - @MohamedBassem in dac78a07
  • fix(mobile): fix header color on android causing. #2518 - @MohamedBassem in 17918626
  • fix(mobile): delete hack for hiding parent's header - @MohamedBassem in 3f45d9e1
  • fix(mobile): fix padding on the header buttons in bookmark info page - @MohamedBassem in 68524d66
  • fix(mobile): fix alignment of the header menu in the list page - @MohamedBassem in 95244156
  • fix(mobile): fix query client confusion causing missed invalidation - @MohamedBassem in 0c25cf23
  • chore: add claude worktrees to gitignore - @MohamedBassem in 2f02d157
  • fix(mobile): fix alignment of the header menu in the list page - @MohamedBassem in b1b32f7b
  • feat(mobile): add SF Symbol icons to native menus - @claude in b58fc6c9
  • release: bump build version for ios app - @MohamedBassem in 5b6402f3
  • ci: upgrade ios workflow to use macos 26 - @MohamedBassem in 5c9a0cef
  • ci: bypass EAS fingerprinting - @MohamedBassem in 06fe75e6
  • fix(extension): fix missing trpc provider - @MohamedBassem in f3c9c837
  • release(sdk,cli,extension,mcp): release 0.31 sdk, mcp and cli and extension 1.2.9 - @MohamedBassem in d212415b
  • release(mobile): Bump mobile version to 1.9.0 - @MohamedBassem in 099e3eb0
  • release(docs): release the 0.31 docs - @MohamedBassem in 473c8a93
View originalPermalink
How v0.32.0 went
v0.31.0

0.31.0

Added 17
  • Synchronized reading progress across all devices
  • LLM-based OCR as an alternative to Tesseract for improved results on image and asset bookmarks
  • Revamped import pipeline with import details page, dedicated low-priority queue, better progress tracking, ability to pause imports, and more resilient error handling
  • Drag-and-drop bookmarks into lists
  • Highlights support on mobile app's reader view
  • AI tag suggestions to limit auto-tagging to existing tags for consistent results
Changed 5
  • Mobile app with native tabs and more native-feeling screens
  • Two-phase metadata updates so bookmarks show up faster while crawling continues
  • Extension autofocuses on note field on open
  • Docker images moved from Alpine to Debian
  • Upgraded to Expo SDK 54, React 19.2.1, and Node.js 24
Fixed 20
  • Sanitize reddit's crawling output to prevent stored XSS
  • Eliminated O(n²) parsing of Netscape bookmark imports
  • Smart lists can now be used in search qualifiers and in other smart list queries
  • Parallelize content extraction in the crawler worker for faster crawling
  • Batch meilisearch indexing requests for better performance
  • Auto dismiss dialogs during crawling to prevent worker crashes

0.31.0

Welcome to the 0.31.0 release of Karakeep! This release brings synchronized reading progress, LLM-based OCR, a revamped import pipeline, drag-and-drop for lists, highlights on mobile, a lot of mobile polish, and fixes for some long standing bugs. Huge thanks to our contributors for this release @esimkowitz, @WieserDaniel, @chen-ye, @SnowSquire, @mokhovyk, @evan6seven, @ElectricTea, @RobertRosca, @sweepies, @usr3 and everyone who shipped code, triaged bugs, or shared feedback for this release.

If you enjoy using Karakeep, consider supporting the project here ☕️ or via GitHub here.

And in case you missed it, we now have a ☁️ managed offering ☁️ for those who don't want to self-host. You can signup here 🎉.

New Features 🚀

  • Synchronized reading progress across all your devices (#2302). By @esimkowitz!
    • Your reading position is now saved and synced, so you can pick up right where you left off on any device.
  • LLM-based OCR as an alternative to Tesseract (#2442)
    • You can now use your configured LLM for OCR instead of Tesseract, which produces significantly better results for image and asset bookmarks.
  • Revamped Import pipeline (#2378)
    • The import experience got another big overhaul: a new import details page (#2451), a dedicated low-priority queue for import crawling (#2452), better progress tracking, ability to pause an import and more resilient error handling.
  • Drag-and-drop bookmarks into lists (#2469)
  • Highlights support on mobile (#2494)
    • You can now view and create highlights in the mobile app's reader view.
  • AI tag suggestions: instructs the model to limit auto-tagging to a subset of your existing tags for more consistent results (#2444).
  • Export lists in backups and exports (#2484)
    • Automated backups and full exports now include your lists.
  • Others:
    • Retry buttons for dangling (aka pending) bookmarks in the admin panel (#2341).
    • Add signup support to the mobile app.
    • OpenAI service tier configuration via OPENAI_SERVICE_TIER (#2339). By @RobertRosca!
    • Import from Instapaper (#2434). By @WieserDaniel!
    • Privacy-respecting bookmark debugger admin tool (#2373)
    • MCP server now supports custom configurable HTTP headers (#2436). By @chen-ye!
    • New search qualifiers:
      • source: filter to search by bookmark source (mobile, extension, web, etc.) (#2465).
      • tag: alias for # and ! alias for negation (#2425).
      • New "Title Contains" condition in the Rule Engine (#2354). By @mokhovyk!

UX Improvements ✨

  • Mobile app overhaul:
    • Native tabs and more native-feeling screens.
    • Animated UI feedback in the sharing modal (#2427).
    • Show bookmark count in the all lists view.
  • Better looking content fetching loading state in the bookmark preview.
  • Two-phase metadata updates so bookmarks show up faster while crawling is still in progress (#2467).
  • Links to apps, extensions and docs in the profile dropdown.
  • Extension autofocuses on note field on open (#2366). By @SnowSquire!
  • Improving the visual consistency of the settings page.
  • Opt-in OAuth auto-redirect for single-provider passwordless setups (#2483)
  • Add a download button for assets in the bookmark options menu.
  • API keys now show their last-used dates to better identify unused keys.
  • Fix masonry overflow in bookmark grids (#2400). By @evan6seven!
  • Hide confusing No suggestions message when no search suggestions are available.

Fixes 🔧

  • [Security] Sanitize reddit's crawling output to prevent stored XSS. This was reported by @ByamB4 and published as a github advisory (GHSA-mg93-f9mw-wpgj).
  • Eliminated O(n²) parsing of Netscape bookmark imports (#2338).
  • Smart lists can now be used in search qualifiers and in other smart list queries (#2470)
  • Parallelize content extraction in the crawler worker for faster crawling.
  • Batch meilisearch indexing requests for better performance (#2441).
  • Auto dismiss dialogs during crawling that might have caused worker crashes before.
  • Use user's preferred language for manual summarization (#2429).
  • Accept more permissive RSS feed content types (#2353). By @ElectricTea!
  • Fix clipping of reader view in smaller screens.
  • Fix overscrolling in some setting pages (e.g. AI settings).
  • Stop theme flashes with Cloudflare Rocket Loader (#2340). By @sweepies!
  • Retry 403, 429 and 5XX status codes from the crawler.
  • Lower priority of recrawling and mass admin actions to avoid starving interactive traffic.
  • Fix scrolling in manage lists/edit tags when inside a dialog (#2258).
  • Respect archived display behavior setting in mobile lists and tags (#2499).
  • Fix flicker on closing bookmark preview on search page.
  • Share PDFs from the mobile app as files instead of links.
  • Fix high CPU usage of browser container after large imports due to leaking contexts. (#2503)
  • Reader settings preview in the mobile app now matches reader view formatting (#2365). By @esimkowitz!
  • When saving an image or a link from a page using "Add to Karakeep" menu item, the title of the original page is no longer incorrectly used for that link.

For Developers 🛠️

  • Docker images moved from Alpine to Debian.
  • OpenTelemetry instrumentation for database queries and extra tracing in OTEL traces (#2453).
  • Prometheus metric for bookmark crawl latency (#2461).
  • New checkUrl API endpoint to check if a URL is already bookmarked.
  • attachedBy field in the update tags API endpoint to mark the tag as added by human or AI (#2281).
  • Upgraded to Expo SDK 54, React 19.2.1, and Node.js 24.
  • CLI can now search bookmarks (#2426).

Screenshots 📸

Reader Progress

https://github.com/user-attachments/assets/86b259f6-2ce7-493f-a02c-d883c76c901c

Import Details

https://github.com/user-attachments/assets/b37c91a5-b74a-4de5-94d3-f25c346cae7b

Upgrading 📦

To upgrade:

  • If you're using KARAKEEP_VERSION=release, run docker compose pull && docker compose up -d.
  • If you're pinning it to a specific version, bump the version and then run docker compose pull && docker compose up -d.

All Commits

  • fix(workers): sanitize reddits metascraper output - @MohamedBassem in ba3db95
  • fix(i18n): update en_US translation strings - @MohamedBassem in 52c1e9f0
  • i18n: Sync weblate translations - Weblate in f7ae922c
  • fix(workers): mitigate leaking browser contexts and setup and auto reaper (#2503) - @MohamedBassem in 627faf51
  • fix(web): avoid flicker on closing bookmark preview on search page - @MohamedBassem in ec0aaad0
  • fix(mobile): respect archiveDisplayBehaviour setting in lists and tags (#2499) - @MohamedBassem in 59a25607
  • fix(web): fix scrolling in manage lists/edit tags when inside a dialog. fixes #2258 - @MohamedBassem in e37d7286
  • fix(mobile): remove the use of custom safe areas - @MohamedBassem in ef0b50be
  • fix(mobile): remove smart lists from manage_lists page - @MohamedBassem in 7124d15b
  • docs: correct breaking typo in 05-singlefile.md doc (#2496) - @brandongalbraith in 0e3bc6f1
  • fix(mobile): fix formsheets on android - @MohamedBassem in 228eb208
  • fix(ui): fix the colors of buttons in the settings page - @MohamedBassem in 3d6c83d5
  • fix(ui): Improve visual consistency in all settings page - @MohamedBassem in e02a4c5e
  • feat: add checkUrl endpoint to replace searchBookmarks for URL existence checks - @MohamedBassem in b2492735
  • fix: auto dismiss dialogs during crawling - @MohamedBassem in 23ae17fa
  • deps: fix mismatch in @types/react across packages - @MohamedBassem in 6f78d2f8
  • deps: upgrade playwright to 1.58.2 - @MohamedBassem in 07cc3eff
  • fix(restate): call onError on rpc failures - @MohamedBassem in 4fd0eaf0
  • fix(mobile): drop the use of custom safe areas in bookmark lists - @MohamedBassem in 447d2cc8
  • fix(mobile): fix headers in android app - @MohamedBassem in 349fe05e
  • fix: parallelize content extraction in crawler worker - @MohamedBassem in 74c34529
  • fix(ux): hide autocomplete dropdown when there are no suggestions - @MohamedBassem in c6417d8e
  • docs: Add Cloudflare Workers AI provider (#2486) - @usr3 in 5946ce8f
  • feat: add synchronized reading progress for bookmarks (#2302) - @esimkowitz in fff0a280
  • feat(mobile): Add highlights support for the mobile app (#2494) - @MohamedBassem in 459ee50e
  • fix: dont trigger background jobs if bookmark doesn't change on updateTags call - @MohamedBassem in fbc63b92
  • fix(import): truncate title to max length in import worker - @MohamedBassem in 74b174ad
  • feat(crawler): retrun 403, 429 and 5XX status codes - @MohamedBassem in 1c5c8ec6
  • fix(web): fix clipping of reader view in smaller screens - @MohamedBassem in 41d2f0d7
  • fix(web): fix double scrolling in sidebar layout - @MohamedBassem in a8e8ce98
  • feat(ui): Add a better content fetching loading state in the bookmark preview - @MohamedBassem in be090270
  • feat: add a download button to the More submenu in bookmark options - @MohamedBassem in 2c57aa87
  • feat: add OAuth auto-redirect functionality (#2483) - @MohamedBassem in 33b91e3f
  • feat: export lists in backups and exports (#2484) - @MohamedBassem in 0c458ba1
  • feat(workers): extract html parsing into a subprocess (#2485) - @MohamedBassem in 7a100672
  • feat(mobile): make the bookmark edit UIs look more native - @MohamedBassem in ec7ef00f
  • fix: share PDFs as files instead of links in mobile app - @MohamedBassem in 0fab1aa6
  • feat: link to apps and extensions, docs and twitter in profile dropdown - @MohamedBassem in d72788ff
  • fix: dedup list and recent search suggestions - @MohamedBassem in 8539c836
  • fix: Support nested smart lists with cycle detection (#2470) - @MohamedBassem in b3d3602d
  • feat(mobile): Add animated UI feedback to sharing modal (#2427) - @MohamedBassem in b41b5647
  • feat(mobile): more native screens - @MohamedBassem in e455e468
  • feat(ai): Support restricting AI tags to a subset of existing tags (#2444) - @MohamedBassem in 4186c4c6
  • feat(mcp): Support custom configurable HTTP headers (#2436) - @chen-ye in 77b186c3
  • feat: Added Import for Instapaper (#2434) - @WieserDaniel in fbe7e3a9
  • feat: Add drag-and-drop support for bookmarks to lists (#2469) - @MohamedBassem in 485e9948
  • feat(crawler): Split bookmark metadata updates into two phases for faster feedback (#2467) - @MohamedBassem in c8464e30
  • feat: add source filter to query language (#2465) - @MohamedBassem in b05a7531
  • fix: treat bookmark not found as a no-op in rule engine instead of a failure (#2464) - @MohamedBassem in 960ca9b6
  • fix(extension): dont store tab title when saving links or images. fixes #2462 - @MohamedBassem in 1a01f75d
  • feat: Add separate queue for import link crawling (#2452) - @MohamedBassem in bbd65fd6
  • fix: lower the priority of recrawling - @MohamedBassem in 7d53e2e4
  • feat(metrics): add prometheus metric for bookmark crawl latency (#2461) - @MohamedBassem in b2640803
  • feat(db): add OpenTelemetry instrumentation for database queries - @MohamedBassem in 9e5693c6
  • feat(import): new import details page (#2451) - @MohamedBassem in e59fd98b
  • feat: add extra instrumentation in the otel traces (#2453) - @MohamedBassem in 538035c4
  • fix(import): sanitize error messages to prevent backend detail leakage (#2455) - @MohamedBassem in 93ad2e20
  • fix(import): propagate crawling/tagging failure to import status - @MohamedBassem in 50320ecd
  • fix: backfill old sessions and do queue backpressure (#2449) - @MohamedBassem in e8e48a41
  • feat: Import workflow v3 (#2378) - @MohamedBassem in 3c838ddb
  • feat: Add LLM-based OCR as alternative to Tesseract (#2442) - @MohamedBassem in 3fcccb85
  • feat: batch meilisearch requests (#2441) - @MohamedBassem in 54243b8c
  • fix(mobile): migrate from RN image to expo-image - @MohamedBassem in e8618800
  • feat(mobile): use native tabs for mobile - @MohamedBassem in bf5c99cb
  • feat(mobile): add signup support to the mobile app - @MohamedBassem in 5cb73069
  • fix: better looking error message when article content is unavailable - @MohamedBassem in 67501ed6
  • refactor: migrate trpc to the new react query integration mode (#2438) - @MohamedBassem in 65f6e83f
  • feat(mobile): show num bookmarks in the all lists view - @MohamedBassem in 4bc1b90f
  • fix: use user's preferred language for manual summarization (#2429) - @MohamedBassem in 95bfa569
  • feat(cli): Add bookmark search command (#2426) - @MohamedBassem in 42cdc937
  • feat(search): add tag: alias for # and ! alias for negation (#2425) - @MohamedBassem in 5656e394
  • feat(extension): autofocus on note open (#2366) - @SnowSquire in bf2c6ded
  • feat: Add attachedBy field to update tags endpoint (#2281) - @MohamedBassem in e09061bd
  • docker: add USE_JEMALLOC env var and disable it by default - @MohamedBassem in edf3f681
  • docker: switch to jemalloc - @MohamedBassem in 6535a5a2
  • docker: move from alpine to debian - @MohamedBassem in b0036ef1
  • feat: track api key usage dates - @MohamedBassem in 7b5f6328
  • deps(mobile): upgrade to sdk 54 - @MohamedBassem in 6094d360
  • feat(rules): add "Title Contains" condition to Rule Engine (#1670) (#2354) - @mokhovyk in c56cf4e2
  • fix(mobile): Reader settings preview on mobile matches reader view formatting (#2365) - @esimkowitz in 1b98014d
  • fix(web): avoid masonry overflow in bookmark grids (#2400) - @evan6seven in 789188b5
  • deps: upgrade react to 19.2.1 - @MohamedBassem in 086b464d
  • fix(mobile): add custom headers to card banners. fixes #2342 - @MohamedBassem in b4dbc9ce
  • feat: privacy-respecting bookmark debugger admin tool (#2373) - @MohamedBassem in 0f9132b5
  • fix: Accept more permissive RSS feed content types and Fix User-Agent key (#2353) - @ElectricTea in 0e938c14
  • fix: harden the restate implementation (#2370) - @MohamedBassem in f48e98e1
  • fix: parallelize queue enqueues in bookmark routes - @MohamedBassem in 4ba1475d
  • feat: add openai service tier configuration option (#2339) - @RobertRosca in aa7a81e0
  • fix: stop theme flashes with cloudflare rocket loader (#2340) - @sweepies in 2a6fe6e6
  • feat: Add retry buttons for pending bookmarks in admin panel (#2341) - @MohamedBassem in e195f40b
  • fix: Eliminate the O(n2) parsing of the netscape import parsing (#2338) - @MohamedBassem in 6fe20639
  • feat(mobile): use react native sonner - @MohamedBassem in 016433d4
View originalPermalink
How v0.31.0 went
v0.30.0

0.30.0

Added 14
  • 2025 Wrapped feature to celebrate your year in Karakeep
  • PDF archives that can be generated automatically during crawling or on-demand
  • Unified reader settings for font, size, and other options that sync across devices with per-device overrides
  • Upload custom user avatars for more personal profiles
  • Customize tag styling per user including case, separators, and language
  • Per-user toggles to disable auto-tagging and/or auto-summarization
Changed 5
  • Better metadata extraction for Reddit posts, YouTube thumbnails and authors, and Amazon product images
  • Replace bookmark banners and download attachments directly from the drop down menu
  • Improved Ollama summaries by using the generate endpoint
  • In bookmark APIs includeContent now defaults to false
  • Default to Node.js 24 as the current LTS
Fixed 2
  • Missing database indices that were causing slow bookmark queries
  • HTML bookmark imports failing on empty folder names

0.30.0 (New year release 🎁)

Welcome to the 0.30.0 release of Karakeep and happy new year! This release comes with "2025 wrapped" (a bit late), PDF archives, new reader settings, avatars, reddit crawling improvements, and more! Huge thanks to our contributors for this release @esimkowitz, @Moondragon85, @rzxczxc, @colado, @Yeraze, @eriktews and everyone who shipped code, triaged bugs, or shared feedback for this release.

If you enjoy using Karakeep, consider supporting the project here ☕️ or via GitHub here.

And in case you missed it, we now have a ☁️ managed offering ☁️ for those who don't want to self-host. We're in public beta now and you can signup here 🎉.

New Features 🚀

  • 2025 Wrapped is here to celebrate your year in Karakeep (#2322).
  • PDF archives
    • Archive bookmarks as PDFs, generated automatically during crawling or on-demand (#2309).
    • Set CRAWLER_STORE_PDF=true to enable auto PDF archiving.
  • Unified reader settings (font, size, etc) across all devices with per-device overrides (#2230). By @esimkowitz!
  • Better metadata extraction:
    • Reddit posts should now be crawled correctly, and banners should be fetched more reliably.
    • Fixed YouTube thumbnail and author extraction.
    • Fixed Amazon product image extraction (where it was sometimes showing the prime logo) (#2204, #2108). By @Yeraze
  • Upload custom user avatars for more personal profiles (#2296).
  • AI Setting customization:
    • Customize tag styling (case, separators, language) per user. It's highly recommended to set the tag style for more consistent tags (#2312).
    • Per-user toggles to disable auto-tagging and/or auto-summarization (#2275).
  • Others:
    • Import libraries from Matter with full export support (#2245). By @Moondragon85
    • Bulk remove bookmarks from lists (#2279).
    • Add a new rule condition to rule engine: "URL Does Not Contain" (#2280).
    • Configure an OpenAI proxy via OPENAI_PROXY_URL (#2231). By @rzxczxc
    • Added is:broken search qualifier to show links that failed crawling (#2225).
    • Edit list now in the mobile app (#2310). By @colado

UX Improvements ✨

  • Our docs got a facelift! The docs got some styling, the pages got re-organized and we now have a "Using Karakeep" section that explains some of the core concepts of Karakeep.
  • Replace bookmark banners and download attachments directly from the drop down menu (#2328).
  • Sidebar scrollbar looks cleaner, and pending list invites show as a badge in the sidebar.
  • Bookmark edit dialog now includes notes.
  • Bookmark owner avatars now show up in collaborative lists.
  • Mobile UI/UX improvements:
    • Fixed title on mobile to be at most 2 lines long.
    • Mobile settings screens should now feel more native (#2307).
    • OLED-friendly colors in the Android app matching the colors of the ios app (#1958).
    • Toasts on iOS now appear correctly above the open modals (#2320). By @colado
    • Shared lists now appear in a dedicated subsection on mobile.
    • Adding a bookmark to a list now shows a spinner during loading (#2283).
    • Server version now appears in mobile settings (#2276).
    • Fixed the confusing "tick button" beside the server address during login.

Fixes 🔧

  • Fixed missing db indicies that was causing slow bookmark queries (#2246, #2287).
  • Improved Ollama summaries by using the generate endpoint (#2324). By @eriktews
  • Fixed HTML bookmark imports failing on empty folder names (#2300).
  • Fixed non-link bookmarks stuck in pending summarization (#1605).
  • Improved tagging prompts and error-page detection.
  • Reject spoofed content types on file uploads.
  • Preserve failure counts when rescheduling rate-limited domains (#2303).
  • Fixed duplicate backdrop buttons in reader view (#2234). By @colado
  • RSS feed fetching is now spread over the hour (#2227).
  • Asset preprocessing worker timeout is now configurable (91784cd2).
  • Fixed bypassing email verification in apiKey.exchange.
  • Added limits on number of rss feeds and webhooks per user configurable by admins.
  • Fixed a bug where failed crawling leave bookmarks as pending tagging in the admin dashboard.

For Developers 🛠️

  • OpenTelemetry integration with OTLP exporter (#2318, #2321).
  • CLI can list users for admins.
  • We're now defaulting to Node.js 24 (the current LTS).
  • Breaking: In bookmark APIs includeContent now defaults to false. This change was announced a couple months ago, and is taking effect in this release.

Community Projects 💡

  • Karakeep integration for Home Assistant (#2196) by @sli-cka. Get it from here.

Screenshots 📸

Wrapped 2025

karakeep-wrapped-2025

Reader Settings

https://github.com/user-attachments/assets/4d81cb80-f9b8-43f2-998a-736f18e33038.

AI Settings

https://github.com/user-attachments/assets/48032bf6-5413-44ee-9c3b-ac7b385aeccf

Upgrading 📦

To upgrade:

  • If you're using KARAKEEP_VERSION=release, run docker compose pull && docker compose up -d.
  • If you're pinning it to a specific version, bump the version and then run docker compose pull && docker compose up -d.

All Commits

  • i18n: fix en_US translation - @MohamedBassem in d472a3a1
  • fix: fix wrapped feature to only show bookmarks in 2025 - @MohamedBassem in 4077e286
  • i18n: Sync weblate translations - Weblate in 401ea6a9
  • chore: drop the experimental tag from the rule engine - @MohamedBassem in bf9d6105
  • fix: show a toast during banner upload - @MohamedBassem in 9555f409
  • fix: don't switch the bookmark back to pending on recrawl - @MohamedBassem in 79400d04
  • fix: use the Ollama generate endpoint instead of chat (#2324) - @eriktews in e8c79f29
  • feat: add replace banner and attachment download (#2328) - @MohamedBassem in 3d652eee
  • feat: Add bulk remove from list (#2279) - @MohamedBassem in 7a76216e
  • feat: add "URL Does Not Contain" condition to rule engine (#2280) - @MohamedBassem in b20ba9cf
  • feat: 2025 wrapped (#2322) - @MohamedBassem in a0b4a26a
  • chore: worker tracing (#2321) - @MohamedBassem in 7ab7db8e
  • feat(landing): add corporate pricing - @MohamedBassem in d852ee1a
  • fix(mobile): mobile modal UI issues (#2320) - @colado in a43d375f
  • ci: fix tests - @MohamedBassem in 9d6b1282
  • feat: change default for tag style to be title case with spaces - @MohamedBassem in 9098a5a6
  • fix: more tagging tweaks - @MohamedBassem in c1cbaa8a
  • build: fix broken CI - @MohamedBassem in a5ce977d
  • fix: change prompt to better recognize error pages - @MohamedBassem in f5a5c14e
  • refactor: reduce duplication in compare-models tool - @MohamedBassem in f00287ed
  • chore: add tracing for email functions - @MohamedBassem in ba8d84a5
  • feat(mobile): create new list edit screen (#2310) - @colado in 30fa06fe
  • feat: Add open telemetry (#2318) - @MohamedBassem in 5537fe85
  • fix: reset tagging status on crawl failure (#2316) - @MohamedBassem in f7920bdc
  • feat: add the ability to specify a different changelog version - @MohamedBassem in 10820761
  • fix: remove duplicate mobile backdrop button in reader view (#2234) - @esimkowitz in 3f44e319
  • fix(landing): fix cloud banner on mobile - @MohamedBassem in 23f28530
  • refactor: add suspense boundary in sidebar layout - @MohamedBassem in 3c3d8685
  • feat(mobile): make the settings menu look more native (#2307) - @MohamedBassem in 6ee48ffb
  • feat(web): better looking scrollbar in the sidebar - @MohamedBassem in f7523a21
  • feat(mobile): use oled friendly colors for android app. fixes #1958 - @MohamedBassem in e800d744
  • refactor: migrate toasts to sonner - @MohamedBassem in 173fb99a
  • feat: add customizable tag styles (#2312) - @MohamedBassem in af3010ab
  • feat: add Matter import support (#2245) - @Moondragon85 in 93630ce8
  • feat: support archiving as pdf (#2309) - @MohamedBassem in 267db791
  • feat: add OPENAI_PROXY_URL configuration and support for proxy in OpenAI client (#2231) - @rzxczxc in bb6b742a
  • fix(tests): fix the asset upload tests - @MohamedBassem in e82694de
  • fix: reject spoofed content types on uploads - @MohamedBassem in 2dbdf76c
  • deps: upgrade tesseract to v7 - @MohamedBassem in 347793ad
  • feat(landing): announce cloud public beta in landing page - @MohamedBassem in c3b2326c
  • chore: add a tool for comparing perf of different models - @MohamedBassem in 1dfa5d12
  • feat: add notes to the bookmark edit dialog - @MohamedBassem in ecb7a710
  • fix(restate): change journal retention for services to 3d - @MohamedBassem in 0efffdcc
  • fix(cli): migrate bookmark source in migration command - @MohamedBassem in 65cfa871
  • fix: preserve failure count when rescheduling rate limited domains (#2303) - @MohamedBassem in ddd4b578
  • feat: show bookmark owner icon in shared lists (#2277) - @MohamedBassem in ef27670f
  • fix: make avatars public - @MohamedBassem in f7d34627
  • refactor: move assets to their own model (#2301) - @MohamedBassem in 013ca67c
  • feat: add support for user avatars (#2296) - @MohamedBassem in 314c363e
  • fix: handle empty folder names in HTML bookmark imports (#2300) - @MohamedBassem in 3408e6e4
  • feat: add a warning about viewing archives inline. fixes #2286 - @MohamedBassem in e336513f
  • fix(tests): fix the user setting tests - @MohamedBassem in 258bebe0
  • feat: Add user settings to disable auto tagging/summarization (#2275) - @MohamedBassem in 0bdba54b
  • feat(mobile): Convert server address editing to modal in mobile app (#2290) - @MohamedBassem in ece68ed0
  • fix: check quota usage instead bookmark transaction - @MohamedBassem in ca4bfa4c
  • fix: optimize tagging db queries (#2287) - @MohamedBassem in e18dc4c9
  • docs: shuffle some docs around - @MohamedBassem in 4762da12
  • docs: add RSS feeds integration documentation (#2288) - @MohamedBassem in 903aa5e9
  • feat(restate): Add a var to control whether to expose core services or not - @MohamedBassem in dc8ab862
  • feat: add more restate semaphore controls - @MohamedBassem in 58eb6c00
  • feat(mobile): Show shared lists under a subsection - @MohamedBassem in 837dea5e
  • fix(mobile): Fix title line clamp to 2 lines - @MohamedBassem in 15cfa137
  • fix(mobile): Add loading spinner to mobile list button (#2283) - @MohamedBassem in 7b98c52a
  • feat: add server version display to mobile app settings (#2276) - @MohamedBassem in bd969b34
  • fix: add authentication checks to settings layout (#2274) - @MohamedBassem in e53f3ae5
  • fix: only trigger search autocomplete on first search char - @MohamedBassem in 92e352f3
  • feat(landing): remove waitlist link. fixes #2270 - @MohamedBassem in e842c5a7
  • fix: don't fail the script if the user karakeep already exists. fixes #2242 - @MohamedBassem in e78e5129
  • fix: collapse reader settings by default - @MohamedBassem in 3955f91a
  • docs: Add icons beside category names - @MohamedBassem in 9021822a
  • Revert "fix: fix restate service to return control to restate service on timeout" - @MohamedBassem in 510174db
  • feat: Add unified reader settings with local overrides (#2230) - @esimkowitz in 7f4202af
  • fix: fix restate service to return control to restate service on timeout - @MohamedBassem in 6db14ac4
  • fix: non-link bookmarks where stuck in pending summarization. Fixes #1605 - @MohamedBassem in d7357118
  • fix: move trpc error logging inside the dev check - @MohamedBassem in 0b65e5a4
  • fix: Fix Amazon product image extraction on amazon.com URLs (#2108) - @Yeraze in b3196354
  • feat: use reddit API for metadata extraction. Fixes #1853 #1883 - @MohamedBassem in f5c32d94
  • fix: use GET requests for the content type request - @MohamedBassem in d6dd8ebd
  • docs: fix sidebar on mobile - @MohamedBassem in f111cba9
  • feat: Add limits on number of rss feeds and webhooks per user - @MohamedBassem in 74df8bd7
  • release(cli): Bump CLI version to 0.29.1 - @MohamedBassem in 697c853a
  • readme: some readme updates - @MohamedBassem in 1ebc721c
  • docs: Update screenshots in docs - @MohamedBassem in c6cf4188
  • docs: Adding user guides - @MohamedBassem in 04b9c291
  • docs: drop docs for old versions - @MohamedBassem in fecb0079
  • docs: restructure the docs - @MohamedBassem in af69f637
  • docs: restyle the docs - @MohamedBassem in b4344401
  • ci: run CI with node 24 - @MohamedBassem in 2bdba536
  • deps: Upgrade to nodejs 24 - @MohamedBassem in 480abce4
  • fix!: changing default for includeContent to be false in the API - @MohamedBassem in 1369ad01
  • deps: Upgrade nextjs to 15.3.8 - @MohamedBassem in 80278ecf
  • deps: Upgrade nextjs to 15.3.7 - @MohamedBassem in 74bdc186
  • fix: add more indicies for faster bookmark queries (#2246) - @MohamedBassem in 683083f4
  • feat: make asset preprocessing worker timeout configurable - @Claude in 91784cd2
  • fix: Add cache control header on asset endpoints - @MohamedBassem in 3e8cc745
  • chore: Allowing multi user benchmarks and adding more coverage - @MohamedBassem in 265b6773
  • feat(cli): Add ability to list users for the admin in the CLI - @MohamedBassem in 69a756aa
  • fix: fix correctly accounting for text bookmark in import sessions. #2208 - @MohamedBassem in 6886385c
  • fix: check import quota before importing bookmarks (#2232) - @MohamedBassem in 20d3761c
  • build: fix typecheck error in query explainer - @MohamedBassem in b6c2dadd
  • fix: migrate to metascraper-x from metascraper-twitter - @MohamedBassem in c6f93b3b
  • feat: add is:broken search qualifier for broken links (#2225) - @MohamedBassem in 1f43f232
  • feat: spread feed fetch scheduling deterministically over the hour (#2227) - @MohamedBassem in 13a090c4
  • fix: better extraction for youtube thumbnails. #2204 - @MohamedBassem in e3cc5463
  • fix: remove queue triggers outside of updateTags transaction - @MohamedBassem in cf2a12c8
  • chore: add benchmarks (#2229) - @MohamedBassem in 6180c662
  • build: dont update latest tags on release - @MohamedBassem in de98873a
  • deps: Upgrade nextjs to 15.3.6 - @MohamedBassem in 20081a3a
  • feat: add a notification badge for list invitations - @MohamedBassem in 3c6b8e97
  • docs: add karakeep integration for Home Assistant (#2196) - @sli-cka in 9a339385
  • fix: regen turnstile token on signup resubmission - @MohamedBassem in 9257b534
  • feat(landing): Add more features to the homepage - @MohamedBassem in 9a6d36f2
  • ci: run arm docker image builds on arm machines - @MohamedBassem in 3421246d
  • ci: parallelize the docker workflow for platforms - @MohamedBassem in 2e889617
  • fix: reenable idempotency key for search indexing - @MohamedBassem in 2ef751ef
  • fix: fix bypass email verification in apiKey.exchange - @MohamedBassem in e4f434e7
  • readme: add collaborative lists to the list of features - @MohamedBassem in d6d319d3
  • fix: Add restate queued idempotency (#2169) - @MohamedBassem in a71b9505
  • feat: add support for turnstile on signup - @MohamedBassem in b12c1c3a
  • build: fix npm trusted publishing - @MohamedBassem in 4898b6be
  • release: cli, mcp and sdk - @MohamedBassem in 28d6750e
  • release(extension): Release version 1.2.8 - @MohamedBassem in fdea0861
  • release(mobile): Bump mobile version to 1.8.3 - @MohamedBassem in 8da5b598
  • release(docs): release the 0.29 docs - @MohamedBassem in 97c386a4
View originalPermalink
How v0.30.0 went
v0.29.3

0.29.3

Well. Upgrading Nextjs one more time to patch CVE-2025-67779.

View originalPermalink
How v0.29.3 went
v0.29.2

0.29.2

Security 1
  • Upgrade Next.js to patch two new vulnerabilities in React CVE-2025-55184 and CVE-2025-55183

Upgrading Nextjs to patch two new vulnerabilities in react CVE-2025-55184 & CVE-2025-55183. This is on top of the critical vulnerability (CVE-2025-66478) that was patched in 0.29.1.

View originalPermalink
How v0.29.2 went
v0.29.1

0.29.1

Security 1
  • Fix Next.js CVE-2025-66478

0.29.1

A patch release for 0.29.0 with the fix of NextJs CVE: CVE-2025-66478

View originalPermalink
How v0.29.1 went
v0.29.0

0.29.0

Added 10
  • Collaborative lists allow inviting collaborators with viewer and editor access levels
  • Automated bookmark backups that can be scheduled
  • Search autocomplete to find filters and terms faster
  • Notes and search functionality on highlights in web, plus dedicated highlights page on mobile
  • Smart list creation on mobile
  • All-tags screen on mobile
Changed 3
  • Sidebar typography and colors improved, especially in dark mode
  • Page titles now correctly displayed in browser tabs
  • HTTP status Prometheus counters, failed_permanent worker metric, and system metrics added for observability
Fixed 7
  • Prompts module now lazily loads js-tiktoken reducing memory usage by 70-150MB
  • Edit dialog now correctly shows extracted text from assets
  • IP validation allowlisting allows bypassing all domains by setting CRAWLER_ALLOWED_INTERNAL_HOSTNAMES to .
  • Worker crash when hitting invalid URLs with proxy enabled
  • Shared lists are now separated in the sidebar
  • React errors in signin and signup forms
  • 404 page now appears for bookmarks and lists that don't exist

0.29.0

Welcome to the 0.29.0 release of Karakeep! This release ships some of our most awaited features. Collaborative lists, automated bookmark backups, search auto complete, highlighs are getting notes and search, and the mobile app is getting some more love. As usual thanks to @aa-ko, @fivestones, and everyone who shipped code, triaged bugs, or shared feedback for this release.

If you enjoy using Karakeep, consider supporting the project here ☕️ or via GitHub here.

And in case you missed it, we now have a ☁️ managed offering ☁️ for those who don't want to self-host. We're still in private beta (you can signup for access here) and gradually letting more and more users in. We're in public beta now and you can signup here 🎉.

New Features 🚀

  • Collaborative lists are here! (#2146, #2152)
    • You can now invite collaborators to your lists and manage their access levels between viewers and editors.
    • This was the most requested feature on the roadmap, and it's now here!
  • Automated bookmark backups you can schedule once and forget (#2182)
    • Currently it only captures non-asset bookmarks, but I'm planning to include lists, tags, and other metadata in the future.
  • Search gets autocomplete so you can find the right filters and terms faster (#2178)
  • Highlights overhaul: notes + search bar on web, plus a dedicated highlights page on mobile (#2154, #2155, #2156, #2157)
  • Mobile catches up with smart list creation and an all-tags screen (#2153, #2163)
  • Crawler domain rate limiting to avoid getting throttled by external sites (#2115)
    • Configure it with CRAWLER_DOMAIN_RATE_LIMIT_WINDOW_MS and CRAWLER_DOMAIN_RATE_LIMIT_MAX_REQUESTS.
  • Import from MyMind (#2138)

UX Improvements ✨

  • Sidebar typography and colors should feel nicer (specially in dark mode).
  • Page titles are now correctly displayed in the browser tabs.
  • We have a friendlier 404 page for bookmarks/lists that don't exist.
  • You can now see stats about the source of your bookmarks in the usage stats page (extension, web app, mobile app, etc).

Fixes 🔧

  • Prompts lazily load js-tiktoken which should cut between 70-150MB of karakeep's memory usage (#2176)
  • The edit dialog wasn't correctly showing the extracted text from assets, this is now fixed (#2181).
  • IP validation allowlisting now allows bypassing all domains by setting CRAWLER_ALLOWED_INTERNAL_HOSTNAMES to ..
  • Fix a worker crash when hitting invalid URLs with proxy enabled.

For Developers 🛠️

  • GET /api/version endpoint for getting server version (#2167)
  • More visibility: HTTP status Prometheus counters, failed_permanent worker metric, and system metrics on web/worker containers (#2117, #2107)
  • Documentation updates for LOG_LEVEL and Raycast links (#2166, #1923) by @aa-ko and @fivestones

Screenshots 📸

Collaborative Lists
Automated Backups
Search Autocomplete

Upgrading 📦

To upgrade:

  • If you're using KARAKEEP_VERSION=release, run docker compose pull && docker compose up -d.
  • If you're pinning it to a specific version, bump the version and then run docker compose pull && docker compose up -d.

All Commits

  • i18n: fix en_US translation - @MohamedBassem in f01d96fd
  • i18n: Sync weblate translations - @Hosted Weblate in e1ad2cfd
  • feat: autocomplete search terms (#2178) - @MohamedBassem in ebafbe59
  • build: switch npm to trusted publishing - @MohamedBassem in 335a84bb
  • feat: Add automated bookmark backup feature (#2182) - @MohamedBassem in 86a4b396
  • fix: making serverConfig readonly - @MohamedBassem in e67c33e4
  • fix: fix react errors in signin and signup forms - @MohamedBassem in 6ab79845
  • fix: separate shared lists in the sidebar (#2180) - @MohamedBassem in 2619f4cf
  • fix: correctly render asset extracted text in the edit bookmark dialog. fixes #2181 - @MohamedBassem in 9ed338fe
  • fix: lazy load js-tiktoken in prompts module (#2176) - @MohamedBassem in e2877b45
  • fix: fix colors in invitation form - @MohamedBassem in a13a227e
  • fix: hide archived checkbox in shared lists - @MohamedBassem in adde8099
  • feat: improve font and colors of sidebar items - @MohamedBassem in 5bea5d39
  • fix: Propagate group ids in queue calls (#2177) - @MohamedBassem in 6821257d
  • feat: Introduce groupId in restate queue (#2168) - @MohamedBassem in 54268759
  • fix: support invocation cancellation while awaiting sempahore - @MohamedBassem in 38842f77
  • docs: Add LOG_LEVEL to configuration documentation (#2166) - @aa-ko in 6912d0dd
  • docs: fix link to raycast extension (#1923) - @fivestones in 9fedfc15
  • tests: Add a test for listing lists - @MohamedBassem in e16ae2a4
  • feat: add GET /api/version endpoint (#2167) - @MohamedBassem in 472adec7
  • fix(mcp): propagate parent id to createList call. fixes: #2144 - @MohamedBassem in 0d14130c
  • feat(mobile): proper handling for shared list permissions (#2165) - @MohamedBassem in c5c71ba9
  • feat(mobile): Add highlights page to mobile app (#2156) - @MohamedBassem in 8a5a109c
  • feat: A better looking 404 page - @MohamedBassem in 7f555f57
  • fix: hide manage collaborators option for smart lists - @MohamedBassem in 2b38c006
  • fix: Hide shared lists where user is a viewer in Manage Lists dialog (#2164) - @MohamedBassem in e4db9bf2
  • feat(mobile): Add AI summary field to mobile bookmark info (#2157) - @MohamedBassem in 45081dcb
  • feat(mobile): Add tags screen to mobile app (#2163) - @MohamedBassem in ad66f78d
  • feat: Add notes feature to highlights (#2154) - @MohamedBassem in de5ebbc4
  • feat(mobile): Add smart list creation in mobile app (#2153) - @MohamedBassem in 48ab8a19
  • feat: Add search bar to highlights page (#2155) - @MohamedBassem in ed6a3bfa
  • fix: hide collaborator emails from non-owners (#2160) - @MohamedBassem in 8ab5df67
  • feat: Add invitation approval for shared lists (#2152) - @MohamedBassem in 5f0934ac
  • deps: upgrade oxlint - @MohamedBassem in daee8e7a
  • fix: add a way to allowlist all domains from ip validation - @MohamedBassem in 67b8a3c1
  • fix: use kbd for editor card - @MohamedBassem in 3345377d
  • fix: drop journal retention for sempahore and id providers - @MohamedBassem in 1b44eafe
  • refactor: remove the PrivacyAware interface - @MohamedBassem in 815e1961
  • feat: Add collaborative lists (#2146) - @MohamedBassem in 88c73e21
  • deps: upgrade hono and playwright - @MohamedBassem in cc8fee0d
  • deps: Upgrade typescript to 5.9 - @MohamedBassem in 391af8a5
  • build: Improve docker caching (#2140) - @MohamedBassem in 6cccb9f1
  • fix: fix hydration error in admin user list - @MohamedBassem in 12d09a74
  • feat: import from mymind (#2138) - @MohamedBassem in 0c80f515
  • feat: add Prometheus counter for HTTP status codes (#2117) - @MohamedBassem in 43506669
  • fix(mobile): upgrade react-native-pdf to v7 to fix page alignment - @MohamedBassem in 4c6ef25d
  • fix(mobile): fix app memory page size compatibility (#2135) - @MohamedBassem in fbd12ea3
  • release(mobile): Bump mobile version to 1.8.2 - @MohamedBassem in 76c291a6
  • fix: remove incorrect array destructuring in mobile search (#2124) - @MohamedBassem in 07390aef
  • feat: correct default prom metrics from web and worker containers - @MohamedBassem in c34f70da
  • fix: stop retrying indefinitely in restate queues - @MohamedBassem in d4b7b89a
  • fix: fix crash in crawler on invalid URL in matchesNoProxy - @MohamedBassem in d0f71a4c
  • feat: add crawler domain rate limiting (#2115) - @MohamedBassem in 4cf0856e
  • refactor: Allow runner functions to return results to onComplete - @MohamedBassem in b28cd03a
  • refactor: Extract ratelimiter into separate plugin (#2112) - @MohamedBassem in 03161482
  • feat(extension): Add custom header support for extension (#2111) - @MohamedBassem in ec87813a
  • feat: Add bookmark sources statistics section (#2110) - @MohamedBassem in 725b5218
  • feat: Add page titles (#2109) - @MohamedBassem in 3083be0c
  • feat: add failed_permanent metric for worker monitoring (#2107) - @MohamedBassem in 1b8129a2
  • release(docs): release the 0.28 docs - @MohamedBassem in d9ef832e
  • release(extension): Release version 1.7.1 - @MohamedBassem in 7339d1df
  • release(mobile): Bump mobile version to 1.8.1 - @MohamedBassem in f06b8eab
View originalPermalink
How v0.29.0 went
v0.28.0

0.28.0

Added 11
  • Revamped import experience with progress tracking
  • Revamped Tags page with search and pagination
  • Upload custom attachments to bookmarks
  • When deleting a list, optionally delete all its children
  • Server overview highlights service dependency health
  • Inline checklist toggling for text bookmarks
Changed 5
  • Grid view controls expose title/tag toggles and image fit options
  • Bookmark cards surface saved notes across web and mobile
  • Manage Lists modal is now searchable
  • Tags page now has a Create Tag button
  • API key can be regenerated without recreating it
Fixed 3
  • Crawler memory footprint optimized
  • Allow Karakeep to use newer OpenAI models by setting INFERENCE_USE_MAX_COMPLETION_TOKENS=true
  • Search input no longer crashes on percent signs and works correctly with IME composition
Security 1
  • Stricter URL validation to protect against SSRF attacks with webhook requests going through proxy and internal IP requests blocked by default unless explicitly allowed via CRAWLER_ALLOWED_INTERNAL_HOSTNAMES

0.28.0 (20k stars ⭐)

Welcome to the 0.28.0 release of Karakeep! We've have hit 20k stars on Github 🎉 (well 21k because I was too late with the release)! Thanks a lot for your support throughout this journey! This release brings a refreshed import pipeline, uploading custom attachments, revamped tags page, inline checklists, and a bunch of quality-of-life touches across the web app, extension and mobile app. Huge thanks to @BOTkirial, @qixing-jk, @@maya-doshi, @BenjaminMichaelis, @cloudchristoph, @claytono, as usual @xuatz and everyone who shipped code, triaged bugs, or shared feedback for this release.

If you enjoy using Karakeep, consider supporting the project here ☕️ or via GitHub here.

And in case you missed it, we now have a ☁️ managed offering ☁️ for those who don't want to self-host. We're still in private beta (you can signup for access here) and gradually letting more and more users in.

New Features 🚀

  • Revamped import experience with progress tracking (#2001)
  • Revamped Tags page that adds search and pagination to better serve users with thousands of tags (#1987)
  • You can now upload custom attachments to bookmarks (#2100)
  • When deleting a list, you can now optionally delete all its children (#1989)
  • Server overview highlights service dependency health.
  • Inline checklist toggling for text bookmarks (#1933) – @BOTkirial
  • With every release, you'll be prompted to view what's new in that release from inside the app.
  • You can now pass custom headers from the mobile app to the server (#2103)
  • Extension improvements:
    • Tab bookmark badge indicator by @qixing-jk shows when a page is already bookmarked (#1745)
    • You can now write notes directly after saving a bookmark in the extension (#2104)

UX Improvements ✨

  • Grid view controls expose title/tag toggles and image fit options (#1960)
  • Bookmark cards can surface saved notes across web and mobile (#2083) – @xuatz
  • Manage Lists modal is searchable for faster sorting (#2029)
  • The tags page now has a "Create Tag" button (#1942)
  • You can now regenerate the API key without having to recreate it.
  • New title: seach qualifier for searching bookmarks by title (#1940)

Fixes 🔧

  • ⚠️ (Potentially breaking change) ⚠️ Stricter URL valdaition to protect against SSRF attacks (#2082)
    • Webhook requests now go through the proxy if there's one configured
    • All server-initiated requests (including webhooks) to internal IP addresses are now blocked by default unless explicitly allowed via CRAWLER_ALLOWED_INTERNAL_HOSTNAMES. If your webhooks are hitting internal services, you'll have to allowlist them via CRAWLER_ALLOWED_INTERNAL_HOSTNAMES.
    • Monolith now honors the configured crawler proxy.
    • Metascraper logo extraction now respects the crawler proxy.
  • Crawler memory footprint shrinks with targeted optimizations (#1748)
  • Allow karakeep to use newer openai models that was previously failing because of deprecated max_tokens (#2000) - @BenjaminMichaelis
    • You'll need to set INFERENCE_USE_MAX_COMPLETION_TOKENS=true in your .env file to use the new models. This is eventually going to become the default.
  • Admin maintenance jobs respect abort signals to stop gracefully
  • Search input no longer crashes on percent signs and also works correctly with IME composition
  • Fixed a crash when sharing a list publicly that didn't have any bookmarks (#1990)
  • Screenshots are now stored as jpegs instead of pngs to reduce file size
  • Fixed a bug that was preventing tag merging (#1938)
  • RSS imports can apply feed categories as tags (#2031)

For Developers 🛠️

  • Create bookmark API returns 200 instead of 201 when a bookmark already exists
  • CLI Improvements:
    • New commands to migrate data from one server to another
    • New command to dump a full account archive
    • A new wipe command to selectively clean up data from the account

Community Projects 💡

Karakeeper

3rd Party iOS/Safari Client - by @simplytoast1

Karakeeper now is providing an alternative iOS native mobile/desktop client for Karakeep beyond its existing functionality of providing a safari extension.

Karakeep Sync

A syncing tool for Karakeep - by @sidoshi

A rust-based syncing tool that syncs: Hacker News upvotes, Reddit saved posts, Github stars and Pinboard bookmarks automatically to Karakeep!

Screenshots 📸

Inline Checklists
Import Sessions
Service Health Indicators

Upgrading 📦

To upgrade:

  • If you're using KARAKEEP_VERSION=release, run docker compose pull && docker compose up -d.
  • If you're pinning it to a specific version, bump the version and then run docker compose pull && docker compose up -d.

All Commits

  • fix: standardize US English translations to professional tone - @MohamedBassem in 4f025f5a
  • i18n: Sync weblate translations - @weblate in 5387c982
  • tests: fix crawling and search e2e tests (#2105) - @MohamedBassem in c4bee9fe
  • feat(extension): Allow writing notes directly in the extension (#2104) - @MohamedBassem in 098e56a8
  • fix(mobile): fix default address not correctly stored in settings - @MohamedBassem in a2203196
  • feat(mobile): add custom headers configuration in sign-in screen (#2103) - @MohamedBassem in ec621bf5
  • tests: Fix failing test - @MohamedBassem in 27ed0a19
  • feat: Add what's new modal in the sidebar (#2099) - @MohamedBassem in 474f6429
  • feat: Add support for user uploaded files (#2100) - @MohamedBassem in 31960fcd
  • refactor: consolidate multiple karakeep plugins into one package (#2101) - @MohamedBassem in 99413db0
  • fix: metascraper logo to go through proxy if one configured. fixes #1863 - @MohamedBassem in 737b0317
  • feat(extension): add tab bookmark badge indicator (#1745) - @qixing-jk in f0b0959e
  • fix: restore image size in grid layout - @MohamedBassem in 2056582c
  • deps: Upgrade react-query to 5.90 - @MohamedBassem in 560900bb
  • feat: Support inline toggling for todos. fixes #1931 (#1933) - @BOTkirial in 393bbd9a
  • fix: fix monolith to respect crawler proxy - @MohamedBassem in 085c832c
  • feat(rss): Add import tags from RSS feed categories (#2031) - @MohamedBassem in 5358682a
  • fix: fix crash in search input when query contains a percent. fixes #1941 - @MohamedBassem in 633686b5
  • feat: Add view options to show tag/title and control image fit. Fixes #1960 - @MohamedBassem in 34d2b485
  • refactor: improve the userLocalSetting server functions - @MohamedBassem in bb00c996
  • feat: Make search job timeout configurable - @MohamedBassem in 965c603d
  • feat: display notes on bookmark card (#2083) - @xuatz in 33f40779
  • fix: Stricter SSRF validation (#2082) - @MohamedBassem in b63a49fc
  • fix: correctly handle composition in search input. fixes #2048 - @MohamedBassem in c6ebceb9
  • fix: browser service connection check using dns instead. Fixes #2080 - @MohamedBassem in c9c73d41
  • fix: More memory optimizations for crawler worker. #1748 - @MohamedBassem in 40d548bd
  • fix: fix screenshot filepath in crawler - @MohamedBassem in 0704b8bb
  • docs: Add Azure configuration details for OpenAI-compatible API (#2072) - @cloudchristoph in bd9c933b
  • fix: Respect abort signal in admin maintenance jobs - @MohamedBassem in 8a330dc2
  • deps: Upgrade metascraper plugins - @MohamedBassem in e43c7e0f
  • deps: Upgrade metascraper-readability 5.49.6 - @MohamedBassem in 6d234de8
  • feat: Allow configuring inline asset size threshold - @MohamedBassem in cf3ffff0
  • feat: Add admin maintenance job to migrate large inline HTML (#2071) - @MohamedBassem in 2b769cba
  • fix(inferance): skip token slicing when content is already witin max length - @MohamedBassem in 17136006
  • refactor: generalize tidy assets queue into admin maintenance (#2059) - @MohamedBassem in 6ea5dd19
  • fix: update OpenAI API to use max_completion_tokens instead of max_tokens (#2000) - @BenjaminMichaelis in 046c29dc
  • fix(restate): Fix priority for restate queue - @MohamedBassem in 8c0aae33
  • fix(restate): Ensure that the semaphore and idProvider services are ingress private - @MohamedBassem in cdf81213
  • feat: Add source field to track bookmark creation sources (#2037) - @MohamedBassem in 2defc247
  • feat: support passing multiple proxy values (#2039) - @MohamedBassem in c14b6934
  • deps: Upgrade oxlint to 1.22 - @MohamedBassem in 88a7ffec
  • feat: Add service dependency checks in the server overview page - @MohamedBassem in fda1c851
  • fix(web): Add w-full to tags editor to prevent unusable narrow width (#2035) - @MohamedBassem in 7ee9416e
  • fix(api): Return 200 when bookmark already exists instead of 200 - @MohamedBassem in f2dec26f
  • tests: Add a test for the GET /bookmarks/bookmarkId/lists api - @MohamedBassem in d5780388
  • fix(api): Document the API for getting lists of a bookmark. fixes #2030 - @MohamedBassem in 7f138b99
  • feat: make list dropdown searchable in Manage Lists modal (#2029) - @MohamedBassem in 87053d2e
  • fix: fix dev script shebang for better compatibility (#2019) - @maya-doshi in dcddda56
  • fix: Correct grammatical errors in prompts (#2020) - @atsggx in f1e8cea2
  • docs: Add karakeep-sync to community projects (#1994) - @sidoshi in 36ffbdf8
  • fix: round feed refresh hour for idempotency (#2013) - @MohamedBassem in bae8386d
  • fix: fix show no bookmark page when there isn't search results - @MohamedBassem in 57d731ba
  • fix: Disable idempotency keys for search - @MohamedBassem in b6867be4
  • feat: Restate-based queue plugin (#2011) - @MohamedBassem in 74a1f7b6
  • feat: Revamp import experience (#2001) - @MohamedBassem in 4a580d71
  • docs: Add doc updates for prometheus metrics (#1957) - @claytono in 5e331a7d
  • fix: fix public list sharing for empty lists (#1990) - @MohamedBassem in 7df6d942
  • feat: recursive list delete (#1989) - @MohamedBassem in 7d0b414f
  • feat: use jpegs for screenshots instead of pngs - @MohamedBassem in ed1f24f2
  • feat: Stop downloading video/audio in playwright - @MohamedBassem in 37845f99
  • fix: Abort dangling processing when crawler is aborted (#1988) - @MohamedBassem in 9eecda18
  • fix: Cleanup temp assets on monolith timeout - @MohamedBassem in 8dd84ef5
  • chore: Silence lint on and tags when it's intentional - @MohamedBassem in cdbedf6c
  • fix: dont re-enqueue indexing for a bookmark already pending indexing - @MohamedBassem in e395ac27
  • feat: Add tag search and pagination (#1987) - @MohamedBassem in 62f7d900
  • fix: optimize memory usage of tag listing - @MohamedBassem in 9fe09bfa
  • deps: Upgrade oxlint to 1.16 - @MohamedBassem in bbc5e6c2
  • fix: fix bundling liteque in the workers - @MohamedBassem in 851d3e29
  • refactor: Move callsites to liteque to be behind a plugin - @MohamedBassem in 8d320554
  • fix(dev): worker not started properly in helper start script (#1946) - @xuatz in 6ba61b46
  • feat: Regen api keys - @MohamedBassem in 7671f4ff
  • release(cli): Bump CLI version to 0.27.1 - @MohamedBassem in 69ef2ffe
  • feat(cli): Give more targetting options for dump/migrate/wipe - @MohamedBassem in 6501f69a
  • release(cli): Bump CLI version to 0.27.0 - @MohamedBassem in 0700aab8
  • feat(cli): Implement a full account dump archive - @MohamedBassem in b9a8ca29
  • feat(cli): Implement a wipe command in the CLI - @MohamedBassem in bc0e7461
  • feat: Add scripts to migrate all content from one server to the other - @MohamedBassem in 783f72cb
  • fix(web): Handle user deletion more gracefully - @MohamedBassem in 92e357f1
  • feat: A better looking catch all error boundary - @MohamedBassem in d53b2826
  • fix(web): fix error when attempting to merge tags. fixes #1938 - @MohamedBassem in d173b101
  • feat: Add Create Tag button to tags page (#1942) - @MohamedBassem in 820b7e65
  • chore: fix claude code action - @MohamedBassem in c2dcb9dc
  • refactor: strongly type the search plugin interface - @MohamedBassem in bf5bf996
  • feat(search): add title search qualifier (#1940) - @MohamedBassem in a92ada77
  • feat(extension): add current tab title while saving from extension (#1930) - @Abel in b594ff09
View originalPermalink
How v0.28.0 went
v0.27.1

0.27.1

Fixed 4
  • Fix ranking of search results
  • Fix migration failing when no user settings are set
  • Fix 5xx error on invalid API key
  • Migrate systemd config to the new worker path on update

This is a hotfix release for 0.27.0.

🐞 Fixes

  • fix: Fix ranking of search results. fixes #1922 - @MohamedBassem in 3bae3aad
  • fix: fix migration failing when no user settings are set. fixes #1919 (#1920) - @halkeye in 2cb1b28a
  • fix: fix 5xx on invalid api key - @MohamedBassem in 20f4e471
  • fix: migrate systemd config to the new worker path on update. fixes #1889 - @MohamedBassem in e5dea956
View originalPermalink
How v0.27.1 went
View all

Discussion