Releases: karakeep-app/karakeep
Release list
0.33.2
0.33.2
This is a patch release for after 0.33.1. It contains the following fixes:
Bug fixes:
- Change default "use max completion tokens" token env variable to
truewhen using the default OpenAI configuration now that we're using 5.6 luna and this flag is required there (#3007). - We're migrating to a custom karakeep chrome container (based on https://github.com/chromedp/docker-headless-shell) now that the old alpine-chrome is no longer fetch-able (and has been long abandoned by the maintainer). Check the migration guide here. The old image will continue to work, but it's recommended that you migrate to the new one as it also upgrades chrome to 151 (compared to 124 in the old image). If you've been using browserless (e.g. on unraid), you're not impacted by this, and you don't need to migrate.
- Large singlefile archives (typically because of videos) used to fail metadata extraction as the parser used to OOM. We strip inline videos now to make the parsing succeed.
- Hardened the link to asset conversion mechanism in the crawler that used to result into silently broken assets. (#3002)
- Pinned nodejs to version 24.18.1 thanks to @eriktews (#2996) to overcome a bug in the latest node 24.19 version (check #2989 for details). The proxmox scripts also were pinned by @MickLesk.
- Karakeep's favicon is now light/dark mode aware, thanks to @ehfreema (#2990).
New features:
- You can now upload custom SingleFile archives to karakeep directly using the CLI.
Changelog
- fix: Set max completion tokens to true when using default openai config (#3007) - @MohamedBassem in 98c0c78
- feat: migrate to a custom karakeep chrome image (#3005) - @MohamedBassem in 951e502
- feat: publish a new karakeep chrome container (#3004) - @MohamedBassem in b6415b3
- feat: favicon adapts to browser theme (#2990) - @ehfreema in ad27c05
- build: Fix crash loop caused by better-sqlite3 and node. (#2996) - @eriktews in 132e566
- fix(crawler): fail on failure to download urls converted to assets (#3002) - @MohamedBassem in f57aad1
- feat(mobile): switch to using context menu in ios - @MohamedBassem in 28e7909
- fix(restate): use logger middleware instead of durable steps - @MohamedBassem in 764ba85
- fix(workers): drop inline media blocks before metadata parsing - @MohamedBassem in 1c0b0a9
- feat(cli): allow importing singlefile archives via the CLI - @MohamedBassem in 5f6ba26
- docs: update intro doc with new features - @MohamedBassem in 3af6f45
- readme: update the readme and docs with the new features - @MohamedBassem in a81f935
- release: release cli, sdk & mcp - @MohamedBassem in b3fbf6b
0.33.1
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,kubernetesandKubernetesall 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, andget-asset. Big thanks to @joestump for the list/tag CRUD work (#2917)! - New readable content API (#2660):
GET /api/v1/bookmarks/{bookmarkId}/contentreturns a bookmark's article content as markdown or plain text, cursor-paginated in LLM-friendly chunks that snap to paragraph boundaries.
- MCP server went from 8 to 29 tools. Newly added: full list CRUD, full tag CRUD, highlights,
- 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_AGENToption 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-minitogpt-5.6-lunawhich 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/httpson 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
TAGSattribute 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_URLfailing 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_SECoption 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 momentorcloudflaretags on failed crawls. - Fixed the MCP
get-bookmark-contenttool 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...
0.32.0
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 (f500129).
- Visual revamp for the "All lists" page showing list privacy settings and number of items in each list (145dda9).
- 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 (98e173d).
- Haptic feedback on mobile sidebar navigation (f91ec53).
- Show "+" in the tag count badges when more pages exist by @zerone0x (432235b).
- 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:
- Reported by @CE2Sec (GHSA-7rx4-c5vx-g8w3)
- Fix blind SSRF in crawler favicon extraction
- Add missing ratelimits for bookmark creation and asset upload APIs
- Reported by @tahirsercan (GHSA-g647-327m-79g9)
- 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 (11dfe74)
- Fix rare crash in the crawler worker (d197f59)
- Increase max feed url length to 2k chars (07454a6)
- 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 (c8a75a0)
- Correctly parse linkwarden collections during import (722fd8c)
- 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 (68e7350)
- 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
attachedByis now correctly migrated (462d713)
For Developers 🛠️
0.31.0
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 - @mohame...
0.30.0
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 add...
0.29.3
Well. Upgrading Nextjs one more time to patch CVE-2025-67779.
0.29.2
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.
0.29.1
0.29.1
A patch release for 0.29.0 with the fix of NextJs CVE: CVE-2025-66478
0.29.0
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_MSandCRAWLER_DOMAIN_RATE_LIMIT_MAX_REQUESTS.
- Configure it with
- 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-tiktokenwhich 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_HOSTNAMESto.. - Fix a worker crash when hitting invalid URLs with proxy enabled.
For Developers 🛠️
- GET
/api/versionendpoint 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_LEVELand 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, 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 f01d96f
- i18n: Sync weblate translations - @HosteD Weblate in e1ad2cf
- feat: autocomplete search terms (#2178) - @MohamedBassem in ebafbe5
- build: switch npm to trusted publishing - @MohamedBassem in 335a84b
- feat: Add automated bookmark backup feature (#2182) - @MohamedBassem in 86a4b39
- fix: making serverConfig readonly - @MohamedBassem in e67c33e
- fix: fix react errors in signin and signup forms - @MohamedBassem in 6ab7984
- fix: separate shared lists in the sidebar (#2180) - @MohamedBassem in 2619f4c
- fix: correctly render asset extracted text in the edit bookmark dialog. fixes #2181 - @MohamedBassem in 9ed338f
- fix: lazy load js-tiktoken in prompts module (#2176) - @MohamedBassem in e2877b4
- fix: fix colors in invitation form - @MohamedBassem in a13a227
- fix: hide archived checkbox in shared lists - @MohamedBassem in adde809
- feat: improve font and colors of sidebar items - @MohamedBassem in 5bea5d3
- fix: Propagate group ids in queue calls (#2177) - @MohamedBassem in 6821257
- feat: Introduce groupId in restate queue (#2168) - @MohamedBassem in 5426875
- fix: support invocation cancellation while awaiting sempahore - @MohamedBassem in 38842f7
- docs: Add LOG_LEVEL to configuration documentation (#2166) - @aa-ko in 6912d0d
- docs: fix link to raycast extension (#1923) - @fivestones in 9fedfc1
- tests: Add a test for listing lists - @MohamedBassem in e16ae2a
- feat: add GET /api/version endpoint (#2167) - @MohamedBassem in 472adec
- fix(mcp): propagate parent id to createList call. fixes: #2144 - @MohamedBassem in 0d14130
- feat(mobile): proper handling for shared list permissions (#2165) - @MohamedBassem in c5c71ba
- feat(mobile): Add highlights page to mobile app (#2156) - @MohamedBassem in 8a5a109
- feat: A better looking 404 page - @MohamedBassem in 7f555f5
- fix: hide manage collaborators option for smart lists - @MohamedBassem in 2b38c00
- fix: Hide shared lists where user is a viewer in Manage Lists dialog (#2164) - @MohamedBassem in e4db9bf
- feat(mobile): Add AI summary field to mobile bookmark info (#2157) - @MohamedBassem in 45081dc
- feat(mobile): Add tags screen to mobile app (#2163) - @MohamedBassem in ad66f78
- feat: Add notes feature to highlights (#2154) - @MohamedBassem in de5ebbc
- feat(mobile): Add smart list creation in mobile app (#2153) - @MohamedBassem in 48ab8a1
- feat: Add search bar to highlights page (#2155) - @MohamedBassem in ed6a3bf
- fix: hide collaborator emails from non-owners (#2160) - @MohamedBassem in 8ab5df6
- feat: Add invitation approval for shared lists (#2152) - @MohamedBassem in 5f0934a
- deps: upgrade oxlint - @MohamedBassem in daee8e7
- fix: add a way to allowlist all domains from ip validation - @MohamedBassem in 67b8a3c
- fix: use kbd for editor card - @MohamedBassem in 3345377
- fix: drop journal retention for sempahore and id providers - @MohamedBassem in 1b44eaf
- refactor: remove the PrivacyAware interface - @MohamedBassem in 815e196
- feat: Add collaborative lists (#2146) - @MohamedBassem in 88c73e2
- deps: upgrade hono and playwright - @MohamedBassem in cc8fee0
- deps: Upgrade typescript to 5.9 - @MohamedBassem in 391af8a
- build: Improve docker caching (#2140) - @MohamedBassem in 6cccb9f
- fix: fix hydration error in admin user list - @MohamedBassem in 12d09a7
- feat: import from mymind (#2138) - @MohamedBassem in 0c80f51
- feat: add Prometheus counter for HTTP status codes (#2117) - @MohamedBassem in 4350666
- fix(mobile): upgrade react-native-pdf to v7 to fix page alignment - @MohamedBassem in 4c6ef25
- fix(mobile): fix app memory page size compatibility (#2135) - @MohamedBassem in fbd12ea
- release(mobile): Bump mobile version to 1.8.2 - @MohamedBassem in 76c291a
- fix: remove incorrect array destructuring in mobile search (#2124) - @MohamedBassem in 07390ae
- feat: correct default prom metrics from web and worker containers - @MohamedBassem in c34f70d
- fix: stop retrying indefinitely in restate queues - @MohamedBassem in d4b7b89
- fix: fix crash in crawler on invalid URL in matchesNoProxy - @MohamedBassem in d0f71a4
- feat: add crawler domain rate limiting (#2115) - @MohamedBassem in 4cf0856
- refactor: Allow runner functions to return results to onComplete - @MohamedBassem in b28cd03
- refactor: Extract ratelimiter into separate plugin (#2112) - @MohamedBassem in 0316148
- feat(extension): Add custom header support for extension (#2111) - @MohamedBassem in ec87813
- feat: Add bookmark sources statistics section (#2110) - @MohamedBassem in 725b521
- feat: Add page titles (#2109) - @MohamedBassem in 3083be0
- feat: add failed_permanent metric for worker monitoring (#2107) - @MohamedBassem in 1b8129a
- release(docs): release the 0.28 docs - @MohamedBassem in d9ef832
- release(extension): Release version 1.7.1 - @MohamedBassem in 7339d1d
- release(mobile): Bump mobile version to 1.8.1 - @MohamedBassem in f06b8ea
0.28.0
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 viaCRAWLER_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=truein your.envfile to use the new models. This is eventually going to become the default.
- You'll need to set
- 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, 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: standardize US English translations to professional tone - @MohamedBassem in 4f025f5
- i18n: Sync weblate translations - @weblate in 5387c98
- tests: fix crawling and search e2e tests (#2105) - @MohamedBassem in c4bee9f
- feat(extension): Allow writing notes directly in the extension (#2104) - @MohamedBassem in 098e56a
- fix(mobile): fix default address not correctly stored in settings - @MohamedBassem in a220319
- feat(mobile): add custom headers configuration in sign-in screen (#2103) - @MohamedBassem in ec621bf
- tests: Fix failing test - @MohamedBassem in 27ed0a1
- feat: Add what's new modal in the sidebar (#2099) - @MohamedBassem in 474f642
- feat: Add support for user uploaded files (#2100) - @MohamedBassem in 31960fc
- refactor: consolidate multiple karakeep plugins into one package (#2101) - @MohamedBassem in 99413db
- fix: metascraper logo to go through proxy if one configured. fixes #1863 - @MohamedBassem in 737b031
- feat(extension): add tab bookmark badge indicator (#1745) - @qixing-jk in f0b0959
- fix: restore image size in grid layout - @MohamedBassem in 2056582
- deps: Upgrade react-query to 5.90 - @MohamedBassem in 560900b
- feat: Support inline toggling for todos. fixes #1931 (#1933) - @BOTkirial in 393bbd9
- fix: fix monolith to respect crawler proxy - @MohamedBassem in 085c832
- feat(rss): Add import tags from RSS feed categories (#2031) - @MohamedBassem in 5358682
- fix: fix crash in search input when query contains a percent. fixes #1941 - @MohamedBassem in 633686b
- feat: Add view options to show tag/title and control image fit. Fixes #1960 - @MohamedBassem in 34d2b48
- refactor: improve the userLocalSetting server functions - @MohamedBassem in bb00c99
- feat: Make search job timeout configurable - @MohamedBassem in 965c603
- feat: display notes on bookmark card (#2083) - @xuatz in 33f4077
- fix: Stricter SSRF validation (#2082) - @MohamedBassem in b63a49f
- fix: correctly handle composition in search input. fixes #2048 - @MohamedBassem in c6ebceb
- fix: browser service connection check using dns instead. Fixes #2080 - @MohamedBassem in c9c73d4
- fix: More memory optimizations for crawler worker. #1748 - @MohamedBassem in 40d548b
- fix: fix screenshot filepath in crawler - @MohamedBassem in 0704b8b
- docs: Add Azure configuration details for OpenAI-compatible API (#2072) - @cloudchristoph in bd9c933
- fix: Respect abort signal in admin maintenance jobs - @MohamedBassem in 8a330dc
- deps: Upgrade metascraper plugins - @MohamedBassem in e43c7e0
- deps: Upgrade metascraper-readability 5.49.6 - @MohamedBassem in 6d234de
- feat: Allow configuring inline asset size threshold - @MohamedBassem in cf3ffff
- feat: Add admin maintenance job to migrate large inline HTML (#2071) - @MohamedBassem in 2b769cb
- fix(inferance): skip token slicing when content is already witin max length - @MohamedBassem in 1713600
- refactor: generalize tidy assets queue into admin maintenance (#2059) - @MohamedBassem in 6ea5dd1
- fix: update OpenAI API to use max_completion_tokens instead of max_tokens (#2000) - @BenjaminMichaelis in 046c29d
- fix(restate): Fix priority for restate queue - @MohamedBassem in 8c0aae3
- fix(restate): Ensure that the semaphore and idProvider services are ingress private - @MohamedBassem in cdf8121
- feat: Add source field to track bookmark creation sources (#2037) - @MohamedBassem in 2defc24
- feat: support passing multiple proxy values (#2039) - @MohamedBassem in c14b693
- deps: Upgrade oxlint to 1.22 - @MohamedBassem in 88a7ffe
- feat: Add service dependency checks in the server overview page - @MohamedBassem in fda1c85
- fix(web): Add w-full to tags editor to prevent unusable narrow width (#2035) - @MohamedBassem in 7ee9416
- fix(api): Return 200 when bookmark already exists instead of 200 - @MohamedBassem in f2dec26
- tests: Add a test for the GET /bookmarks/bookmarkId/lists api - @MohamedBassem in d578038
- fix(api): Document the API for getting lists of a bookmark. fixes #2030 - @MohamedBassem in 7f138b9
- feat: make list dropdown searchable in Manage Lists modal (#2029) - @MohamedBassem in 87053d2
- fix: fix dev script shebang for better compatibility (#2019) - @maya-doshi in dcddda5
- fix: Correct grammatical errors in ...





