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)
- 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:
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 suggestionsmessage 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
checkUrlAPI endpoint to check if a URL is already bookmarked. attachedByfield 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
Import Details
Upgrading 📦
To upgrade:
- If you're using
KARAKEEP_VERSION=release, rundocker 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 f7ae922
- fix(workers): mitigate leaking browser contexts and setup and auto reaper (#2503) - @MohamedBassem in 627faf5
- fix(web): avoid flicker on closing bookmark preview on search page - @MohamedBassem in ec0aaad
- fix(mobile): respect archiveDisplayBehaviour setting in lists and tags (#2499) - @MohamedBassem in 59a2560
- fix(web): fix scrolling in manage lists/edit tags when inside a dialog. fixes #2258 - @MohamedBassem in e37d728
- fix(mobile): remove the use of custom safe areas - @MohamedBassem in ef0b50b
- fix(mobile): remove smart lists from manage_lists page - @MohamedBassem in 7124d15
- docs: correct breaking typo in 05-singlefile.md doc (#2496) - @brandongalbraith in 0e3bc6f
- fix(mobile): fix formsheets on android - @MohamedBassem in 228eb20
- fix(ui): fix the colors of buttons in the settings page - @MohamedBassem in 3d6c83d
- fix(ui): Improve visual consistency in all settings page - @MohamedBassem in e02a4c5
- feat: add checkUrl endpoint to replace searchBookmarks for URL existence checks - @MohamedBassem in b249273
- fix: auto dismiss dialogs during crawling - @MohamedBassem in 23ae17f
- deps: fix mismatch in @types/react across packages - @MohamedBassem in 6f78d2f
- deps: upgrade playwright to 1.58.2 - @MohamedBassem in 07cc3ef
- fix(restate): call onError on rpc failures - @MohamedBassem in 4fd0eaf
- fix(mobile): drop the use of custom safe areas in bookmark lists - @MohamedBassem in 447d2cc
- fix(mobile): fix headers in android app - @MohamedBassem in 349fe05
- fix: parallelize content extraction in crawler worker - @MohamedBassem in 74c3452
- fix(ux): hide autocomplete dropdown when there are no suggestions - @MohamedBassem in c6417d8
- docs: Add Cloudflare Workers AI provider (#2486) - @usr3 in 5946ce8
- feat: add synchronized reading progress for bookmarks (#2302) - @esimkowitz in fff0a28
- feat(mobile): Add highlights support for the mobile app (#2494) - @MohamedBassem in 459ee50
- fix: dont trigger background jobs if bookmark doesn't change on updateTags call - @MohamedBassem in fbc63b9
- fix(import): truncate title to max length in import worker - @MohamedBassem in 74b174a
- feat(crawler): retrun 403, 429 and 5XX status codes - @MohamedBassem in 1c5c8ec
- fix(web): fix clipping of reader view in smaller screens - @MohamedBassem in 41d2f0d
- fix(web): fix double scrolling in sidebar layout - @MohamedBassem in a8e8ce9
- feat(ui): Add a better content fetching loading state in the bookmark preview - @MohamedBassem in be09027
- feat: add a download button to the More submenu in bookmark options - @MohamedBassem in 2c57aa8
- feat: add OAuth auto-redirect functionality (#2483) - @MohamedBassem in 33b91e3
- feat: export lists in backups and exports (#2484) - @MohamedBassem in 0c458ba
- feat(workers): extract html parsing into a subprocess (#2485) - @MohamedBassem in 7a10067
- feat(mobile): make the bookmark edit UIs look more native - @MohamedBassem in ec7ef00
- fix: share PDFs as files instead of links in mobile app - @MohamedBassem in 0fab1aa
- feat: link to apps and extensions, docs and twitter in profile dropdown - @MohamedBassem in d72788f
- fix: dedup list and recent search suggestions - @MohamedBassem in 8539c83
- fix: Support nested smart lists with cycle detection (#2470) - @MohamedBassem in b3d3602
- feat(mobile): Add animated UI feedback to sharing modal (#2427) - @MohamedBassem in b41b564
- feat(mobile): more native screens - @MohamedBassem in e455e46
- feat(ai): Support restricting AI tags to a subset of existing tags (#2444) - @MohamedBassem in 4186c4c
- feat(mcp): Support custom configurable HTTP headers (#2436) - @chen-ye in 77b186c
- feat: Added Import for Instapaper (#2434) - @WieserDaniel in fbe7e3a
- feat: Add drag-and-drop support for bookmarks to lists (#2469) - @MohamedBassem in 485e994
- feat(crawler): Split bookmark metadata updates into two phases for faster feedback (#2467) - @MohamedBassem in c8464e3
- feat: add source filter to query language (#2465) - @MohamedBassem in b05a753
- fix: treat bookmark not found as a no-op in rule engine instead of a failure (#2464) - @MohamedBassem in 960ca9b
- fix(extension): dont store tab title when saving links or images. fixes #2462 - @MohamedBassem in 1a01f75
- feat: Add separate queue for import link crawling (#2452) - @MohamedBassem in bbd65fd
- fix: lower the priority of recrawling - @MohamedBassem in 7d53e2e
- feat(metrics): add prometheus metric for bookmark crawl latency (#2461) - @MohamedBassem in b264080
- feat(db): add OpenTelemetry instrumentation for database queries - @MohamedBassem in 9e5693c
- feat(import): new import details page (#2451) - @MohamedBassem in e59fd98
- feat: add extra instrumentation in the otel traces (#2453) - @MohamedBassem in 538035c
- fix(import): sanitize error messages to prevent backend detail leakage (#2455) - @MohamedBassem in 93ad2e2
- fix(import): propagate crawling/tagging failure to import status - @MohamedBassem in 50320ec
- fix: backfill old sessions and do queue backpressure (#2449) - @MohamedBassem in e8e48a4
- feat: Import workflow v3 (#2378) - @MohamedBassem in 3c838dd
- feat: Add LLM-based OCR as alternative to Tesseract (#2442) - @MohamedBassem in 3fcccb8
- feat: batch meilisearch requests (#2441) - @MohamedBassem in 54243b8
- fix(mobile): migrate from RN image to expo-image - @MohamedBassem in e861880
- feat(mobile): use native tabs for mobile - @MohamedBassem in bf5c99c
- feat(mobile): add signup support to the mobile app - @MohamedBassem in 5cb7306
- fix: better looking error message when article content is unavailable - @MohamedBassem in 67501ed
- refactor: migrate trpc to the new react query integration mode (#2438) - @MohamedBassem in 65f6e83
- feat(mobile): show num bookmarks in the all lists view - @MohamedBassem in 4bc1b90
- fix: use user's preferred language for manual summarization (#2429) - @MohamedBassem in 95bfa56
- feat(cli): Add bookmark search command (#2426) - @MohamedBassem in 42cdc93
- feat(search): add tag: alias for # and ! alias for negation (#2425) - @MohamedBassem in 5656e39
- feat(extension): autofocus on note open (#2366) - @SnowSquire in bf2c6de
- feat: Add attachedBy field to update tags endpoint (#2281) - @MohamedBassem in e09061b
- docker: add USE_JEMALLOC env var and disable it by default - @MohamedBassem in edf3f68
- docker: switch to jemalloc - @MohamedBassem in 6535a5a
- docker: move from alpine to debian - @MohamedBassem in b0036ef
- feat: track api key usage dates - @MohamedBassem in 7b5f632
- deps(mobile): upgrade to sdk 54 - @MohamedBassem in 6094d36
- feat(rules): add "Title Contains" condition to Rule Engine (#1670) (#2354) - @mokhovyk in c56cf4e
- fix(mobile): Reader settings preview on mobile matches reader view formatting (#2365) - @esimkowitz in 1b98014
- fix(web): avoid masonry overflow in bookmark grids (#2400) - @evan6seven in 789188b
- deps: upgrade react to 19.2.1 - @MohamedBassem in 086b464
- fix(mobile): add custom headers to card banners. fixes #2342 - @MohamedBassem in b4dbc9c
- feat: privacy-respecting bookmark debugger admin tool (#2373) - @MohamedBassem in 0f9132b
- fix: Accept more permissive RSS feed content types and Fix User-Agent key (#2353) - @ElectricTea in 0e938c1
- fix: harden the restate implementation (#2370) - @MohamedBassem in f48e98e
- fix: parallelize queue enqueues in bookmark routes - @MohamedBassem in 4ba1475
- feat: add openai service tier configuration option (#2339) - @RobertRosca in aa7a81e
- fix: stop theme flashes with cloudflare rocket loader (#2340) - @sweepies in 2a6fe6e
- feat: Add retry buttons for pending bookmarks in admin panel (#2341) - @MohamedBassem in e195f40
- fix: Eliminate the O(n2) parsing of the netscape import parsing (#2338) - @MohamedBassem in 6fe2063
- feat(mobile): use react native sonner - @MohamedBassem in 016433d

