Karakeep
A self-hostable bookmark-everything app with AI-based automatic tagging and full text search
Alternative to: pocket, raindrop.io
v0.24.0
2025-04-270.24.0 – Riding the MCP hype
Welcome to the 0.24.0 release of Karakeep! This release packs a ton of new stuff (we’re back to shipping folks!). This release introduces a new MCP server for interacting with Karakeep through LLMs, a new rule generic rule engine for more control over organizing your bookmarks, new search qualifiers for feeds and bookmark age, overdue edit dialog for bookmark details, some UI polishing and more! This release also welcomes a TON of new contributors, @brandonw3612, @yorch, @Summon528, @dotvhs, @YTKme, @hasansino, @gomnitrix, @adripo, @meysam81, @SteffoSpieler, @jkywalker (And I probably missed some).
If you enjoy using Karakeep, consider supporting the project here ☕️ or via GitHub here.
New Features 🚀
✨ MCP Server ✨
Unless you’ve been living under a rock recently, you’ve heard about the recent explosion of MCP servers all over the internet. We’re not going to miss the hype. This release ships a new MCP server (docs) that allows you to interact with your Karakeep instance and bookmarks through extrenal LLMs. You can ask the LLM to summarize your bookmarks, search the web and send what it finds to Karakeep, or archive your recent chat as a text note in karakeep. It can create new lists, attach tags and more to help you organize your bookmarks.
More demos in the screenshot section.
Generic Rule Engine ⚙️
Karakeep was born because I don’t want to spend time organizing what I hoard. I just throw stuff in there and karakeep’s tagging and search will help me retrieve it later. However, turns out that not everyone is in the same camp. If you’re one of those people who enjoy organizing their bookmarks, this feature is for you. This release introduces a new generic rule engine that allows you to define arbitrary processing rules for organizing your bookmarks.
Some examples:
- If a bookmark is added, and it’s coming from youtube, tag it with “#youtube” and “#video”.
- If a bookmark is favourited, download an offline archive for it.
- If the tag “#fashion” is added to a bookmark, and this bookmark is an image, then add it my “Inspiration” list (You’re better off using a smart list for this though).
⚠️ The firefox extension is back under a new name (Action Required) ⚠️
After the rebranding unfortunatly we couldn’t get the old Firefox extension back, so we had to publish a new one (link). If you’re using the old “firefox” extension, you MUST migrate to the new one manually otherwise you won’t be getting future updates.
And more!
- gpt-4.1-mini is the new default text model: The default OpenAI text model changed to the new 4.1-mini. It’s slightly more expensive than 4o-mini, but is supposed to be much smarter. The image model remains as 4o-mini as 4.1-mini is more expensive for images.
- New Search & Smart list Qualifiers:
- New “age:” search qualifier to show bookmarks older or newer than a given duration (by @brandonw3612).
- New “feed:” search qualifier to find bookmarks imported from certain RSS feeds.
- You can find the full query language here.
- Edit Bookmark Details: You can now edit almost all the details of bookmarks. The URL, summary, creation date, everything. This is obviously very overdue.
- List Merging: You can now merge lists together thanks to @gomnitrix.
- Import Tab Session Manager Sessions: Bulk-import your Chrome/Firefox Tab Session Manager session files as Karakeep bookmarks by @yorch.
- Configuring other AI providers: We added documentations for how to configure other AI providers beside OpenAI (link). This includes providers like Google AI Studio, OpenRouter, Perplexity, etc.
- Karakeep on TrueNAS: People using TrueNAS can now find Karakeep in TrueNAS’ app store thanks to @stavros-k.
UX Improvements ✨
- Some UI polish – Reduced shadows, lighter font weights, smaller editor box following the suggestions of @dotvhs in #1261! – Removed focus rings where they don’t matter much, fix popovers to the emoji picker (by @Mxrk), and list items in the sidebar now get truncated if they’re long. – Fixed margins of the “New List” button, and fixed spinner visibility during AI summarization
- Cached content is now called “Reader Mode” content.
- There’s now a nice looking “No bookmarks” banner for search and empty smart lists.
- Lists now can have a short description beside their name (by @ekambains).
- A new monochrome icon for android builds by @SteffoSpieler.
- Copy link button now gets greyed out when on a non-secure context by @ekambains.
- The github link in the sidebar now works correctly for people on the nightly build thanks to @hasansino.
For Developers 🛠️
- Added
includeContentto the API endpoints that return bookmarks (Listing, search, etc) to control whether the endpoint should include the content of the bookmark (which can be huge or not).- ⚠️ For backward compatibility, this defaults to
true, but starting from the next release, this will default tofalse. So if your tool relies on the content of the bookmarks, start passing this totruenow.
- ⚠️ For backward compatibility, this defaults to
- The API docs have a new look. The new look also fixes the enum-like requests types (like the one in createBookmark).
Fixes 🐛
- Smart lists in search: Smart lists are now correctly resolved in the search qualifiers
list:andis:inlist. - A much faster homepage loading times: If you’ve been a user for the SingleFile extension, Karakeep’s homepage might have started getting slower recently. The UI was accidently downloading a big chunk of the archive in the homepage when it’s not needed. This is now fixed.
- Faster Imports: Importing bookmarks used to be extremely slow, now it’s done with much higher parallelism and should be significantly faster.
- Dark-mode icons for the firefox extension @L-K-M
- Fixed the list getting opened when editing it from the sidebar.
- Added a new
INFERENCE_OUTPUT_SCHEMAconfiguration to restore support for models that only works with JSON mode (instead of the newer structured output mode). - Passwords stored in the database are now salted. For backward compatibility, existing users will continue using an empty salt until they change their password.
- Karakeep now closes the browser after it’s done crawling in “on demand” mode by @Summon528.
- Fixed a bug in content extraction that might result in a suboptimal “cached content” being shown.
- Triggering a search re-index now drops all the documents first to avoid dangling documents.
Community Projects 💡
Github 2 Karakeep Importer
By @hasansino
Exports your github stars automatically to Karakeep! Get it here.
Screenshots 📸
MCP Demo
The new “No Bookmarks banner”
Bookmark Editing Dialog
Upgrading 📦
If you’re using KARAKEEP_VERSION=release:
docker compose pull && docker compose up -d
If you pin to a specific version, update KARAKEEP_VERSION, then:
docker compose pull && docker compose up -d
All Commits
- fix: Fix smart lists not working in list search qualifiers. Fixes #845 - @MohamedBassem in 6178736d
- docs: Update the API docs - @MohamedBassem in 28ca9d5f
- fix: When triggering a re-index, drop all the documents first - @MohamedBassem in 3dd98b47
- fix(mcp): Remove extra new line in bookmark listing - @MohamedBassem in b63366a4
- fix(mcp): Fix spacing around the bookmarks - @MohamedBassem in 1568fe90
- fix(mcp): Ditch JSON and respond in plain text - @MohamedBassem in 1a24eb69
- fix(web): Hide smart lists from list selectors - @MohamedBassem in d3cf3e4d
- feat: Implement generic rule engine (#1318) - @MohamedBassem in 136f1262
- tests: Run trpc tests in CI - @MohamedBassem in ca47be7f
- build: Provide a docker container for the MCP server - @MohamedBassem in c239634d
- landing: Update Homepage and Hero Image (#1304) - @YTKme in 1880a59f
- fix(landing): all external links open in new tab (#1292) - @ekambains in 5ff470b4
- chore: rename missing files/conf from Hoarder to Karakeep (#1280) - @adripo in 4296e7f4
- fix(workers): Fix dompurify to run on readability’s input not output - @MohamedBassem in 86728d7f
- deps: Upgrade readability to 0.6 & adblocker to 2.5.1 - @MohamedBassem in f257a5ba
- fix(web): Fix margins of the new list button - @MohamedBassem in 2870332d
- fix(web): Fix the spinner getting hidden during AI summarization - @MohamedBassem in 6310d456
- fix(web): Fix sidebar lists getting opened on edit - @MohamedBassem in 1e2b2df4
- fix: Rename cached content into reader mode - @MohamedBassem in c42c2c3d
- ui(web): Reduce shadows, lighten some fonts, and a smaller editor. #1261 - @MohamedBassem in cd632f29
- docs: Add a small doc about truenas installation - @MohamedBassem in ca58d68f
- fix: Take 2: Attempt to fix darkmode icon for extensions - @MohamedBassem in 1ff9d1db
- fix: Attempt to fix darkmode icon for extensions - @MohamedBassem in 1d9fc9bb
- fix: Fix server side error on clipboard check - @MohamedBassem in 8c4df0ff
- docs: Add docs for how to configure differnt AI providers - @MohamedBassem in bd5f85f5
- fix: FIxed sidebar link to github for nightly builds (#1274) - @hasansino in 06284d28
- docs: Add robots.txt to prevent indexing versioned docs - @MohamedBassem in 40085413
- fix(mcp): Reduce number of MCP tools and add support for pagination - @MohamedBassem in 6bae1196
- fix(mcp): Fix mixed es module issue - @MohamedBassem in 293a4a0d
- release(mcp): Release mcp 0.23.5 - @MohamedBassem in 7584c1f4
- tests: Add some simple crawler tests - @MohamedBassem in d732acd4
- tests: Add tests for various trpc endpoints - @MohamedBassem in 1d780485
- docs: Refresh the API docs - @MohamedBassem in 812354de
- fix: Add includeContent to search endpoint and document it in the docs - @MohamedBassem in ba89a864
- feat: Add import support for Tab Session Manager (#1246) - @yorch in 5e0f4de1
- build: Take over the build command in the installation script - @MohamedBassem in 2328dc34
- feat(web): Add support for merging lists (#1231) - @gomnitrix in 71a47426
- fix(workers): Close browser if connect on demand (#1151) - @Summon528 in dd990b51
- docs: Fix docs build - @MohamedBassem in 209573ee
- feat: Change default text model to 4.1-mini - @MohamedBassem in adc22a76
- fix: Add password salt to the user table - @MohamedBassem in 7e39afa2
- docs: Add documentation for the new rss feed search qualifier - @MohamedBassem in d7244978
- feat: add support for filtering by bookmark age (#1228) - @brandonw3612 in 95f504c0
- fix: Dont download html content by default in the bookmark grid. Fixes #1198 - @MohamedBassem in 5bdb2d94
- fix: Allow using JSON mode for ollama users. Fixes #1160 - @MohamedBassem in 1373a7b2
- docs: Revert 0.23.2 docs and just update 0.23.1 instead - @MohamedBassem in f3c525b7
- docs: Release the new API docs - @MohamedBassem in ae76f946
- docs: Replace the OpenAPI rendering library - @MohamedBassem in 969e774a
- fix(landing): Add missing title tag - @MohamedBassem in 98ac31c3
- chore: hoarder-linux.sh > karakeep-linux.sh v2.1 (#1219) - @vhsdream in f0726635
- build: Allow auto deployment of MCP package to npm - @MohamedBassem in bc5c1a1b
- fix(mcp): Allow accessing asset extracted content in MCP - @MohamedBassem in 7853096c
- feat: Allow editing the extracted content of an asset bookmark - @MohamedBassem in a4d5be3a
- fix(mcp): compact the response of get bookmark lists - @MohamedBassem in 8c6cfc8f
- ui(web): Copy link button greyed out when clipboard not available (#1209) - @ekambains in 46277c74
- fix(mcp): Reduce token usage of the MCP server - @MohamedBassem in e5bacda6
- feat(mobile/android): Add monochrome app icon (#1258) - @SteffoSpieler in 1f92ced3
- docs: replace hoarder with karakeep in CONTRIBUTING.md and FAQ (#1256) - @Mxrk in eeff55f8
- fix(web): fit popover content box to emoji picker size (#1257) - @Mxrk in 6c0638be
- feat: Add an MCP server for karakeep - @MohamedBassem in cf97bace
- feat(web): Optionally add short description to lists (#1225) - @ekambains in a39cd5f3
- docs: add Arch Linux karakeep migration instructions (#1218) - @devome in 56e67956
- fix(landing): Made the year in footer dynamic (#1223) - @ekambains in 33641489
- chore: Replace hoarder with karakeep in github issue templates (#1247) - @Mxrk in 8ffef681
- chore: Rename hoarder packages to karakeep - @MohamedBassem in 755fc36e
- chrore: Update meilisearch version to 13.3 in both docker compose files (#1244) - @Mxrk in 7f569042
- i18n: Add Korean language (#1239) - @jkywalker in 60a0df0b
- docs: Remove hoarder references for docusaurus config preventing the indexing - @MohamedBassem in 1608804f
- build: Regenerate the openapi specs and sdk - @MohamedBassem in a013a338
- fix: Deprecate the updateBookmarkText trpc endpoint and replace it with updateBookmark - @MohamedBassem in 0b769c35
- feat: Allow editing bookmark details - @MohamedBassem in 3207264f
- docs: update Arch Linux installation (#1216) - @devome in 817eb588
- chore: update repo release url to karakeep (#1210) - @meysam81 in d1a814fb
- fix: Do clientside import dedup and parallelize import calls - @MohamedBassem in af631eb2
- feat: Add a search matcher for rss feed bookmarks - @MohamedBassem in af6774fa
- feat(web): A slightly better looking banner when no bookmarks are found - @MohamedBassem in d86628df
- fix(web): Get rid of focus rings for ghost buttons - @MohamedBassem in b17bf7d5
- refactor: Migrate the landing page from nextjs to vite - @MohamedBassem in 3f2d3560
- fix(web): Line clamp sidebar items to a single line - @MohamedBassem in 4e32b409
- fix(installation): Fix the baremetal installation script after the rebrand - @MohamedBassem in 27e5693a
- release(extension): Release version 1.2.4 - @MohamedBassem in d17eb8c5
- fix(extenion): Added white icon for dark mode users (#1176) - @L-K-M in 2753b822
- fix(extension): Update extension logo and name - @MohamedBassem in 4ab5a189
- fix(mobile): Revert mobile app slug name - @MohamedBassem in 019c1353
- fix(mobile): Update karakeep logo and splash screen - @MohamedBassem in 49efe141
- docs: Release the 0.23.1 docs - @MohamedBassem in 27324a96
- chore: Rename mobile and pwa manifests to karakeep - @MohamedBassem in 8a2b8902
- docs: Update installation docs with karakeep - @MohamedBassem in 4e6d3142
- build: Update image source label in the dockerfile - @MohamedBassem in abcb9f26
- fix: Drop the rebranding banner - @MohamedBassem in 8f470b32
- build: Build the new karakeep docker images - @MohamedBassem in a5c3db1e
- readme: More readme fixes for the new name - @MohamedBassem in 14b85a3b
- readme: Update readme and docs for the new name - @MohamedBassem in a3864065