0.35.0
Welcome to the 0.35.0 release of Karakeep!
Two important milestones happened since the last release: Karakeep crossed 30k stars on GitHub 🎉, and we now own karakeep.com! Thanks to everyone who's been using, sharing and supporting Karakeep to get us here ❤️. As such, I've come bearing gifts. If you're an OSS user, this release is a big release. If you're a cloud user, the coupon code 30KSTAR gives you 25% off for three months of Karakeep cloud (for new subscriptions only).
The title of this release is security and polish. Unless you've been living under a rock, you'd have observed black October and all security incidents during it. As such, this release includes tons of security fixes/hardening. The release also includes a major redesign for the web app, the mobile app and the browser extension. Almost every screen got reworked, from the bookmark cards and the reader to the settings pages. The mobile app is now available in all the languages the web app supports. Under the hood, the reader view now uses Defuddle for much cleaner article extraction (same library backing obsidian's web clipper).
Thanks to everyone who contributed to this release: @Dragonk, @itz-puneet, @lightsabit, @TobiX, @ltek-dev1, @BrownieCoder, @monsterlag, @colinhacks, @dvdsosa, @wunsir, all the security researchers credited below, and everyone who 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 🚀
- A redesigned web app: a new visual language, clearer wording, and a pass over most screens:
- A much better dark mode and improved wording all over the app.
- Bookmark cards: A new hover menu with proper tooltips, cards are now closer to the aspect ratio of opengraph images so expect better image previews. The bookmark options now open as a sheet on small screens.
- Preview and reader (#3333): a single top bar, a reorganized details panel,
j/kto move between bookmarks without closing the preview, a reading progress bar and "Finish and archive" at the end of an article. - Settings (#3326, #3327): Reorganized the setting pages and split them into sections.
- Smart lists (#3340): build them by picking tags, favourited, archived and age instead of writing a search query, with a live count of the bookmarks that match. The raw query is still there under "Advanced".
- Highlights page (#3341): highlights are grouped by article, clicking one takes you to that passage in the reader, and you can filter by colour.
- Notes now save as you type, so closing the preview or switching bookmarks no longer loses your edits (#3325).
- A redesigned mobile app: swipe a card to archive or star it (with undo), a new reader toolbar, a highlight panel docked at the bottom, and rebuilt settings and sign-in screens. The app also now supports the iPhone Duo: when it's unfolded (and on iPads and other wide windows), it shows a sidebar like the web app's (#3363).
- The mobile app now speaks your language: the mobile app now supports all the languages the web app supports, by @Dragonk (#3097).
- Better article content extraction (#3309): the reader view now uses Defuddle, the library behind Obsidian's Web Clipper, for much cleaner article content.
- Browser extension makeover (#3232, #3234): a cleaner popup, a sign-in flow that mirrors the mobile app, editable titles, and the new dark mode.
- AI summaries now work for notes, PDFs and images by @dvdsosa (#3080).
UX Improvements ✨
- Bookmark details now show the size of each attachment (#3367).
- You can now hide the "new item" card from the bookmark grid (View options → Display options). With it hidden, a button in the header (or
Ctrl/⌘+E) opens the editor instead, by @wunsir (#3356). - New accounts now open the bookmark preview when clicking a bookmark instead of the original link. Existing accounts keep their setting (#3322).
- The browser's theme color now follows the theme you pick in the app by @itz-puneet (#3052).
- Highlights are now found by their text and the text around it instead of raw character offsets, so re-crawls and reader changes no longer make them land on the wrong text (#3306).
Fixes 🐛
The last month was a crazy month in the security world. We run karakeep in prod, as such, its security is of at most priority. This release contains tons of security fixes and proactive hardening.
- Security fixes:
- Fixed a path traversal in the avatar cleanup that let a logged-in user delete files outside of their asset directory, including other users' assets and the SQLite database. Reported by @the-arma-of-owl (High, GHSA-qh82-x2c9-f2x7, #3260).
- Webhook bearer tokens (and request bodies) are no longer sent along when a webhook endpoint redirects to a different origin. Reported by @struttonpigeon (GHSA-chpj-828m-9wj6, #3279).
- The docker images include the November 2026 Node.js security release (Node.js 24.22.3), which had seven high severity fixes (f7119ca, 331727a).
- Rate limits no longer trust client-supplied IPs: authenticated requests are now keyed by user (#3283), sign-in, sign-up and password reset no longer trust client-controlled headers for the client IP, and sign-in and password reset are now also limited per email. Reported by @chenshao1018 (GHSA-cv6g-rxx2-rxhr, #3286).
- Highlight notes are no longer visible to collaborators of shared lists. Reported by @axel-corsiez (GHSA-9x64-fcmc-xf8x, #3284).
- Merging lists now only copies the bookmarks you own, instead of also copying the ones added by collaborators. Reported by @ccsimplyspolit (GHSA-94f3-j5c2-m8pq, #3261).
- Collaborators of a shared list can no longer find out which bookmarks the owner favourited or archived by filtering on them. This also fixes the owner's archived bookmarks silently disappearing from the list for collaborators (#3285).
- Fixed an open redirect on
/signup. Reported by @GrimTheRipper-SOSECURE (GHSA-xcgp-hwgr-q92j, #3277). - The SSRF guard now checks the IPv4 address embedded in NAT64 and IPv4-translated IPv6 addresses. Reported by @tonghuaroot and @lazar1704 (GHSA-r2p4-9phf-453g, #3275).
- Locking down the docker images:
- The web server and workers used to run as root with all of Docker's default capabilities. They now start with
no_new_privsand drop almost all capabilities, with no changes needed to your compose file (#3276). Unfortunately, moving away from root altogether isn't a backward compatible change, but we support running as unprivileged user if you can do the migration for the data dir manually. - The
karakeep-chromeimage now runs Chrome withno_new_privs, ships no setuid binaries, and can optionally run with Chrome's own sandbox (KARAKEEP_CHROME_SANDBOX=true, instructions here) (#3280). - Binaries downloaded during the image build (yt-dlp, s6-overlay, monolith) are now pinned and checksum-verified (#3273).
- The web server and workers used to run as root with all of Docker's default capabilities. They now start with
- Content Handling Sandboxing: Karakeep by design processes untrusted content (e.g content extraction, OCR, etc). By default, those run in the worker process but they are as privileged as the worker. This release supports running the untrusted content handling in a remote stateless sandbox container (perhaps even outside your homelab network). This is fairly experimental and the protocol keeps changing. As such I'm not documenting it yet. If you care enough, point an agent to
SANDBOX_REMOTE_SERVER_ENABLEDandSANDBOX_REMOTE_URLthey'll be able to set it up. - Much faster smart lists (d39c02b): smart lists are now evaluated as a single SQL query instead of loading every matching bookmark into memory, which also fixes lists with more than ~32k bookmarks failing.
- Search: words starting with
and/or(e.g.android) no longer drop the filters after them (#3301),before:now includes the whole day (#3255), and-age:is now actually negated (#3254). - Large PDFs no longer freeze the workers: PDF text is now extracted with pdf.js in a separate process with a memory limit that gets killed when the job times out (#3368).
- Image OCR and Ollama requests are now actually stopped when their job times out, instead of piling up next to the retry (#3372).
- LLM OCR no longer fails on images without text, and plain photos get tags again (#3287).
- The Chrome image now listens on IPv6 too, fixing
ECONNREFUSEDon dual-stack docker setups, by @TobiX (#3209). - TikTok bookmarks saved from share links no longer show "Video currently unavailable" by @ltek-dev1 (#3187).
- Manual summaries no longer show up as failed by @BrownieCoder (#3299).
- The highlight popover in the reader view no longer covers the selected text (#3307).
- Exports no longer load the content of every bookmark making them much lighter on large libraries (#3364).
- Mobile: links containing parentheses (e.g. Wikipedia links) shared from Android are no longer cut off at the
((#3361), sharing a link from iOS no longer sends the URL twice (f263c0c), and the bookmark list no longer jumps to the top whenever it refreshes in the background (#3347). - Saving a PDF or an offline copy of a bookmark no longer re-crawls the whole bookmark (#3345).
For Developers 🛠️
@karakeep/sdk0.34.0 couldn't be loaded from Node (exports is not defined in ES module scope). This is fixed (#3370).- Added docs for Browserless' Playwright version compatibility by @monsterlag (#3214).
Screenshots 📸
Upgrading 📦
Things to know before upgrading:
- Dropped privileges in the docker image. This should be invisible to most people. If something stops working after the upgrade (e.g. permission errors on your data directory), check the logs for a
WARNING: couldn't ...line and setKARAKEEP_DISABLE_PRIVILEGE_DROP=trueto go back to the old behaviour (and please open an issue so we can fix it).
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.