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=trueto enable auto PDF archiving.
- Unified reader settings (font, size, etc) across all devices with per-device overrides (#2230). By @esimkowitz!
- Better metadata extraction:
- Upload custom user avatars for more personal profiles (#2296).
- AI Setting customization:
- 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:brokensearch 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 (91784cd).
- 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
includeContentnow defaults tofalse. This change was announced a couple months ago, and is taking effect in this release.
Community Projects 💡
Screenshots 📸
Wrapped 2025
Reader Settings
AI Settings
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
- i18n: fix en_US translation - @MohamedBassem in d472a3a
- fix: fix wrapped feature to only show bookmarks in 2025 - @MohamedBassem in 4077e28
- i18n: Sync weblate translations - Weblate in 401ea6a
- chore: drop the experimental tag from the rule engine - @MohamedBassem in bf9d610
- fix: show a toast during banner upload - @MohamedBassem in 9555f40
- fix: don't switch the bookmark back to pending on recrawl - @MohamedBassem in 79400d0
- fix: use the Ollama generate endpoint instead of chat (#2324) - @eriktews in e8c79f2
- feat: add replace banner and attachment download (#2328) - @MohamedBassem in 3d652ee
- feat: Add bulk remove from list (#2279) - @MohamedBassem in 7a76216
- feat: add "URL Does Not Contain" condition to rule engine (#2280) - @MohamedBassem in b20ba9c
- feat: 2025 wrapped (#2322) - @MohamedBassem in a0b4a26
- chore: worker tracing (#2321) - @MohamedBassem in 7ab7db8
- feat(landing): add corporate pricing - @MohamedBassem in d852ee1
- fix(mobile): mobile modal UI issues (#2320) - @colado in a43d375
- ci: fix tests - @MohamedBassem in 9d6b128
- feat: change default for tag style to be title case with spaces - @MohamedBassem in 9098a5a
- fix: more tagging tweaks - @MohamedBassem in c1cbaa8
- build: fix broken CI - @MohamedBassem in a5ce977
- fix: change prompt to better recognize error pages - @MohamedBassem in f5a5c14
- refactor: reduce duplication in compare-models tool - @MohamedBassem in f00287e
- chore: add tracing for email functions - @MohamedBassem in ba8d84a
- feat(mobile): create new list edit screen (#2310) - @colado in 30fa06f
- feat: Add open telemetry (#2318) - @MohamedBassem in 5537fe8
- fix: reset tagging status on crawl failure (#2316) - @MohamedBassem in f7920bd
- feat: add the ability to specify a different changelog version - @MohamedBassem in 1082076
- fix: remove duplicate mobile backdrop button in reader view (#2234) - @esimkowitz in 3f44e31
- fix(landing): fix cloud banner on mobile - @MohamedBassem in 23f2853
- refactor: add suspense boundary in sidebar layout - @MohamedBassem in 3c3d868
- feat(mobile): make the settings menu look more native (#2307) - @MohamedBassem in 6ee48ff
- feat(web): better looking scrollbar in the sidebar - @MohamedBassem in f7523a2
- feat(mobile): use oled friendly colors for android app. fixes #1958 - @MohamedBassem in e800d74
- refactor: migrate toasts to sonner - @MohamedBassem in 173fb99
- feat: add customizable tag styles (#2312) - @MohamedBassem in af3010a
- feat: add Matter import support (#2245) - @Moondragon85 in 93630ce
- feat: support archiving as pdf (#2309) - @MohamedBassem in 267db79
- feat: add OPENAI_PROXY_URL configuration and support for proxy in OpenAI client (#2231) - @rzxczxc in bb6b742
- fix(tests): fix the asset upload tests - @MohamedBassem in e82694d
- fix: reject spoofed content types on uploads - @MohamedBassem in 2dbdf76
- deps: upgrade tesseract to v7 - @MohamedBassem in 347793a
- feat(landing): announce cloud public beta in landing page - @MohamedBassem in c3b2326
- chore: add a tool for comparing perf of different models - @MohamedBassem in 1dfa5d1
- feat: add notes to the bookmark edit dialog - @MohamedBassem in ecb7a71
- fix(restate): change journal retention for services to 3d - @MohamedBassem in 0efffdc
- fix(cli): migrate bookmark source in migration command - @MohamedBassem in 65cfa87
- fix: preserve failure count when rescheduling rate limited domains (#2303) - @MohamedBassem in ddd4b57
- feat: show bookmark owner icon in shared lists (#2277) - @MohamedBassem in ef27670
- fix: make avatars public - @MohamedBassem in f7d3462
- refactor: move assets to their own model (#2301) - @MohamedBassem in 013ca67
- feat: add support for user avatars (#2296) - @MohamedBassem in 314c363
- fix: handle empty folder names in HTML bookmark imports (#2300) - @MohamedBassem in 3408e6e
- feat: add a warning about viewing archives inline. fixes #2286 - @MohamedBassem in e336513
- fix(tests): fix the user setting tests - @MohamedBassem in 258bebe
- feat: Add user settings to disable auto tagging/summarization (#2275) - @MohamedBassem in 0bdba54
- feat(mobile): Convert server address editing to modal in mobile app (#2290) - @MohamedBassem in ece68ed
- fix: check quota usage instead bookmark transaction - @MohamedBassem in ca4bfa4
- fix: optimize tagging db queries (#2287) - @MohamedBassem in e18dc4c
- docs: shuffle some docs around - @MohamedBassem in 4762da1
- docs: add RSS feeds integration documentation (#2288) - @MohamedBassem in 903aa5e
- feat(restate): Add a var to control whether to expose core services or not - @MohamedBassem in dc8ab86
- feat: add more restate semaphore controls - @MohamedBassem in 58eb6c0
- feat(mobile): Show shared lists under a subsection - @MohamedBassem in 837dea5
- fix(mobile): Fix title line clamp to 2 lines - @MohamedBassem in 15cfa13
- fix(mobile): Add loading spinner to mobile list button (#2283) - @MohamedBassem in 7b98c52
- feat: add server version display to mobile app settings (#2276) - @MohamedBassem in bd969b3
- fix: add authentication checks to settings layout (#2274) - @MohamedBassem in e53f3ae
- fix: only trigger search autocomplete on first search char - @MohamedBassem in 92e352f
- feat(landing): remove waitlist link. fixes #2270 - @MohamedBassem in e842c5a
- fix: don't fail the script if the user karakeep already exists. fixes #2242 - @MohamedBassem in e78e512
- fix: collapse reader settings by default - @MohamedBassem in 3955f91
- docs: Add icons beside category names - @MohamedBassem in 9021822
- Revert "fix: fix restate service to return control to restate service on timeout" - @MohamedBassem in 510174d
- feat: Add unified reader settings with local overrides (#2230) - @esimkowitz in 7f4202a
- fix: fix restate service to return control to restate service on timeout - @MohamedBassem in 6db14ac
- fix: non-link bookmarks where stuck in pending summarization. Fixes #1605 - @MohamedBassem in d735711
- fix: move trpc error logging inside the dev check - @MohamedBassem in 0b65e5a
- fix: Fix Amazon product image extraction on amazon.com URLs (#2108) - @Yeraze in b319635
- feat: use reddit API for metadata extraction. Fixes #1853 #1883 - @MohamedBassem in f5c32d9
- fix: use GET requests for the content type request - @MohamedBassem in d6dd8eb
- docs: fix sidebar on mobile - @MohamedBassem in f111cba
- feat: Add limits on number of rss feeds and webhooks per user - @MohamedBassem in 74df8bd
- release(cli): Bump CLI version to 0.29.1 - @MohamedBassem in 697c853
- readme: some readme updates - @MohamedBassem in 1ebc721
- docs: Update screenshots in docs - @MohamedBassem in c6cf418
- docs: Adding user guides - @MohamedBassem in 04b9c29
- docs: drop docs for old versions - @MohamedBassem in fecb007
- docs: restructure the docs - @MohamedBassem in af69f63
- docs: restyle the docs - @MohamedBassem in b434440
- ci: run CI with node 24 - @MohamedBassem in 2bdba53
- deps: Upgrade to nodejs 24 - @MohamedBassem in 480abce
- fix!: changing default for includeContent to be false in the API - @MohamedBassem in 1369ad0
- deps: Upgrade nextjs to 15.3.8 - @MohamedBassem in 80278ec
- deps: Upgrade nextjs to 15.3.7 - @MohamedBassem in 74bdc18
- fix: add more indicies for faster bookmark queries (#2246) - @MohamedBassem in 683083f
- feat: make asset preprocessing worker timeout configurable - @claude in 91784cd
- fix: Add cache control header on asset endpoints - @MohamedBassem in 3e8cc74
- chore: Allowing multi user benchmarks and adding more coverage - @MohamedBassem in 265b677
- feat(cli): Add ability to list users for the admin in the CLI - @MohamedBassem in 69a756a
- fix: fix correctly accounting for text bookmark in import sessions. #2208 - @MohamedBassem in 6886385
- fix: check import quota before importing bookmarks (#2232) - @MohamedBassem in 20d3761
- build: fix typecheck error in query explainer - @MohamedBassem in b6c2dad
- fix: migrate to metascraper-x from metascraper-twitter - @MohamedBassem in c6f93b3
- feat: add is:broken search qualifier for broken links (#2225) - @MohamedBassem in 1f43f23
- feat: spread feed fetch scheduling deterministically over the hour (#2227) - @MohamedBassem in 13a090c
- fix: better extraction for youtube thumbnails. #2204 - @MohamedBassem in e3cc546
- fix: remove queue triggers outside of updateTags transaction - @MohamedBassem in cf2a12c
- chore: add benchmarks (#2229) - @MohamedBassem in 6180c66
- build: dont update latest tags on release - @MohamedBassem in de98873
- deps: Upgrade nextjs to 15.3.6 - @MohamedBassem in 20081a3
- feat: add a notification badge for list invitations - @MohamedBassem in 3c6b8e9
- docs: add karakeep integration for Home Assistant (#2196) - @sli-cka in 9a33938
- fix: regen turnstile token on signup resubmission - @MohamedBassem in 9257b53
- feat(landing): Add more features to the homepage - @MohamedBassem in 9a6d36f
- ci: run arm docker image builds on arm machines - @MohamedBassem in 3421246
- ci: parallelize the docker workflow for platforms - @MohamedBassem in 2e88961
- fix: reenable idempotency key for search indexing - @MohamedBassem in 2ef751e
- fix: fix bypass email verification in apiKey.exchange - @MohamedBassem in e4f434e
- readme: add collaborative lists to the list of features - @MohamedBassem in d6d319d
- fix: Add restate queued idempotency (#2169) - @MohamedBassem in a71b950
- feat: add support for turnstile on signup - @MohamedBassem in b12c1c3
- build: fix npm trusted publishing - @MohamedBassem in 4898b6b
- release: cli, mcp and sdk - @MohamedBassem in 28d6750
- release(extension): Release version 1.2.8 - @MohamedBassem in fdea086
- release(mobile): Bump mobile version to 1.8.3 - @MohamedBassem in 8da5b59
- release(docs): release the 0.29 docs - @MohamedBassem in 97c386a


