Repository navigation
feat(browser-extension): request host permission at runtime for client side crawling - #2784
Conversation
…t-side crawling Move `<all_urls>` from `host_permissions` to `optional_host_permissions` so it isn't requested at install time. The permission is now requested via `chrome.permissions.request()` when the user enables client-side crawling in the extension settings, and removed when they disable it. The settings toggle and the capture path both gate on whether the permission is actually granted. https://claude.ai/code/session_01NnQnr1B9KSRriTaQkZM6AP
|
ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
WalkthroughThe PR converts the browser extension's host permission from required to optional, allowing users to grant URL access on-demand. A new permissions utility wraps Chrome APIs; OptionsPage manages permission state with a toggle that prompts users; SavePage gates single-file page capture on current permission status. ChangesOptional Host Permissions for Client-Side Crawling
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Tip 💬 Introducing Slack Agent: The best way for teams to turn conversations into code.Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.
Built for teams:
One agent for your entire SDLC. Right inside Slack. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR moves the
Confidence Score: 4/5Safe to merge; the runtime permission gating in both OptionsPage and SavePage is correct, but existing users who had client-side crawling enabled will silently lose the feature on update with no in-app explanation. Chrome revokes
Important Files Changed
Prompt To Fix All With AIFix the following 1 code review issue. Work through them one at a time, proposing concise fixes.
---
### Issue 1 of 1
apps/browser-extension/manifest.json:48
**Silent feature regression for existing users**
When the extension updates, Chrome revokes `<all_urls>` for any user who previously had it as a required permission, because it is no longer declared in `host_permissions`. Users who had `useSingleFile: true` stored in settings will find that client-side crawling silently stops working after the update — the `OptionsPage` will show the switch as OFF (because `clientSideCrawlingEnabled = settings.useSingleFile && hostPermissionGranted = true && false`), but their stored `useSingleFile: true` value is never cleaned up or explained. Consider adding startup migration logic in `usePluginSettings` (or a one-time prompt in `OptionsPage`) that detects `useSingleFile: true` with the permission absent and either clears the setting or re-requests the permission with user guidance.
Reviews (1): Last reviewed commit: "feat(browser-extension): request host pe..." | Re-trigger Greptile |
| }, | ||
| "permissions": ["storage", "tabs", "contextMenus", "activeTab", "scripting"], | ||
| "host_permissions": ["<all_urls>"], | ||
| "optional_host_permissions": ["<all_urls>"], |
There was a problem hiding this comment.
Silent feature regression for existing users
When the extension updates, Chrome revokes <all_urls> for any user who previously had it as a required permission, because it is no longer declared in host_permissions. Users who had useSingleFile: true stored in settings will find that client-side crawling silently stops working after the update — the OptionsPage will show the switch as OFF (because clientSideCrawlingEnabled = settings.useSingleFile && hostPermissionGranted = true && false), but their stored useSingleFile: true value is never cleaned up or explained. Consider adding startup migration logic in usePluginSettings (or a one-time prompt in OptionsPage) that detects useSingleFile: true with the permission absent and either clears the setting or re-requests the permission with user guidance.
Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/browser-extension/manifest.json
Line: 48
Comment:
**Silent feature regression for existing users**
When the extension updates, Chrome revokes `<all_urls>` for any user who previously had it as a required permission, because it is no longer declared in `host_permissions`. Users who had `useSingleFile: true` stored in settings will find that client-side crawling silently stops working after the update — the `OptionsPage` will show the switch as OFF (because `clientSideCrawlingEnabled = settings.useSingleFile && hostPermissionGranted = true && false`), but their stored `useSingleFile: true` value is never cleaned up or explained. Consider adding startup migration logic in `usePluginSettings` (or a one-time prompt in `OptionsPage`) that detects `useSingleFile: true` with the permission absent and either clears the setting or re-requests the permission with user guidance.
How can I resolve this? If you propose a fix, please make it concise.* fix: add support for instapaper archived status and folders * fix(mobile): truncate bookmark title with tailwind shrink (karakeep-app#2699) * fix(mobile): remove react-native-keyboard-controller patch (karakeep-app#2697) The upstream fix for the status bar inset issue was merged and released in v1.21.5, so our local patch is no longer needed. Closes karakeep-app#2581 * docs(mobile): add SENTRY_DISABLE_AUTO_UPLOAD=true to build apk without sentry dsn (karakeep-app#2700) * docs(mobile): add SENTRY_DISABLE_AUTO_UPLOAD=true to build apk without sentry dsn * include pr suggestion * put SENTRY_DISABLE_AUTO_UPLOAD=true in package.json scripts instead * deps: upgrade to zod 4 (karakeep-app#2689) * deps: upgrade to zod 4 * fix: preserve zod 4 schema compatibility Use safeExtend where refined signup schemas are extended so the affected modules can initialize safely under Zod 4. Keep the generated OpenAPI output aligned with runtime validation and centralize the zod-to-openapi initialization. * chore: freshen up docker-compose.yml for local dev purposes (karakeep-app#2149) * feat(mobile): add keep screen on toggle for bookmark viewing (karakeep-app#2691) * feat(mobile): add keep screen on toggle for bookmark viewing Adds a Reading-section toggle that activates expo-keep-awake while a bookmark is open, covering all in-app views (reader, browser, screenshot, archive, pdf, text, asset). Defaults off; releases the wake lock as soon as the user navigates away from the bookmark detail screen. Closes karakeep-app#2650 * fix(mobile): disable keep-screen-on toggle while settings are hydrating Prevents writing stale default settings to SecureStore if the user toggles before hydration completes. * fix: add clawhub metadata to karakeep skill * fix: fix clawhub skill yaml * docs: add skills to docs * docs: Update worker list in the environment variable reference (karakeep-app#2710) * deps: upgrade oxlint and oxfmt * fix: add missing source to createBookmarks from import * feat: Add Readwise Reader import (karakeep-app#2690) Co-authored-by: Luis Zuniga <wichogzf@gmail.com> * fix: deduplicate crawl jobs using idempotency key (karakeep-app#2678) * feat: add OneTab import support (karakeep-app#2495) * feat(import): add OneTab import support Adds a OneTab import card to the ImportExport settings page. Implements a parser for OneTab's "URL | Title" line format with deduplication, and registers "onetab" as an import source. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: add tests for the inference worker * fix: add ability to manually finalize/delete staged import sessions (karakeep-app#2713) * fix(docker): add `ffmpeg` as required by `yt-dlp` (karakeep-app#2721) * fix: invalidate existing password reset tokens before issuing a new one (karakeep-app#2722) - Wrap reset token replacement in a transaction - Delete any prior tokens for the user before inserting the new token * fix: add ratelimiting for the changePassword endpoint (karakeep-app#2723) * fix: sanitize user names before storing them (karakeep-app#2724) * Sanitize user names before storing them - Strip HTML from signup and OAuth display names - Enforce non-empty plain-text names in validation - Add tests for sanitized and HTML-only name inputs * more changes * Harden user name validation * more changes * fix: add data: to style-src and font-src CSP directives in serveAsset (karakeep-app#2657) Monolith-generated full-page archives inline stylesheets and fonts as data: URIs. The previous CSP blocked these, causing broken rendering. Adding data: to style-src and a new font-src directive unblocks them, matching the precedent set by img-src which already includes data:. Fixes: karakeep-app#2621 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: fix pnpm symlink conflict (karakeep-app#2725) * fix: include userId in ratelimit key if the user is authed (karakeep-app#2726) * feat(mcp): add update-bookmark tool (karakeep-app#2717) Wraps PATCH /bookmarks/{bookmarkId} so MCP clients can modify an existing bookmark instead of only creating/reading one. Exposes the commonly useful patchable fields (title, note, summary, archived, favourited, url, description, author, publisher, createdAt); less common/destructive ones (text, assetContent, datePublished, dateModified) are intentionally omitted to reduce accidental clobbering of crawler-populated data. The PATCH response schema does not include tags/content/assets, so the tool follows up with a GET to return a full compactBookmark view of the updated record. * fix: use relative path for logout redirect to avoid port mismatch (karakeep-app#2655) signOut({ redirect: false }) returns an absolute URL constructed from NEXTAUTH_URL (e.g. http://localhost:3000/). When Docker remaps an external port to the internal one, this sends users to the wrong port. Using router.push('/') lets Next.js resolve against the user's origin. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(web): auto-add bookmark to list on selection (karakeep-app#2629) * feat(web): auto-add bookmark to list on selection Remove the 'Add' button from Manage Lists modal. When a user selects a list from the dropdown, the bookmark is now automatically added to that list, simplifying the user experience. Users can still remove a bookmark from a list by clicking the X button next to the list name. Fixes karakeep-app#2604 * fix: add loading state and prevent duplicate submission in ManageListsModal - Added isPending state from useAddBookmarkToList hook - Added duplicate submission prevention in onChange handler - Added disabled prop to BookmarkListSelector component * style: fix indentation in useAddBookmarkToList callback - Fix incorrect indentation of onSuccess and onError callbacks - Add trailing newline at end of file * fix: address review comments for PR karakeep-app#2629 - Add trailing newline at end of file - Remove redundant in-flight guard check (disabled prop handles it) - Add guard for getPathById to prevent crash on stale cache - Disable interactions while list membership data is loading * fix: use translation for DialogTitle in ManageListsModal * fix: add isLoading guard to onChange callback in BookmarkListSelector * fix(web): improve ManageListsModal accessibility and rendering - Add aria-label to remove button for accessibility (CodeRabbit comment 3006737430) - Remove allLists gating to allow list.name fallback to render (CodeRabbit comment 3006737429) - Use optional chaining for path lookup * feat(extension): add manual save toggle for browser extension (karakeep-app#2693) * feat: add manual save toggle for browser extension * fix: add check for appending ellipses * chore: add PR template inspired from immich * chore: fix PR template path * feat: Add native single-file support to browser extension (karakeep-app#2197) * feat: Add native SingleFile support to browser extension This commit integrates single-file-core into the browser extension, allowing users to capture complete web page archives when saving bookmarks. * fix: truncate urls in crawler logs * feat: change the default new list emoji to folder * feat: add support for configuring OpenAI reasoning effort (karakeep-app#2718) * Add support for configuring OpenAI reasoning effort * Update docs' formatting Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * minor fixes * minor fixes --------- Co-authored-by: Luis Zuniga <wichogzf@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix: skip url getContentType fetch if precrawledArchiveAssetId exists (karakeep-app#2580) * deps: upgrade astro to 6.1.6. fixes karakeep-app#2728 * fix: fix broken cache invalidation requiring refresh after adding a bookmark to a tag or a list * feat: add granular API key scopes (karakeep-app#2731) * fix: fix promise race leaks in the worker (karakeep-app#2737) * fix: change the archive button in the manage lists dialog to be a secondary button * chore: add portless pnpm scripts * feat(mobile): customizable reader toolbar (karakeep-app#2527) * feat(mobile): add auto-hiding reader toolbar with customizable actions and overflow menu Redesign the bookmark reader bottom bar with configurable toolbar actions, an overflow ellipsis menu using native MenuView, and auto-hide on scroll. Add toolbar settings page for reordering visible/overflow actions. Support iOS 26 glass pill styling and transparent headers with edge-to-edge content. * Update apps/mobile/components/bookmarks/BottomActions.tsx Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * fix comment * fix(mobile): address PR review findings for reader toolbar - Fix silent fall-through when sharing non-image/non-pdf assets - Pass contentInsetTop to browser/archive WebViews for iOS 26 - Auto-inject missing action IDs into overflow on settings load - Extract NAV_BAR_HEIGHT constant to replace magic number 44 - Remove unused ownerOnly/linkOnly from ToolbarActionMeta - Extract triggerHaptic() helper to handle async catch - Deduplicate image/PDF share logic with finally cleanup - Add console.warn for unknown menu action events - Simplify headerPlatformOptions to plain isIOS26 ternary - Fix inaccurate comment about top/bottom padding * remove margin around text view * fix bottom inset * fix reading progress bar regression, add small gap * Add redesigned reading progress pill, blur effect for iOS 18 and lower * small review fixes * fix icon colors in dark mode * Add missing @/lib/ios module for isIOS26 platform detection * downgrade expo-blur to match expo * Update to stable expo-glass-effect version * fix(mobile): close reader view after archiving bookmark * chore(mobile): remove auto-hiding header/footer and pill redesign from toolbar PR Split these concerns out so this branch lands only the customizable toolbar. Auto-hiding native header, auto-hiding bottom toolbar, and the redesigned continue-reading pill will return together in a follow-up reader-chrome PR, where they belong architecturally as a single feature. * fix footer padding on iOS 26 * unify handling of archive and fav in bottom actions * abstract share logic * dynamic labels depending on bookmark state * fix overflow submenu in android * review comments * feat: add metrics for sub status * chore: add infra for the event logger * feat: add exhaustive event logging * fix: fix nodejs bundling for the eventLogger * fix: upgrade zod resolver to fix form validations (karakeep-app#2744) * fix: bump up zod resolver * fix: follow greptile review * fix: reject user deletion with active subscription * chore: add event logging for bookmark summarization * fix: fix subscription tranisiton event logging * feat(mobile): revamp search and navigation chrome (karakeep-app#2685) * FAB styling looks good, still working on search * Finish pr * use latest expo-glass-effect version * feat(mobile): auto-focus search bar when iOS search tab gains focus * fix(mobile): address PR review feedback - Fix search history: save new terms on blur via useEffect in BookmarkSearchResults and index.ios.tsx onBlur handler - Fix keepPreviousData: use isPending instead of isFetching for spinner guards so stale results stay visible during refetches - Add enabled guard on search queries to avoid firing on empty input - Increase debounce from 10ms to 300ms on iOS search tab - Add accessibility labels/roles to close buttons in search and InlineSearch - Increase ProfileAvatarButton tap target to 44px minimum, add a11y props, convert static styles to Tailwind - Fix tags empty state to show "No tags match your search" when filtering - Fix stale comment in Android search stub * feat(mobile): prevent iOS tab bar from shrinking and resize FAB Disable tab bar minimize behavior on iOS so it stays at full height when scrolling. Enlarge the FAB to better match the native search button size and adjust its positioning. * fix broken ProfileAvatarButton on iOS due to bad CodeRabbit suggestion * fix(mobile): lock FAB glass effect to app color scheme Pin GlassView and BlurView to the app's current color scheme instead of adapting to background content, preventing the FAB from switching to light appearance over white content in dark mode. * fix(mobile): add tintColor to FAB glass effect for consistent appearance Use GlassView tintColor to prevent the FAB from adapting to background content, keeping it dark in dark mode and light in light mode regardless of what's behind it. * fix(mobile): use PlatformColor for FAB icon vibrancy on iOS Replace hardcoded foreground color with PlatformColor("label") so the FAB icon participates in UIKit vibrancy and stays legible against the adaptive liquid glass effect. Revert FAB GlassView to its clean default with no colorScheme or tintColor overrides. * fix(mobile): trim search term in onBlur before persisting The onBlur handler checked trim().length but passed the untrimmed value to addTerm(), allowing whitespace-padded terms into search history. * revert bad change in lists * revert tag spacing change Co-authored-by: Copilot <copilot@github.com> * remove unused search component * fix broken view switching in ios search results * drop the search screen stack from root layout * remove global search * search on type * remove duplicate expo-blur from package.json * restore header for ios --------- Co-authored-by: Copilot <copilot@github.com> * fix: debounce bulk query invalidations (karakeep-app#2745) * Debounce bulk query invalidations * Avoid scheduling predicate invalidations * Document predicate invalidation bypass * feat: Allow multiple lists for Rule Engine karakeep-app#2490 (karakeep-app#2620) * feat: Allow multiple lists for Rule Engine karakeep-app#2490 feat: Allow multiple lists for Rule Engine karakeep-app#2490 feat: Allow multiple lists for Rule Engine karakeep-app#2490 * re-add db migration * codex review comments * chore: use .gitignore as source of truth for oxfmt and oxlint (karakeep-app#2740) * chore: use .gitignore as source of truth for oxfmt and oxlint Wire `--ignore-path=../../.gitignore` into every per-package format/lint script and prune the duplicated `ignorePatterns` arrays from each oxfmt/oxlint config. For oxfmt in packages with a local `.gitignore` (mobile, browser-extension, cli, mcp, sdk, benchmarks, e2e_tests), pass the local file as a second `--ignore-path` too. oxlint only accepts one `--ignore-path`, so mobile retains `ios/`, `android/` etc. in its `ignorePatterns`. Observed issue: files in the `.astro/` directory in apps/landing were getting flagged by the format check in the precommit hook, because oxfmt running from the package cwd does not auto-discover the root `.gitignore` (it only reads a `.gitignore` in cwd). The explicit `--ignore-path` makes the gitignore policy consistent regardless of the invocation directory. * tests: add a test for browser rendering * fix(ui): resolve text clipping in bookmark cards (karakeep-app#2748) * fix: prevent text overflow * Update apps/web/components/dashboard/bookmarks/NotePreview.tsx Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * refactor: correct formatting --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * feat: redesign list and tag page headers (karakeep-app#2749) * feat: redesign list and tag page headers Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(landing): add safari links to landing * deps: upgrade protobufjs * fix: fix allow the adblocker to run after request interception * feat: Add agentic skills links to the landing page (karakeep-app#2761) * fix: fix SSRF handling with redirects in crawler worker (karakeep-app#2759) * feat(mobile): open links and images in in-app browser (karakeep-app#2696) * feat(mobile): open links and images in in-app browser instead of navigating away Links and media clicked within bookmark reader, browser, and archive views now open in an in-app browser overlay (expo-web-browser) or fullscreen image viewer instead of navigating the current view away from the bookmark content. * fix(mobile): address PR review comments for link handling Use origin-based comparison instead of one-shot hasLoaded flag in BookmarkLinkBrowserPreview to correctly handle HTTP redirects on iOS. Remove dead href.startsWith("#") branch in BookmarkHtmlHighlighterDom. Combine duplicate imports from react-native-webview/lib/WebViewTypes. * fix: format BookmarkLinkPreview import * fix: extract bookmarkUrl to preserve type narrowing in useCallback * fix(mobile): allow text selection on links for highlighting Strip href from links and store in data-href so the browser treats them as regular selectable text instead of activating native link gestures (iOS preview sheet, Android drag-and-drop). A MutationObserver re-strips hrefs after DOM changes from highlight effects. * feat: Add CLI auth config support (karakeep-app#2751) * fix: typo in docker docs (karakeep-app#2762) * fix: fix timezone handling in date displays across the app (karakeep-app#2682) * fix: use safe favicon resolution in metascraper (karakeep-app#2763) * fix: use correct env variable syntax for perplexity (karakeep-app#2765) * fix: use correct env variable syntax * fix: env syntax for perplexity base url * fix: harden video worker redirect validation against SSRF (karakeep-app#2760) * refactor: refactor bulk actions to store bookmark ids (karakeep-app#2767) * fix(mobile): fix scrolling in manage tags page in ios * docs: add a comment to security docs about SSRF mitigations * feat: add keyboard shortcuts (karakeep-app#2750) * i18n: Sync weblate translations Co-authored-by: CircleCrop <guhengting@gmail.com> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: OpenAI <noreply-mt-openai@weblate.org> Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ar/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/cs/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/da/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/de/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/el/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/en_US/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/es/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/fa/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/fi/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/fr/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ga/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/gl/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/hr/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/hu/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/it/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ja/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ko/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/nl/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/pl/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/pt/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ru/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/sk/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/sl/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/sv/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/tr/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/uk/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/vi/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/zh_Hant/ Translation: Karakeep/Karakeep * i18n: fix automated i18n strings * feat(web): add more details to the all lists page * fix(crawler): proper handling for proxy auth with CDP interceptions * release(docs): release the 0.32 docs * release: release cli, sdk, mobile and extension * release(cli): release CLI 0.32.0 * docs: minor docs update to mention the skills and the new singlefile integration * feat(browser-extension): request host permission at runtime for client side crawling (karakeep-app#2784) Move `<all_urls>` from `host_permissions` to `optional_host_permissions` so it isn't requested at install time. The permission is now requested via `chrome.permissions.request()` when the user enables client-side crawling in the extension settings, and removed when they disable it. The settings toggle and the capture path both gate on whether the permission is actually granted. https://claude.ai/code/session_01NnQnr1B9KSRriTaQkZM6AP Co-authored-by: Claude <noreply@anthropic.com> * release(extension): Release version 1.2.11 * docs: update screenshots in the docs * fix(mobile): fix insets on new iOS settings formSheet modal (karakeep-app#2793) The settings screen is presented as an iOS formSheet with an opaque, non-large header (since 649efb8). iOS sizes the formSheet's inner content view ~headerHeight pixels taller than the visible sheet area, so the bottom of the settings list was clipped behind the sheet's bottom edge. contentInsetAdjustmentBehavior="automatic" correctly handles the top (adding the right top inset to clear the opaque header), but does not add a corresponding bottom inset for the formSheet's invisible bottom region. Adding useHeaderHeight() to paddingBottom pushes the trailing content up to a visible position. * fix(mobile): stack Upload Image Quality slider on two lines (karakeep-app#2794) The MEDIA → Upload Image Quality row in mobile settings crammed the label, percentage, and slider onto one horizontal line, leaving the slider only a few dozen pixels wide on phone widths. Switch the row to a vertical layout: label + percentage on top, full-width slider beneath. * feat(mobile): tablet/iPad UI polish for toolbar and FAB (karakeep-app#2788) * Set max width for reader toolbar on tablets * fix(mobile): remove FAB bottom inset on iPad iPad's tab bar geometry doesn't need the extra 57–60pt lift the iPhone FAB uses. * fix(mobile): give reader toolbar icons proper spacing on iPad Replace the inner row's width/maxWidth + space-between approach with an intrinsic gap. The earlier cap caused the row to collapse to its natural icon width inside the hug-fit GlassView, leaving icons cramped against each other. Using `gap: 28` gives each icon real breathing room and lets the pill size to its contents naturally. * fix(mobile): fix formsheet padding in manage_lists, manage_tags and info sheets * fix(mobile): fix color of list separator in recent searches list * fix(mobile): improve perf of manage_tags page * release(mobile): release mobile v1.9.4 * fix: serve unoptimized nextjs images This is a temporary fix to be able to patch the recent NextJS security update until a proper fix is available. * deps: upgrade nextjs to 15.5.18 * docs: update SECURITY.md * feat(db): add PostgreSQL migration for upstream schema sync Adds PG equivalent of the SQLite migrations 0083 (apiKey scopes) and 0084 (rule engine multi-list refactor) brought in by the upstream merge. The auto-generated migration was missing two things needed for parity with the SQLite version: 1. A SQL DEFAULT for apiKey.scopes to backfill existing rows (matches SQLite's `DEFAULT '["fullaccess"]'`). 2. Data migration for the event JSON in ruleEngineRules: delete rules with empty listId in addedToList/removedFromList events, then transform single listId to a listIds array. Both data-migration steps mirror what upstream's SQLite migration does using SQLite's json_extract/json_set, translated to PG's jsonb operators. Verified with `drizzle-kit check` (schema/migration consistent) and the schema-sync test (column lists match across dialects). * fix(docker): pin postgres overlay to v18 and fix volume mount Bumps the PostgreSQL overlay from postgres:16-alpine to postgres:18-alpine to match the production deployment, and fixes the volume mount that PG18 rejects. PG18+ stores data in a version-specific subdirectory under /var/lib/postgresql (e.g. /var/lib/postgresql/18/docker). The image refuses to start if the volume is mounted at the legacy /var/lib/postgresql/data path, even on a fresh install. Mounting one level up lets PG18 manage its own subdirectory layout. Also documents the migration-smoke-test command pattern in the overlay header: pair the overlay with a base compose file and `up postgres -d` to bring up just postgres, then run `pnpm --filter=@karakeep/db migrate` from the host. Verified end-to-end against postgres:18-alpine (PG 18.4). Upgrading an existing PG16 fork deployment to this overlay is a breaking change — the volume layout is incompatible and requires pg_upgrade or a dump/restore. --------- Co-authored-by: Mohamed Bassem <me@mbassem.com> Co-authored-by: xuatz <xzlow10@gmail.com> Co-authored-by: Evan Simkowitz <esimkowitz@users.noreply.github.com> Co-authored-by: Max <43565398+maxim-mityutko@users.noreply.github.com> Co-authored-by: Luis G. Zúñiga <github@nuevenueves.com> Co-authored-by: Luis Zuniga <wichogzf@gmail.com> Co-authored-by: Nikhil Chowdhury <54472147+NikhilChowdhury27@users.noreply.github.com> Co-authored-by: apo-mak <apo-mak@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Maxime Pinot <contact@maximepinot.com> Co-authored-by: Om Mishra <152969928+howwohmm@users.noreply.github.com> Co-authored-by: Vladimir Balko <147043796+vbalko-claimate@users.noreply.github.com> Co-authored-by: 冰水泡枸杞 <87858694+xingzihai@users.noreply.github.com> Co-authored-by: Morgan Kesler <keslerm@aegiszero.is> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: GSAlex <GSAlex@users.noreply.github.com> Co-authored-by: Beluga <mikhailbialouwork@gmail.com> Co-authored-by: Copilot <copilot@github.com> Co-authored-by: Ahmed Abdelkarim <ahmad.abdelkarim89@gmail.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Mark :) <Mxrk@users.noreply.github.com> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: CircleCrop <guhengting@gmail.com> Co-authored-by: OpenAI <noreply-mt-openai@weblate.org>
… 0.33.1) (#498) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/karakeep-app/karakeep](https://github.com/karakeep-app/karakeep) | minor | `0.32.0` → `0.33.1` | --- >⚠️ **Warning** > > Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/7) for more information. --- ### Release Notes <details> <summary>karakeep-app/karakeep (ghcr.io/karakeep-app/karakeep)</summary> ### [`v0.33.1`](https://github.com/karakeep-app/karakeep/releases/tag/v0.33.1): 0.33.1 [Compare Source](karakeep-app/karakeep@v0.32.0...v0.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](https://github.com/esimkowitz), [@​joestump](https://github.com/joestump), [@​zerone0x](https://github.com/zerone0x), [@​ElectricTea](https://github.com/ElectricTea), [@​optix2000](https://github.com/optix2000), [@​thiswillbeyourgithub](https://github.com/thiswillbeyourgithub), [@​jcgoodwin86](https://github.com/jcgoodwin86), [@​InventorB](https://github.com/InventorB), [@​VrtxOmega](https://github.com/VrtxOmega), [@​pike00](https://github.com/pike00), [@​KayMi](https://github.com/KayMi), [@​TanishValesha](https://github.com/TanishValesha), [@​mahirhir](https://github.com/mahirhir), [@​moduvoice](https://github.com/moduvoice), [@​eviaaaaa](https://github.com/eviaaaaa), [@​archit-goyal](https://github.com/archit-goyal), [@​CertStone](https://github.com/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 ☕️](https://buymeacoffee.com/mbassem) or via GitHub [here](https://github.com/sponsors/MohamedBassem). Also share Karakeep's managed offering (☁️ [link](https://cloud.karakeep.app)) with your friends who're not into selfhosting. <a href="https://www.buymeacoffee.com/mbassem" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" width="auto" height="50" ></a> ##### New Features 🚀 - **Semantic Search** ([#​2959](karakeep-app/karakeep#2959), [#​2960](karakeep-app/karakeep#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](karakeep-app/karakeep#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`, `kubernetes` and `Kubernetes` all coexisting). This also requires embeddings to be enabled, read the upgrade notes for details about how them. - **Cleaner saved pages** ([#​2973](karakeep-app/karakeep#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](karakeep-app/karakeep#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](karakeep-app/karakeep#2837)): switch between the existing card layout and a new compact list layout. *Note: the default is now the list layout.* - **Sorting** ([#​2777](karakeep-app/karakeep#2777)): sort your bookmarks newest-first or oldest-first (overdue, sorry!). - **Save from clipboard** ([#​2868](karakeep-app/karakeep#2868)): a new *Clipboard* entry in the "+" menu saves whatever is in your clipboard in one tap. Thanks [@​InventorB](https://github.com/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`, and `get-asset`. Big thanks to [@​joestump](https://github.com/joestump) for the list/tag CRUD work ([#​2917](karakeep-app/karakeep#2917))! - **New readable content API** ([#​2660](karakeep-app/karakeep#2660)): `GET /api/v1/bookmarks/{bookmarkId}/content` returns a bookmark's article content as markdown or plain text, cursor-paginated in LLM-friendly chunks that snap to paragraph boundaries. - **Much faster bookmark metadata** ([#​2932](karakeep-app/karakeep#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_AGENT` option 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-mini` to `gpt-5.6-luna` which 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](karakeep-app/karakeep#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](karakeep-app/karakeep#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](https://github.com/esimkowitz) ([#​2788](karakeep-app/karakeep#2788), [#​2793](karakeep-app/karakeep#2793), [#​2794](karakeep-app/karakeep#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](karakeep-app/karakeep#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](karakeep-app/karakeep#2945)). Reported by [@​celinke97](https://github.com/celinke97) (GHSA-vc53-r298-c6h6). - API key and signed asset token verification now use timing-safe comparisons, reported by [@​xancyber](https://github.com/xancyber) (GHSA-hjm9-gc55-5hgv). - Bookmark URLs are now restricted to `http`/`https` on create and update. Reported by [@​therawdev](https://github.com/therawdev) and [@​shukla304](https://github.com/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](https://github.com/karen93shieh) and [@​MuxiLyuLucy](https://github.com/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 `TAGS` attribute 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](https://github.com/therawdev) and [@​shukla304](https://github.com/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](karakeep-app/karakeep#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](https://github.com/pike00) ([#​2805](karakeep-app/karakeep#2805)). - Fixed `BROWSER_WEB_URL` failing to resolve on IPv6-only Docker networks by [@​VrtxOmega](https://github.com/VrtxOmega) ([#​2863](karakeep-app/karakeep#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](https://github.com/zerone0x) ([#​2928](karakeep-app/karakeep#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](https://github.com/eviaaaaa) ([#​2926](karakeep-app/karakeep#2926)). - New `OPENAI_TIMEOUT_SEC` option to control the per-request inference timeout, useful for slow self-hosted providers, by [@​optix2000](https://github.com/optix2000) ([#​2876](karakeep-app/karakeep#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 moment` or `cloudflare` tags on failed crawls. - Fixed the MCP `get-bookmark-content` tool crashing on bookmarks that haven't been crawled yet, by [@​joestump](https://github.com/joestump) ([#​2915](karakeep-app/karakeep#2915)). - Fixed scrolling in the bookmark preview's screenshot view by [@​VrtxOmega](https://github.com/VrtxOmega) ([#​2864](karakeep-app/karakeep#2864)). - The browser extension now requests host permissions at runtime for client-side crawling ([#​2784](karakeep-app/karakeep#2784)), instead of asking for them up front. - Added missing Japanese translations by [@​mahirhir](https://github.com/mahirhir) ([#​2903](karakeep-app/karakeep#2903)) and filled in the missing Korean translation keys by [@​moduvoice](https://github.com/moduvoice) ([#​2938](karakeep-app/karakeep#2938)). - PDF previews now render via `<embed>` so they display in Safari, by [@​KayMi](https://github.com/KayMi) ([#​2806](karakeep-app/karakeep#2806)). - Import progress is now tracked per import job ([#​2950](karakeep-app/karakeep#2950)), so running two imports at once no longer makes their progress bars fight each other. Thanks [@​jcgoodwin86](https://github.com/jcgoodwin86)! ##### For Developers 🛠️ - Docker healthchecks now respect a custom `PORT` by [@​zerone0x](https://github.com/zerone0x) ([#​2948](karakeep-app/karakeep#2948)). - OAuth providers can now use a configurable ID token signing algorithm via `OAUTH_ID_TOKEN_SIGNED_RESPONSE_ALG`, by [@​CertStone](https://github.com/CertStone) ([#​2850](karakeep-app/karakeep#2850)). ##### Community Projects 💡 *Checkout our community projects page [here](https://docs.karakeep.app/community-projects).* - [wdoc](https://github.com/thiswillbeyourgithub/wdoc): A RAG-powered document/knowledge querying tool with Karakeep support, by [@​thiswillbeyourgithub](https://github.com/thiswillbeyourgithub) ([#​2904](karakeep-app/karakeep#2904)) ##### Screenshots 📸 ##### Offline Reading <img width="603" height="1311" alt="Screenshot 2026-08-01 at 7 41 17 PM" src="https://github.com/user-attachments/assets/15eca558-2fa9-44d2-9c75-c7e6042b44c1" /> ##### New Mobile List Layouts *Please don't judge my saved content* <img width="603" height="1258" alt="Screenshot 2026-08-01 at 7 38 55 PM" src="https://github.com/user-attachments/assets/bf5aa418-b80f-4d75-968a-2b99914df803" /> ##### Upgrading 📦 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`. ##### Enabling Embeddings 1. Karakeep's embedding uses your existing meilisearch installation as the default vector store. If you're an OG, and running an old meilisearch version, you'll need to ensure you're on meilisearch version (1.13 or higher). Check [this guide](https://www.meilisearch.com/docs/resources/migration/updating#updating-a-self-hosted-meilisearch-instance) for info on how to update. 2. If you're using the default OpenAI based configuration, auto embeddings of new bookmarks will be enabled automatically and will use the `text-embedding-3-small` model. 3. If you're using a custom provider, you'll need to pass in the `EMBEDDING_TEXT_MODEL=<your_mode>`, the size of the dimension of the model via `EMBEDDING_DIMENSIONS` and then pass `EMBEDDING_ENABLE_AUTO_INDEXING=true` to enable embeddings. Check out [our docs](https://docs.karakeep.app/configuration/different-ai-providers) for example models and configurations. Once you've enabled embeddings, you'll need to regenerate embeddings for all existing bookmarks. Head to the admin panel's Background Jobs page (new "Embeddings" card) and regenerate embeddings for all/pending bookmarks. This might take a while depending on how many bookmarks you have, and will cost you money (though embeddings are usually pretty cheap). NOTE: Changing the model or its dimension after embedding even a single bookmark will require you to regenerate embeddings for *all* bookmarks. ##### All Commits - fix(tagging): loosen the captcha rejection in the prompt a bit - [@​MohamedBassem](https://github.com/MohamedBassem) in [`8550eb0`](karakeep-app/karakeep@8550eb09) - fix(workers): wait for autoconsent in parallel with page load - [@​MohamedBassem](https://github.com/MohamedBassem) in [`98c52b8`](karakeep-app/karakeep@98c52b85) - fix(tests): fix failing test after changing default model - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f249307`](karakeep-app/karakeep@f249307b) - feat: change default inference model to gpt-5.6-luna - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1bc351a`](karakeep-app/karakeep@1bc351a7) - fix: enable auto embedding by default for default inference configuration ([#​2976](karakeep-app/karakeep#2976)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`bcbb577`](karakeep-app/karakeep@bcbb5776) - fix: enable auto embedding by default for default inference configurations - [@​MohamedBassem](https://github.com/MohamedBassem) in [`7722c6a`](karakeep-app/karakeep@7722c6ae) - deps: upgrade docusaurus - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ccddfcf`](karakeep-app/karakeep@ccddfcf3) - feat: Add support for configurable ID token signing algorithm in OAuth ([#​2850](karakeep-app/karakeep#2850)) - [@​CertStone](https://github.com/CertStone) in [`b2b2579`](karakeep-app/karakeep@b2b2579b) - feat(landing): 28k starts - [@​MohamedBassem](https://github.com/MohamedBassem) in [`385ec1d`](karakeep-app/karakeep@385ec1df) - feat: add new article quality assessment ([#​2975](karakeep-app/karakeep#2975)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`76b477c`](karakeep-app/karakeep@76b477c4) - fix: make queue registration idempotent - [@​MohamedBassem](https://github.com/MohamedBassem) in [`6f12013`](karakeep-app/karakeep@6f120133) - i18n: some translation fixes - [@​MohamedBassem](https://github.com/MohamedBassem) in [`3b7982c`](karakeep-app/karakeep@3b7982c1) - i18n: Sync weblate translations - Hosted Weblate in [`590c670`](karakeep-app/karakeep@590c6700) - feat(web): some UX improvements in signin and password forms - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b4b9474`](karakeep-app/karakeep@b4b94740) - feat(workers): auto-dismiss consent dialogs with autoconsent ([#​2973](karakeep-app/karakeep#2973)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`c333f24`](karakeep-app/karakeep@c333f240) - deps: upgrade nextjs to 16.2.12 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1148889`](karakeep-app/karakeep@11488896) - fix(workers): fix workers in dev mode - [@​MohamedBassem](https://github.com/MohamedBassem) in [`3a0421d`](karakeep-app/karakeep@3a0421d0) - deps: bump a bunch of deps - [@​MohamedBassem](https://github.com/MohamedBassem) in [`a90034d`](karakeep-app/karakeep@a90034d1) - i18n: Sync weblate translations - Hosted Weblate in [`8b4b917`](karakeep-app/karakeep@8b4b9170) - docs: hide the chat flags for now - [@​MohamedBassem](https://github.com/MohamedBassem) in [`36c36e3`](karakeep-app/karakeep@36c36e3e) - fix(auth): close account enumeration oracles in login and password reset - [@​MohamedBassem](https://github.com/MohamedBassem) in [`036da4c`](karakeep-app/karakeep@036da4c0) - fix(mobile): don't silently swallow mutations fired while offline - [@​MohamedBassem](https://github.com/MohamedBassem) in [`9188958`](karakeep-app/karakeep@9188958c) - fix(plugins): don't cache a rejected init promise in the meilisearch providers - [@​MohamedBassem](https://github.com/MohamedBassem) in [`64ec6cb`](karakeep-app/karakeep@64ec6cbc) - fix(export): escape tag names in the netscape bookmark export - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f0381b4`](karakeep-app/karakeep@f0381b42) - feat: add support for resaving already existing bookmarks ([#​2962](karakeep-app/karakeep#2962)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f2f6431`](karakeep-app/karakeep@f2f6431d) - feat(web): move keyboard shortcuts inside the profile options menu - [@​MohamedBassem](https://github.com/MohamedBassem) in [`a698724`](karakeep-app/karakeep@a6987247) - fix(web): fix preview screenshot scrolling ([#​2864](karakeep-app/karakeep#2864)) - [@​VrtxOmega](https://github.com/VrtxOmega) in [`595392a`](karakeep-app/karakeep@595392a9) - feat(web): allow triggering bulk edit on hover - [@​MohamedBassem](https://github.com/MohamedBassem) in [`28a48ec`](karakeep-app/karakeep@28a48ec5) - fix(workers): denoise the log messages coming from the feedWorker - [@​MohamedBassem](https://github.com/MohamedBassem) in [`d155fa0`](karakeep-app/karakeep@d155fa0e) - fix(ux): make the sidebar wider on larger screens - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f417b90`](karakeep-app/karakeep@f417b900) - feat: make it possible to trigger admin jobs for a certain duration - [@​MohamedBassem](https://github.com/MohamedBassem) in [`0a1821b`](karakeep-app/karakeep@0a1821ba) - release(mobile): release mobile v1.10.0-1 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`369f5a6`](karakeep-app/karakeep@369f5a68) - fix(mobile): improve reader contrast in dark mode - [@​MohamedBassem](https://github.com/MohamedBassem) in [`c007bc7`](karakeep-app/karakeep@c007bc76) - feat(mobile): add semantic search mode selector - [@​MohamedBassem](https://github.com/MohamedBassem) in [`8175539`](karakeep-app/karakeep@8175539e) - feat(mobile): show offline storage usage - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ec81015`](karakeep-app/karakeep@ec810158) - release(mobile): release mobile v1.10.0 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`3a6f282`](karakeep-app/karakeep@3a6f2822) - feat(web): add semantic search to the UI ([#​2960](karakeep-app/karakeep#2960)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`2f740d0`](karakeep-app/karakeep@2f740d00) - feat: add semantic search ([#​2959](karakeep-app/karakeep#2959)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`71ea4d9`](karakeep-app/karakeep@71ea4d9b) - feat(mcp): more MCP tools - [@​MohamedBassem](https://github.com/MohamedBassem) in [`8de38d4`](karakeep-app/karakeep@8de38d48) - feat(cli): expose assets and readable conent in the CLI - [@​MohamedBassem](https://github.com/MohamedBassem) in [`a296871`](karakeep-app/karakeep@a2968718) - feat(api): add an api for fetching readable content of a bookmark. [#​2660](karakeep-app/karakeep#2660) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f391113`](karakeep-app/karakeep@f3911139) - feat(mcp): add ability to fetch assets via signed URLs - [@​MohamedBassem](https://github.com/MohamedBassem) in [`06d99bd`](karakeep-app/karakeep@06d99bd6) - fix(mobile): better error message in the login page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e88a606`](karakeep-app/karakeep@e88a606c) - fix(mobile): fix formsheet colors - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b8fe26a`](karakeep-app/karakeep@b8fe26ad) - feat(mobile): offline reading ([#​2957](karakeep-app/karakeep#2957)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`2075c33`](karakeep-app/karakeep@2075c33a) - feat(mobile): minor cleanups to the login page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`9b1b2b7`](karakeep-app/karakeep@9b1b2b73) - fix(mobile): add a loading indicator to article content - [@​MohamedBassem](https://github.com/MohamedBassem) in [`198ea1e`](karakeep-app/karakeep@198ea1e5) - readme: drop heavy dev notice now that it's stable enough - [@​MohamedBassem](https://github.com/MohamedBassem) in [`bc50630`](karakeep-app/karakeep@bc506307) - ci: fix failing trpc test - [@​MohamedBassem](https://github.com/MohamedBassem) in [`bf2749e`](karakeep-app/karakeep@bf2749e8) - fix: add timeSafe checks for signed tokens and api keys - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e8a138f`](karakeep-app/karakeep@e8a138f1) - fix: drop redundant db indicies - [@​MohamedBassem](https://github.com/MohamedBassem) in [`7ced044`](karakeep-app/karakeep@7ced044b) - feat: archive old completed sessions - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1717af8`](karakeep-app/karakeep@1717af84) - fix: upgrade some packages - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f0d254d`](karakeep-app/karakeep@f0d254d0) - fix: respect PORT in Docker healthchecks ([#​2948](karakeep-app/karakeep#2948)) - [@​zerone0x](https://github.com/zerone0x) in [`7d703b8`](karakeep-app/karakeep@7d703b8b) - fix: track import progress per-job ([#​2950](karakeep-app/karakeep#2950)) - [@​jcgoodwin86](https://github.com/jcgoodwin86) in [`4224da4`](karakeep-app/karakeep@4224da4f) - feat: prep for sub tier overrides - [@​MohamedBassem](https://github.com/MohamedBassem) in [`5e5692f`](karakeep-app/karakeep@5e5692f7) - feat: add chat configuration and persistence schema - [@​MohamedBassem](https://github.com/MohamedBassem) in [`28cb149`](karakeep-app/karakeep@28cb149d) - refactor(web): replace AI Elements message components with shadcn chat components - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4423da1`](karakeep-app/karakeep@4423da19) - \[mobile] Upgrade mobile app to Expo SDK 56 ([#​2946](karakeep-app/karakeep#2946)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`08fd866`](karakeep-app/karakeep@08fd866b) - fix: rename root package to [@​karakeep/root](https://github.com/karakeep/root). fixes [#​2939](karakeep-app/karakeep#2939) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`7ff5a46`](karakeep-app/karakeep@7ff5a46f) - \[network] fix dns rebinding problems post internal hostname validation ([#​2945](karakeep-app/karakeep#2945)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`978544d`](karakeep-app/karakeep@978544df) - fix: add missing indicies needed for bookmark deletion. [#​2669](karakeep-app/karakeep#2669) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`eb1f472`](karakeep-app/karakeep@eb1f4727) - i18n: fill missing Korean (ko) translation keys ([#​2938](karakeep-app/karakeep#2938)) - [@​moduvoice](https://github.com/moduvoice) in [`7b19b0d`](karakeep-app/karakeep@7b19b0da) - fix(mobile): propagate error message in sharing screen - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1b7b247`](karakeep-app/karakeep@1b7b2477) - revert: remove --headless=new flag from default chrome docker compose ([#​2936](karakeep-app/karakeep#2936)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4af8bb2`](karakeep-app/karakeep@4af8bb2f) - release(mcp): Bump mcp server to 0.32.1 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`aa78aa8`](karakeep-app/karakeep@aa78aa8f) - feat(mcp): add list CRUD, tag CRUD, delete-bookmark ([#​2917](karakeep-app/karakeep#2917)) - [@​joestump](https://github.com/joestump) in [`831d6bf`](karakeep-app/karakeep@831d6bf5) - refactor: split crawler file into separate modules ([#​2933](karakeep-app/karakeep#2933)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b2c52c9`](karakeep-app/karakeep@b2c52c9c) - feat: add extra metadata parse in the probe fetch ([#​2932](karakeep-app/karakeep#2932)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`8439928`](karakeep-app/karakeep@84399288) - fix(crawler): preserve inline GIF data images ([#​2928](karakeep-app/karakeep#2928)) - [@​zerone0x](https://github.com/zerone0x) in [`28d321c`](karakeep-app/karakeep@28d321ce) - feat: add a script to adhocly test the crawler + improve chrome flags ([#​2929](karakeep-app/karakeep#2929)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`5b0d7fe`](karakeep-app/karakeep@5b0d7fe6) - fix(inference): only set JSON response\_format for schema requests ([#​2926](karakeep-app/karakeep#2926)) - [@​eviaaaaa](https://github.com/eviaaaaa) in [`545e6f8`](karakeep-app/karakeep@545e6f80) - fix: fix banner extraction of singlefile archives - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ba6adfc`](karakeep-app/karakeep@ba6adfce) - fix: ratelimit password login attempts - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f7d0429`](karakeep-app/karakeep@f7d04297) - fix: sanitize input url and list names - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ffd1058`](karakeep-app/karakeep@ffd10589) - feat: tagging prompt hardening - [@​MohamedBassem](https://github.com/MohamedBassem) in [`9ceb077`](karakeep-app/karakeep@9ceb077c) - fix(mcp): coerce null htmlContent before turndown in get-bookmark-content ([#​2915](karakeep-app/karakeep#2915)) - [@​joestump](https://github.com/joestump) in [`1ebf5b0`](karakeep-app/karakeep@1ebf5b08) - \[codex] Document browser extension dev port ([#​2918](karakeep-app/karakeep#2918)) - [@​archit-goyal](https://github.com/archit-goyal) in [`fc1c127`](karakeep-app/karakeep@fc1c127d) - fix: forget password workflow - [@​MohamedBassem](https://github.com/MohamedBassem) in [`c3d6028`](karakeep-app/karakeep@c3d60280) - feat(stripe): add a trpc command for force syncing customer detail - [@​MohamedBassem](https://github.com/MohamedBassem) in [`a787ee4`](karakeep-app/karakeep@a787ee47) - fix(billing): pick the latest active subscription when user has multiple subs - [@​MohamedBassem](https://github.com/MohamedBassem) in [`9bcac9c`](karakeep-app/karakeep@9bcac9cc) - ci: disable plugin tests - [@​MohamedBassem](https://github.com/MohamedBassem) in [`43425e1`](karakeep-app/karakeep@43425e1d) - chore: drop jemalloc support - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e862bf3`](karakeep-app/karakeep@e862bf3b) - fix(restate): lower inactivity timeouts on dispatchers ([#​2911](karakeep-app/karakeep#2911)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ac51b35`](karakeep-app/karakeep@ac51b359) - feat(i18n): add missing Japanese (ja) translations (keyboard shortcuts, admin embeddings) ([#​2903](karakeep-app/karakeep#2903)) - [@​mahirhir](https://github.com/mahirhir) in [`475483e`](karakeep-app/karakeep@475483e3) - docs(community): add wdoc to community projects ([#​2904](karakeep-app/karakeep#2904)) - [@​thiswillbeyourgithub](https://github.com/thiswillbeyourgithub) in [`c93cbc2`](karakeep-app/karakeep@c93cbc2a) - feat(landing): 26k stars. Take 2 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`9879eb5`](karakeep-app/karakeep@9879eb5d) - docker: fix monolith build in docker - [@​MohamedBassem](https://github.com/MohamedBassem) in [`05c4e04`](karakeep-app/karakeep@05c4e04a) - feat(landing): 26k stars - [@​MohamedBassem](https://github.com/MohamedBassem) in [`3afe675`](karakeep-app/karakeep@3afe675a) - fix(inference): add OpenAI request timeout config ([#​2876](karakeep-app/karakeep#2876)) - [@​optix2000](https://github.com/optix2000) in [`c0ac8a4`](karakeep-app/karakeep@c0ac8a47) - feat(mobile): easy clipboard saving ([#​2868](karakeep-app/karakeep#2868)) - [@​InventorB](https://github.com/InventorB) in [`207016e`](karakeep-app/karakeep@207016e8) - fix(workers): Fix BROWSER\_WEB\_URL IPv6 host resolution ([#​2863](karakeep-app/karakeep#2863)) - [@​VrtxOmega](https://github.com/VrtxOmega) in [`cf1964f`](karakeep-app/karakeep@cf1964ff) - chore: AI assistant component prep ([#​2861](karakeep-app/karakeep#2861)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`76cbbf3`](karakeep-app/karakeep@76cbbf39) - fix(api): make metrics registration idempotent - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4ae50c5`](karakeep-app/karakeep@4ae50c52) - fix: fast track tagging after embedding generation ([#​2860](karakeep-app/karakeep#2860)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`6369416`](karakeep-app/karakeep@63694167) - feat: add embeddings-based potentially relevant tags to LLM context d… ([#​2858](karakeep-app/karakeep#2858)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`2fbd77b`](karakeep-app/karakeep@2fbd77bd) - feat: add bookmark embedding support ([#​2857](karakeep-app/karakeep#2857)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`84ab354`](karakeep-app/karakeep@84ab354d) - deps: upgrade meilisearch client package - [@​MohamedBassem](https://github.com/MohamedBassem) in [`af3677a`](karakeep-app/karakeep@af3677a1) - feat(cli): add --description flag to bookmarks update command ([#​2856](karakeep-app/karakeep#2856)) - [@​TanishValesha](https://github.com/TanishValesha) in [`8463ad0`](karakeep-app/karakeep@8463ad07) - fix: fix twitter renderer - [@​MohamedBassem](https://github.com/MohamedBassem) in [`dc26820`](karakeep-app/karakeep@dc268202) - fix: fix plugin and stats registration in nextjs across reloads - [@​MohamedBassem](https://github.com/MohamedBassem) in [`a043c88`](karakeep-app/karakeep@a043c889) - fix(workers): fix misleading error message when rss import fails to create bookmark. fixes [#​2838](karakeep-app/karakeep#2838) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`9651c79`](karakeep-app/karakeep@9651c79c) - release(mobile): release mobile v1.9.5-2 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`78e012f`](karakeep-app/karakeep@78e012f2) - fix(mobile): fix taglist skeleton - [@​MohamedBassem](https://github.com/MohamedBassem) in [`8d9a015`](karakeep-app/karakeep@8d9a0154) - release(mobile): release mobile v1.9.5-1 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`a031d43`](karakeep-app/karakeep@a031d433) - fix(mobile): remove redundant toasts in the bookmarks info page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4e677c5`](karakeep-app/karakeep@4e677c55) - fix(mobile): change default layout to be list layout - [@​MohamedBassem](https://github.com/MohamedBassem) in [`5332ca3`](karakeep-app/karakeep@5332ca33) - fix(mobile): add bookmark grid settings to favs and archive pages - [@​MohamedBassem](https://github.com/MohamedBassem) in [`c272037`](karakeep-app/karakeep@c2720375) - release(mobile): release mobile v1.9.5 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`5d29229`](karakeep-app/karakeep@5d292292) - feat(mobile): add mobile sorting support. fixes [#​2777](karakeep-app/karakeep#2777) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`d5ea3f5`](karakeep-app/karakeep@d5ea3f5a) - fix(mobile): fix the padding of the tag pills - [@​MohamedBassem](https://github.com/MohamedBassem) in [`0fe7d70`](karakeep-app/karakeep@0fe7d706) - feat(mobile): add different mobile layouts to the mobile app ([#​2837](karakeep-app/karakeep#2837)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`bc29d61`](karakeep-app/karakeep@bc29d61d) - feat(mobile): change tag colors - [@​MohamedBassem](https://github.com/MohamedBassem) in [`633016c`](karakeep-app/karakeep@633016c7) - feat(mobile): add archive,fav,share and highlights to info page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`c32b7f9`](karakeep-app/karakeep@c32b7f99) - refactor(mobile): use a composite component for the bookmark card - [@​MohamedBassem](https://github.com/MohamedBassem) in [`77c6523`](karakeep-app/karakeep@77c6523c) - feat: instagram renderer ([#​2836](karakeep-app/karakeep#2836)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`3c1a020`](karakeep-app/karakeep@3c1a0201) - fix(web): fix PWA installaiblity in chrome - [@​MohamedBassem](https://github.com/MohamedBassem) in [`95555f1`](karakeep-app/karakeep@95555f1f) - fix(web): fix alignment of keyboard button in global actions - [@​MohamedBassem](https://github.com/MohamedBassem) in [`0893e51`](karakeep-app/karakeep@0893e512) - fix(web): change sidebar collapse toggle to chevrons - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e6756e0`](karakeep-app/karakeep@e6756e05) - fix(mobile): remove unncessary toast from manage list actions on mobile - [@​MohamedBassem](https://github.com/MohamedBassem) in [`199d032`](karakeep-app/karakeep@199d0327) - fix(docker): set yt-dlp to use bundled node as JS runtime ([#​2805](karakeep-app/karakeep#2805)) - [@​pike00](https://github.com/pike00) in [`e92f2f0`](karakeep-app/karakeep@e92f2f02) - fix(web): render PDFs via <embed> so Safari can display them ([#​2806](karakeep-app/karakeep#2806)) - [@​KayMi](https://github.com/KayMi) in [`ff28861`](karakeep-app/karakeep@ff288613) - chore: upgrade to pnpm 11 ([#​2833](karakeep-app/karakeep#2833)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`8f19963`](karakeep-app/karakeep@8f199631) - build: stop update old personal docker images - [@​MohamedBassem](https://github.com/MohamedBassem) in [`d10effa`](karakeep-app/karakeep@d10effa2) - chore: pin github action deps ([#​2832](karakeep-app/karakeep#2832)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`341f721`](karakeep-app/karakeep@341f7217) - chore: Add seed snapshot generator ([#​2829](karakeep-app/karakeep#2829)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`53da5e2`](karakeep-app/karakeep@53da5e2b) - deps: upgrade nextjs to 16 ([#​2827](karakeep-app/karakeep#2827)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ff57d9c`](karakeep-app/karakeep@ff57d9c2) - chore: improve AGENTS.md ([#​2826](karakeep-app/karakeep#2826)) - [@​ElectricTea](https://github.com/ElectricTea) in [`b45d41c`](karakeep-app/karakeep@b45d41cc) - fix: fix error on admin user list due to react query hydration ([#​2824](karakeep-app/karakeep#2824)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1997bd3`](karakeep-app/karakeep@1997bd38) - chore: add a .ignore file to filter out noisy dirs from search - [@​MohamedBassem](https://github.com/MohamedBassem) in [`37b3712`](karakeep-app/karakeep@37b37124) - docs: update SECURITY.md - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4b22229`](karakeep-app/karakeep@4b22229d) - deps: upgrade nextjs to 15.5.18 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f823724`](karakeep-app/karakeep@f8237243) - fix: serve unoptimized nextjs images - [@​MohamedBassem](https://github.com/MohamedBassem) in [`61a2bde`](karakeep-app/karakeep@61a2bdeb) - release(mobile): release mobile v1.9.4 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`01d636f`](karakeep-app/karakeep@01d636f2) - fix(mobile): improve perf of manage\_tags page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`84dfea5`](karakeep-app/karakeep@84dfea5e) - fix(mobile): fix color of list separator in recent searches list - [@​MohamedBassem](https://github.com/MohamedBassem) in [`d426cdb`](karakeep-app/karakeep@d426cdb2) - fix(mobile): fix formsheet padding in manage\_lists, manage\_tags and info sheets - [@​MohamedBassem](https://github.com/MohamedBassem) in [`41633c2`](karakeep-app/karakeep@41633c2a) - feat(mobile): tablet/iPad UI polish for toolbar and FAB ([#​2788](karakeep-app/karakeep#2788)) - [@​esimkowitz](https://github.com/esimkowitz) in [`d871f57`](karakeep-app/karakeep@d871f57b) - fix(mobile): stack Upload Image Quality slider on two lines ([#​2794](karakeep-app/karakeep#2794)) - [@​esimkowitz](https://github.com/esimkowitz) in [`75b6e91`](karakeep-app/karakeep@75b6e910) - fix(mobile): fix insets on new iOS settings formSheet modal ([#​2793](karakeep-app/karakeep#2793)) - [@​esimkowitz](https://github.com/esimkowitz) in [`7ce940a`](karakeep-app/karakeep@7ce940a5) - docs: update screenshots in the docs - [@​MohamedBassem](https://github.com/MohamedBassem) in [`66a7ac4`](karakeep-app/karakeep@66a7ac48) - release(extension): Release version 1.2.11 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f638064`](karakeep-app/karakeep@f638064e) - feat(browser-extension): request host permission at runtime for client side crawling ([#​2784](karakeep-app/karakeep#2784)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1a7a2fe`](karakeep-app/karakeep@1a7a2fef) - docs: minor docs update to mention the skills and the new singlefile integration - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1c7872c`](karakeep-app/karakeep@1c7872ce) - release(cli): release CLI 0.32.0 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ad9ef51`](karakeep-app/karakeep@ad9ef514) - release: release cli, sdk, mobile and extension - [@​MohamedBassem](https://github.com/MohamedBassem) in [`58f9b30`](karakeep-app/karakeep@58f9b302) - release(docs): release the 0.32 docs - [@​MohamedBassem](https://github.com/MohamedBassem) in [`d28ff5f`](karakeep-app/karakeep@d28ff5fd) </details> --- ### Configuration 📅 **Schedule**: (in timezone Europe/Warsaw) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4yLjEiLCJ1cGRhdGVkSW5WZXIiOiI0NC4yLjEiLCJ0YXJnZXRCcmFuY2giOiJtYXN0ZXIiLCJsYWJlbHMiOlsicmVub3ZhdGUvY29udGFpbmVyIiwidHlwZS9taW5vciJdfQ==--> Reviewed-on: https://git.ajgon.casa/deedee/mark13/pulls/498
…t side crawling (#2784) Move `<all_urls>` from `host_permissions` to `optional_host_permissions` so it isn't requested at install time. The permission is now requested via `chrome.permissions.request()` when the user enables client-side crawling in the extension settings, and removed when they disable it. The settings toggle and the capture path both gate on whether the permission is actually granted. https://claude.ai/code/session_01NnQnr1B9KSRriTaQkZM6AP Co-authored-by: Claude <noreply@anthropic.com>
Move
<all_urls>fromhost_permissionstooptional_host_permissionsso it isn't requested at install time. The permission is now requested viachrome.permissions.request()when the user enables client-side crawling in the extension settings, and removed when they disable it. The settings toggle and the capture path both gate on whether the permission is actually granted.Fixes #2782