Skip to content

feat(mobile): Add highlights support for the mobile app#2494

Merged
MohamedBassem merged 1 commit intokarakeep-app:mainfrom
MohamedBassem:feat/mobile-highlights
Feb 19, 2026
Merged

feat(mobile): Add highlights support for the mobile app#2494
MohamedBassem merged 1 commit intokarakeep-app:mainfrom
MohamedBassem:feat/mobile-highlights

Conversation

@MohamedBassem
Copy link
Copy Markdown
Collaborator

  • Move BookmarkHighligher to shared-react to be able to use it in the mobile app with use dom.
  • Move some of the common reader view classNames all the ways to BookmarkHighligher.
  • Move some shared shadcn components from the web package to shared-react package to be used by the shared components lib.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 18, 2026

Walkthrough

This PR consolidates UI components and utilities into a new shared React package, moves Button, Popover, and Textarea components from the web app into the shared package, and updates imports across web and mobile apps. It introduces a new BookmarkHtmlHighlighterDom wrapper in mobile and adds supporting dependencies and Tailwind configurations for shared component inclusion.

Changes

Cohort / File(s) Summary
Shared React Package - New UI Components
packages/shared-react/components/ui/button.tsx, packages/shared-react/components/ui/popover.tsx, packages/shared-react/components/ui/textarea.tsx
New shared UI components with Radix UI primitives, class-variance-authority variants, and forwardRef support; also includes TextareaProps types and PopoverContent styling composition.
Shared React Package - Utilities & Highlights
packages/shared-react/lib/utils.ts, packages/shared-react/components/highlights.ts, packages/shared-react/components/BookmarkHtmlHighlighter.tsx
New cn utility function for Tailwind class merging, HIGHLIGHT_COLOR_MAP constant for color-coded highlights, and updated BookmarkHtmlHighlighter using local UI modules.
Mobile App - New & Updated Components
apps/mobile/components/bookmarks/BookmarkHtmlHighlighterDom.tsx, apps/mobile/components/bookmarks/BookmarkLinkPreview.tsx
New BookmarkHtmlHighlighterDom wrapper component; BookmarkLinkPreview refactored to replace WebView HTML rendering with the new highlighter component and adds highlight management hooks.
Mobile App - Configuration
apps/mobile/package.json, apps/mobile/tailwind.config.js
Added react-dom and react-native-web dependencies; expanded Tailwind content glob to include shared-react package and added typography plugin.
Web App - UI Component Migrations
apps/web/components/ui/button.tsx, apps/web/components/ui/popover.tsx, apps/web/components/ui/textarea.tsx
Replaced local component definitions with re-exports from shared package; ButtonWithTooltip updated to use shared ButtonProps type.
Web App - Import & Usage Updates
apps/web/components/dashboard/preview/ReaderView.tsx, apps/web/components/dashboard/preview/highlights.ts, apps/web/components/dashboard/preview/LinkContentSection.tsx, apps/web/app/reader/[bookmarkId]/page.tsx
Updated import paths for BookmarkHTMLHighlighter and HIGHLIGHT_COLOR_MAP to use shared package; removed complex className styling from ReaderView.
Web App - Configuration
apps/web/tailwind.config.ts, packages/shared-react/package.json
Expanded Tailwind content paths to include shared-react components; added dependencies for Radix UI, utilities (clsx, tailwind-merge, class-variance-authority), and optional react-dom peer dependency.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(mobile): Add highlights support for the mobile app' accurately summarizes the main change—adding highlights support to the mobile app through component migrations.
Description check ✅ Passed The description clearly relates to the changeset by detailing the three main objectives: moving BookmarkHighligher to shared-react, consolidating classNames, and moving shadcn components to shared-react.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
apps/web/tailwind.config.ts (1)

6-9: Glob scope inconsistency with mobile config (minor).

apps/web/tailwind.config.ts scans ../../packages/shared-react/components/**/*.{ts,tsx}, while apps/mobile/tailwind.config.js scans ../../packages/shared-react/**/*.{js,jsx,ts,tsx} — broader scope covering lib/ and JS files too. For consistency (and to cover any future utility files that reference class strings outside components/), consider aligning both configs, or document the intentional difference.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/tailwind.config.ts` around lines 6 - 9, Update the content glob in
the apps/web tailwind config to match the mobile config: replace the current
entry that references "../../packages/shared-react/components/**/*.{ts,tsx}"
with a broader glob like "../../packages/shared-react/**/*.{js,jsx,ts,tsx}" so
the content array (spread of web.content) scans the same files as apps/mobile;
alternatively, if the narrower scope is intentional, add a comment in the
tailwind.config.ts next to the content array explaining why only components/* is
scanned to prevent accidental future drift.
packages/shared-react/components/highlights.ts (1)

9-14: Consider a more ergonomic key name for ["border-l"].

Using a computed string key forces callers to write HIGHLIGHT_COLOR_MAP["border-l"][color] instead of dot notation. A camelCase alternative like borderL would be more idiomatic and easier to autocomplete without any functional difference.

♻️ Suggested rename
-  ["border-l"]: {
+  borderL: {
     red: "border-l-red-200",
     green: "border-l-green-200",
     blue: "border-l-blue-200",
     yellow: "border-l-yellow-200",
   } as const,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/shared-react/components/highlights.ts` around lines 9 - 14, Rename
the computed key ["border-l"] in the HIGHLIGHT_COLOR_MAP to a camelCase property
like borderL so callers can use dot notation
(HIGHLIGHT_COLOR_MAP.borderL[color]) and get better autocompletion; update the
map definition (the object with ["border-l"] currently) to use borderL and
adjust any references/usages across the codebase to the new property name,
preserving the same value strings and keeping the as const typing intact.
apps/mobile/components/bookmarks/BookmarkLinkPreview.tsx (1)

95-97: No user feedback on highlight mutation success/error.

The web counterpart in ReaderView.tsx (lines 49-89) shows toast notifications on highlight create/update/delete success and error. Here, the mutation hooks are instantiated without any onSuccess/onError callbacks, so the user gets no feedback when a highlight operation succeeds or fails. Consider adding mobile-appropriate feedback (e.g., a toast or haptic) for at least error cases so users know when an operation didn't persist.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/mobile/components/bookmarks/BookmarkLinkPreview.tsx` around lines 95 -
97, Add user feedback callbacks to the highlight mutation hooks in
BookmarkLinkPreview.tsx so create/update/delete operations notify
success/errors: when instantiating useCreateHighlight, useUpdateHighlight, and
useDeleteHighlight, pass onSuccess and onError handlers that trigger
mobile-appropriate feedback (e.g., a toast and/or haptic) — call the success
handler to show a short confirmation and call the error handler to show an error
message with details so users know the operation failed; reference the mutate
aliases createHighlight, updateHighlight, and deleteHighlight when wiring these
callbacks.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@apps/mobile/tailwind.config.js`:
- Line 54: The Tailwind typography plugin referenced in the plugins array of
tailwind.config.js (require("@tailwindcss/typography")) is not listed in
package.json; add "@tailwindcss/typography" to the devDependencies in
apps/mobile's package.json (match the version format used for other Tailwind
plugins), then run your package manager install to update lockfile and ensure
the plugin can be resolved at runtime.

In `@packages/shared-react/components/ui/popover.tsx`:
- Around line 1-30: The import of cn from "@/lib/utils" may break after moving
components; update the Popover component to use a safe import path or the
project path-mapping: change the import in this file so Popover (Popover,
PopoverTrigger, PopoverContent) references the correct utils module (either a
relative path to the utils file or ensure tsconfig/next alias is configured) so
the cn utility is resolved at runtime/build like the other moved components.

In `@packages/shared-react/components/ui/textarea.tsx`:
- Around line 1-22: The import using the "@/lib/utils" alias in the Textarea
component should be replaced or resolved: update the Textarea component's import
of cn (used in the Textarea forwardRef) to use the correct relative module path
matching the component's new location (or ensure project path aliases are
configured so "@/lib/utils" resolves during build), and apply the same fix to
other moved components that still reference "@/lib/utils".

---

Nitpick comments:
In `@apps/mobile/components/bookmarks/BookmarkLinkPreview.tsx`:
- Around line 95-97: Add user feedback callbacks to the highlight mutation hooks
in BookmarkLinkPreview.tsx so create/update/delete operations notify
success/errors: when instantiating useCreateHighlight, useUpdateHighlight, and
useDeleteHighlight, pass onSuccess and onError handlers that trigger
mobile-appropriate feedback (e.g., a toast and/or haptic) — call the success
handler to show a short confirmation and call the error handler to show an error
message with details so users know the operation failed; reference the mutate
aliases createHighlight, updateHighlight, and deleteHighlight when wiring these
callbacks.

In `@apps/web/tailwind.config.ts`:
- Around line 6-9: Update the content glob in the apps/web tailwind config to
match the mobile config: replace the current entry that references
"../../packages/shared-react/components/**/*.{ts,tsx}" with a broader glob like
"../../packages/shared-react/**/*.{js,jsx,ts,tsx}" so the content array (spread
of web.content) scans the same files as apps/mobile; alternatively, if the
narrower scope is intentional, add a comment in the tailwind.config.ts next to
the content array explaining why only components/* is scanned to prevent
accidental future drift.

In `@packages/shared-react/components/highlights.ts`:
- Around line 9-14: Rename the computed key ["border-l"] in the
HIGHLIGHT_COLOR_MAP to a camelCase property like borderL so callers can use dot
notation (HIGHLIGHT_COLOR_MAP.borderL[color]) and get better autocompletion;
update the map definition (the object with ["border-l"] currently) to use
borderL and adjust any references/usages across the codebase to the new property
name, preserving the same value strings and keeping the as const typing intact.

@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Feb 18, 2026

Greptile Summary

This PR adds highlights support to the mobile app by extracting BookmarkHTMLHighlighter and its dependencies (shadcn Button, Popover, Textarea, highlights color map, and a cn utility) from the web app into the shared-react package. The mobile app then uses this shared component via Expo's "use dom" directive, which renders it inside a web view. The common prose Tailwind classes for the reader view are consolidated into the shared BookmarkHTMLHighlighter component, simplifying the call sites in both the web reader page and the preview panel.

  • Moved BookmarkHTMLHighlighter from apps/web to packages/shared-react with the prose typography classes now baked in
  • Moved shadcn Button, Popover, and Textarea components to shared-react; web re-exports them to maintain existing imports
  • Replaced the raw WebView-based reader in the mobile app with the shared highlighter component, enabling full create/update/delete highlight functionality
  • Added react-dom, react-native-web, and @tailwindcss/typography to the mobile app to support DOM components and prose classes
  • Updated Tailwind configs for both web and mobile to scan shared-react component paths

Confidence Score: 4/5

  • This PR is a well-structured refactoring that moves existing, proven code to a shared package with minimal logic changes — safe to merge.
  • The changes are primarily code movement and re-exporting. The shared BookmarkHTMLHighlighter is nearly identical to the original web version. The mobile integration follows established Expo DOM component patterns. Two minor style issues were flagged (pre-existing from the original code) but neither would cause runtime failures.
  • Pay attention to packages/shared-react/components/BookmarkHtmlHighlighter.tsx — it has a useEffect without dependencies and direct state mutations that could cause subtle issues on mobile.

Important Files Changed

Filename Overview
packages/shared-react/components/BookmarkHtmlHighlighter.tsx Core component moved from web to shared-react. Adds base prose Tailwind classes directly. Minor: useEffect without dependency array (pre-existing), direct state mutation in handleSave (pre-existing).
apps/mobile/components/bookmarks/BookmarkHtmlHighlighterDom.tsx New "use dom" wrapper component for using the shared BookmarkHTMLHighlighter in the Expo mobile app via DOM components.
apps/mobile/components/bookmarks/BookmarkLinkPreview.tsx Replaces the raw WebView-based reader with the shared BookmarkHtmlHighlighterDom component, adding full highlight support (create, update, delete).
apps/mobile/tailwind.config.js Adds shared-react path to Tailwind content scanning and adds @tailwindcss/typography plugin for prose class support.
apps/web/components/ui/button.tsx Re-exports Button, buttonVariants, and ButtonProps from shared-react. Keeps ButtonWithTooltip as web-specific.
packages/shared-react/package.json Adds dependencies for UI components (radix, cva, clsx, lucide-react, tailwind-merge) and optional react-dom peer dep.
apps/web/tailwind.config.ts Adds shared-react components path to Tailwind content scanning for the web app.

Last reviewed commit: 97766e2

Copy link
Copy Markdown

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

20 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Feb 18, 2026

Additional Comments (2)

packages/shared-react/components/BookmarkHtmlHighlighter.tsx
Missing dependency array on useEffect

This useEffect has no dependency array, so it runs on every render — clearing all highlight <span> elements from the DOM and re-applying them each time. This involves querySelectorAll, DOM tree manipulation, and TreeWalker traversal for each highlight. On mobile devices (where this component is now being shared to), this could cause noticeable jank during interactions that trigger re-renders (e.g., typing in the note textarea).

Consider adding a dependency array with [highlights, htmlContent] to limit re-runs to when the data actually changes.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/shared-react/components/BookmarkHtmlHighlighter.tsx
Line: 171-192

Comment:
**Missing dependency array on `useEffect`**

This `useEffect` has no dependency array, so it runs on every render — clearing all highlight `<span>` elements from the DOM and re-applying them each time. This involves `querySelectorAll`, DOM tree manipulation, and `TreeWalker` traversal for each highlight. On mobile devices (where this component is now being shared to), this could cause noticeable jank during interactions that trigger re-renders (e.g., typing in the note textarea).

Consider adding a dependency array with `[highlights, htmlContent]` to limit re-runs to when the data actually changes.

How can I resolve this? If you propose a fix, please make it concise.

packages/shared-react/components/BookmarkHtmlHighlighter.tsx
Direct mutation of React state objects

pendingHighlight and selectedHighlight are state values set via useState. Mutating them directly (e.g., pendingHighlight.color = color) rather than creating new objects is against React's immutability convention and can cause subtle bugs — for example, if a child component or effect compares references to detect changes, it will miss these mutations. Consider creating a new object:

  const handleSave = (color: ZHighlightColor, note: string | null) => {
    if (pendingHighlight) {
      const updated = { ...pendingHighlight, color, note };
      onHighlight?.(updated);
    } else if (selectedHighlight) {
      const updated = { ...selectedHighlight, color, note };
      onUpdateHighlight?.(updated);
    }
    closeForm();
  };
Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/shared-react/components/BookmarkHtmlHighlighter.tsx
Line: 263-274

Comment:
**Direct mutation of React state objects**

`pendingHighlight` and `selectedHighlight` are state values set via `useState`. Mutating them directly (e.g., `pendingHighlight.color = color`) rather than creating new objects is against React's immutability convention and can cause subtle bugs — for example, if a child component or effect compares references to detect changes, it will miss these mutations. Consider creating a new object:

```suggestion
  const handleSave = (color: ZHighlightColor, note: string | null) => {
    if (pendingHighlight) {
      const updated = { ...pendingHighlight, color, note };
      onHighlight?.(updated);
    } else if (selectedHighlight) {
      const updated = { ...selectedHighlight, color, note };
      onUpdateHighlight?.(updated);
    }
    closeForm();
  };
```

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 97766e23c1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +108 to 112
<Button
size="sm"
onClick={onDelete}
variant="ghost"
title="Delete highlight"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve demo-mode guard on highlight deletion

This delete action now uses the plain Button, which drops the demo-mode disable logic that previously came from ActionButton (useClientConfig().demoMode in apps/web/components/ui/action-button.tsx). In web demo environments where the reader is writable, users can now click delete and trigger highlight mutations that were previously blocked at the UI layer, causing unintended state changes or repeated mutation errors.

Useful? React with 👍 / 👎.

@MohamedBassem MohamedBassem merged commit 459ee50 into karakeep-app:main Feb 19, 2026
7 checks passed
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Feb 22, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/karakeep-app/karakeep](https://github.com/karakeep-app/karakeep) | minor | `0.30.0` → `0.31.0` |
| [karakeep-app/karakeep](https://github.com/karakeep-app/karakeep) | minor | `0.30.0` → `0.31.0` |

---

### Release Notes

<details>
<summary>karakeep-app/karakeep (ghcr.io/karakeep-app/karakeep)</summary>

### [`v0.31.0`](https://github.com/karakeep-app/karakeep/releases/tag/v0.31.0): 0.31.0

[Compare Source](karakeep-app/karakeep@v0.30.0...v0.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 [@&#8203;esimkowitz](https://github.com/esimkowitz), [@&#8203;WieserDaniel](https://github.com/WieserDaniel), [@&#8203;chen-ye](https://github.com/chen-ye), [@&#8203;SnowSquire](https://github.com/SnowSquire), [@&#8203;mokhovyk](https://github.com/mokhovyk), [@&#8203;evan6seven](https://github.com/evan6seven), [@&#8203;ElectricTea](https://github.com/ElectricTea), [@&#8203;RobertRosca](https://github.com/RobertRosca), [@&#8203;sweepies](https://github.com/sweepies), [@&#8203;usr3](https://github.com/usr3) and everyone who shipped code, triaged bugs, or shared feedback for this release.

> If you enjoy using Karakeep, consider supporting the project [here ☕️](https://buymeacoffee.com/mbassem) or via GitHub [here](https://github.com/sponsors/MohamedBassem).

<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>

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](https://cloud.karakeep.app) 🎉.

##### New Features 🚀

- Synchronized reading progress across all your devices ([#&#8203;2302](karakeep-app/karakeep#2302)). By [@&#8203;esimkowitz](https://github.com/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 ([#&#8203;2442](karakeep-app/karakeep#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 ([#&#8203;2378](karakeep-app/karakeep#2378))
  - The import experience got another big overhaul: a new import details page ([#&#8203;2451](karakeep-app/karakeep#2451)), a dedicated low-priority queue for import crawling ([#&#8203;2452](karakeep-app/karakeep#2452)), better progress tracking, ability to pause an import and more resilient error handling.
- Drag-and-drop bookmarks into lists ([#&#8203;2469](karakeep-app/karakeep#2469))
- Highlights support on mobile ([#&#8203;2494](karakeep-app/karakeep#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 ([#&#8203;2444](karakeep-app/karakeep#2444)).
- Export lists in backups and exports ([#&#8203;2484](karakeep-app/karakeep#2484))
  - Automated backups and full exports now include your lists.
- Others:
  - Retry buttons for dangling (aka pending) bookmarks in the admin panel ([#&#8203;2341](karakeep-app/karakeep#2341)).
  - Add signup support to the mobile app.
  - OpenAI service tier configuration via `OPENAI_SERVICE_TIER` ([#&#8203;2339](karakeep-app/karakeep#2339)). By [@&#8203;RobertRosca](https://github.com/RobertRosca)!
  - Import from Instapaper ([#&#8203;2434](karakeep-app/karakeep#2434)). By [@&#8203;WieserDaniel](https://github.com/WieserDaniel)!
  - Privacy-respecting bookmark debugger admin tool ([#&#8203;2373](karakeep-app/karakeep#2373))
  - MCP server now supports custom configurable HTTP headers ([#&#8203;2436](karakeep-app/karakeep#2436)). By [@&#8203;chen-ye](https://github.com/chen-ye)!
  - New search qualifiers:
    - `source:` filter to search by bookmark source (mobile, extension, web, etc.) ([#&#8203;2465](karakeep-app/karakeep#2465)).
    - `tag:` alias for `#` and `!` alias for negation ([#&#8203;2425](karakeep-app/karakeep#2425)).
    - New "Title Contains" condition in the Rule Engine ([#&#8203;2354](karakeep-app/karakeep#2354)). By [@&#8203;mokhovyk](https://github.com/mokhovyk)!

##### UX Improvements ✨

- Mobile app overhaul:
  - Native tabs and more native-feeling screens.
  - Animated UI feedback in the sharing modal ([#&#8203;2427](karakeep-app/karakeep#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 ([#&#8203;2467](karakeep-app/karakeep#2467)).
- Links to apps, extensions and docs in the profile dropdown.
- Extension autofocuses on note field on open ([#&#8203;2366](karakeep-app/karakeep#2366)). By [@&#8203;SnowSquire](https://github.com/SnowSquire)!
- Improving the visual consistency of the settings page.
- Opt-in OAuth auto-redirect for single-provider passwordless setups ([#&#8203;2483](karakeep-app/karakeep#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 ([#&#8203;2400](karakeep-app/karakeep#2400)). By [@&#8203;evan6seven](https://github.com/evan6seven)!
- Hide confusing `No suggestions` message when no search suggestions are available.

##### Fixes 🔧

- \[Security] Sanitize reddit's crawling output to prevent stored XSS. This was reported by [@&#8203;ByamB4](https://github.com/ByamB4) and published as a github advisory (GHSA-mg93-f9mw-wpgj).
- Eliminated O(n²) parsing of Netscape bookmark imports ([#&#8203;2338](karakeep-app/karakeep#2338)).
- Smart lists can now be used in search qualifiers and in other smart list queries ([#&#8203;2470](karakeep-app/karakeep#2470))
- Parallelize content extraction in the crawler worker for faster crawling.
- Batch meilisearch indexing requests for better performance ([#&#8203;2441](karakeep-app/karakeep#2441)).
- Auto dismiss dialogs during crawling that might have caused worker crashes before.
- Use user's preferred language for manual summarization ([#&#8203;2429](karakeep-app/karakeep#2429)).
- Accept more permissive RSS feed content types ([#&#8203;2353](karakeep-app/karakeep#2353)). By [@&#8203;ElectricTea](https://github.com/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 ([#&#8203;2340](karakeep-app/karakeep#2340)). By [@&#8203;sweepies](https://github.com/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 ([#&#8203;2258](karakeep-app/karakeep#2258)).
- Respect archived display behavior setting in mobile lists and tags ([#&#8203;2499](karakeep-app/karakeep#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. ([#&#8203;2503](karakeep-app/karakeep#2503))
- Reader settings preview in the mobile app now matches reader view formatting ([#&#8203;2365](karakeep-app/karakeep#2365)). By [@&#8203;esimkowitz](https://github.com/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 ([#&#8203;2453](karakeep-app/karakeep#2453)).
- Prometheus metric for bookmark crawl latency ([#&#8203;2461](karakeep-app/karakeep#2461)).
- New `checkUrl` API endpoint to check if a URL is already bookmarked.
- `attachedBy` field in the update tags API endpoint to mark the tag as added by human or AI ([#&#8203;2281](karakeep-app/karakeep#2281)).
- Upgraded to Expo SDK 54, React 19.2.1, and Node.js 24.
- CLI can now search bookmarks ([#&#8203;2426](karakeep-app/karakeep#2426)).

##### Screenshots 📸

##### Reader Progress

![https://github.com/user-attachments/assets/86b259f6-2ce7-493f-a02c-d883c76c901c](https://github.com/user-attachments/assets/86b259f6-2ce7-493f-a02c-d883c76c901c)

##### Import Details

![https://github.com/user-attachments/assets/b37c91a5-b74a-4de5-94d3-f25c346cae7b](https://github.com/user-attachments/assets/b37c91a5-b74a-4de5-94d3-f25c346cae7b)

##### 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, bump the version and then run `docker compose pull && docker compose up -d`.

##### All Commits

- fix(workers): sanitize reddits metascraper output - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ba3db95`](karakeep-app/karakeep@ba3db95)
- fix(i18n): update en\_US translation strings - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`52c1e9f`](karakeep-app/karakeep@52c1e9f0)
- i18n: Sync weblate translations - Weblate in [`f7ae922`](karakeep-app/karakeep@f7ae922c)
- fix(workers): mitigate leaking browser contexts and setup and auto reaper ([#&#8203;2503](karakeep-app/karakeep#2503)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`627faf5`](karakeep-app/karakeep@627faf51)
- fix(web): avoid flicker on closing bookmark preview on search page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ec0aaad`](karakeep-app/karakeep@ec0aaad0)
- fix(mobile): respect archiveDisplayBehaviour setting in lists and tags ([#&#8203;2499](karakeep-app/karakeep#2499)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`59a2560`](karakeep-app/karakeep@59a25607)
- fix(web): fix scrolling in manage lists/edit tags when inside a dialog. fixes [#&#8203;2258](karakeep-app/karakeep#2258) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e37d728`](karakeep-app/karakeep@e37d7286)
- fix(mobile): remove the use of custom safe areas - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ef0b50b`](karakeep-app/karakeep@ef0b50be)
- fix(mobile): remove smart lists from manage\_lists page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7124d15`](karakeep-app/karakeep@7124d15b)
- docs: correct breaking typo in 05-singlefile.md doc ([#&#8203;2496](karakeep-app/karakeep#2496)) - [@&#8203;brandongalbraith](https://github.com/brandongalbraith) in [`0e3bc6f`](karakeep-app/karakeep@0e3bc6f1)
- fix(mobile): fix formsheets on android - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`228eb20`](karakeep-app/karakeep@228eb208)
- fix(ui): fix the colors of buttons in the settings page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3d6c83d`](karakeep-app/karakeep@3d6c83d5)
- fix(ui): Improve visual consistency in all settings page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e02a4c5`](karakeep-app/karakeep@e02a4c5e)
- feat: add checkUrl endpoint to replace searchBookmarks for URL existence checks - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b249273`](karakeep-app/karakeep@b2492735)
- fix: auto dismiss dialogs during crawling - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`23ae17f`](karakeep-app/karakeep@23ae17fa)
- deps: fix mismatch in [@&#8203;types/react](https://github.com/types/react) across packages - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6f78d2f`](karakeep-app/karakeep@6f78d2f8)
- deps: upgrade playwright to 1.58.2 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`07cc3ef`](karakeep-app/karakeep@07cc3eff)
- fix(restate): call onError on rpc failures - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4fd0eaf`](karakeep-app/karakeep@4fd0eaf0)
- fix(mobile): drop the use of custom safe areas in bookmark lists - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`447d2cc`](karakeep-app/karakeep@447d2cc8)
- fix(mobile): fix headers in android app - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`349fe05`](karakeep-app/karakeep@349fe05e)
- fix: parallelize content extraction in crawler worker - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`74c3452`](karakeep-app/karakeep@74c34529)
- fix(ux): hide autocomplete dropdown when there are no suggestions - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c6417d8`](karakeep-app/karakeep@c6417d8e)
- docs: Add Cloudflare Workers AI provider ([#&#8203;2486](karakeep-app/karakeep#2486)) - [@&#8203;usr3](https://github.com/usr3) in [`5946ce8`](karakeep-app/karakeep@5946ce8f)
- feat: add synchronized reading progress for bookmarks ([#&#8203;2302](karakeep-app/karakeep#2302)) - [@&#8203;esimkowitz](https://github.com/esimkowitz) in [`fff0a28`](karakeep-app/karakeep@fff0a280)
- feat(mobile): Add highlights support for the mobile app ([#&#8203;2494](karakeep-app/karakeep#2494)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`459ee50`](karakeep-app/karakeep@459ee50e)
- fix: dont trigger background jobs if bookmark doesn't change on updateTags call - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`fbc63b9`](karakeep-app/karakeep@fbc63b92)
- fix(import): truncate title to max length in import worker - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`74b174a`](karakeep-app/karakeep@74b174ad)
- feat(crawler): retrun 403, 429 and 5XX status codes - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1c5c8ec`](karakeep-app/karakeep@1c5c8ec6)
- fix(web): fix clipping of reader view in smaller screens - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`41d2f0d`](karakeep-app/karakeep@41d2f0d7)
- fix(web): fix double scrolling in sidebar layout - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`a8e8ce9`](karakeep-app/karakeep@a8e8ce98)
- feat(ui): Add a better content fetching loading state in the bookmark preview - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`be09027`](karakeep-app/karakeep@be090270)
- feat: add a download button to the More submenu in bookmark options - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`2c57aa8`](karakeep-app/karakeep@2c57aa87)
- feat: add OAuth auto-redirect functionality ([#&#8203;2483](karakeep-app/karakeep#2483)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`33b91e3`](karakeep-app/karakeep@33b91e3f)
- feat: export lists in backups and exports ([#&#8203;2484](karakeep-app/karakeep#2484)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0c458ba`](karakeep-app/karakeep@0c458ba1)
- feat(workers): extract html parsing into a subprocess ([#&#8203;2485](karakeep-app/karakeep#2485)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7a10067`](karakeep-app/karakeep@7a100672)
- feat(mobile): make the bookmark edit UIs look more native - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ec7ef00`](karakeep-app/karakeep@ec7ef00f)
- fix: share PDFs as files instead of links in mobile app - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0fab1aa`](karakeep-app/karakeep@0fab1aa6)
- feat: link to apps and extensions, docs and twitter in profile dropdown - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d72788f`](karakeep-app/karakeep@d72788ff)
- fix: dedup list and recent search suggestions - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8539c83`](karakeep-app/karakeep@8539c836)
- fix: Support nested smart lists with cycle detection ([#&#8203;2470](karakeep-app/karakeep#2470)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b3d3602`](karakeep-app/karakeep@b3d3602d)
- feat(mobile): Add animated UI feedback to sharing modal ([#&#8203;2427](karakeep-app/karakeep#2427)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b41b564`](karakeep-app/karakeep@b41b5647)
- feat(mobile): more native screens - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e455e46`](karakeep-app/karakeep@e455e468)
- feat(ai): Support restricting AI tags to a subset of existing tags ([#&#8203;2444](karakeep-app/karakeep#2444)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4186c4c`](karakeep-app/karakeep@4186c4c6)
- feat(mcp): Support custom configurable HTTP headers ([#&#8203;2436](karakeep-app/karakeep#2436)) - [@&#8203;chen-ye](https://github.com/chen-ye) in [`77b186c`](karakeep-app/karakeep@77b186c3)
- feat: Added Import for Instapaper ([#&#8203;2434](karakeep-app/karakeep#2434)) - [@&#8203;WieserDaniel](https://github.com/WieserDaniel) in [`fbe7e3a`](karakeep-app/karakeep@fbe7e3a9)
- feat: Add drag-and-drop support for bookmarks to lists ([#&#8203;2469](karakeep-app/karakeep#2469)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`485e994`](karakeep-app/karakeep@485e9948)
- feat(crawler): Split bookmark metadata updates into two phases for faster feedback ([#&#8203;2467](karakeep-app/karakeep#2467)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c8464e3`](karakeep-app/karakeep@c8464e30)
- feat: add source filter to query language ([#&#8203;2465](karakeep-app/karakeep#2465)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b05a753`](karakeep-app/karakeep@b05a7531)
- fix: treat bookmark not found as a no-op in rule engine instead of a failure ([#&#8203;2464](karakeep-app/karakeep#2464)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`960ca9b`](karakeep-app/karakeep@960ca9b6)
- fix(extension): dont store tab title when saving links or images. fixes [#&#8203;2462](karakeep-app/karakeep#2462) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1a01f75`](karakeep-app/karakeep@1a01f75d)
- feat: Add separate queue for import link crawling ([#&#8203;2452](karakeep-app/karakeep#2452)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`bbd65fd`](karakeep-app/karakeep@bbd65fd6)
- fix: lower the priority of recrawling - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7d53e2e`](karakeep-app/karakeep@7d53e2e4)
- feat(metrics): add prometheus metric for bookmark crawl latency ([#&#8203;2461](karakeep-app/karakeep#2461)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b264080`](karakeep-app/karakeep@b2640803)
- feat(db): add OpenTelemetry instrumentation for database queries - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`9e5693c`](karakeep-app/karakeep@9e5693c6)
- feat(import): new import details page ([#&#8203;2451](karakeep-app/karakeep#2451)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e59fd98`](karakeep-app/karakeep@e59fd98b)
- feat: add extra instrumentation in the otel traces ([#&#8203;2453](karakeep-app/karakeep#2453)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`538035c`](karakeep-app/karakeep@538035c4)
- fix(import): sanitize error messages to prevent backend detail leakage ([#&#8203;2455](karakeep-app/karakeep#2455)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`93ad2e2`](karakeep-app/karakeep@93ad2e20)
- fix(import): propagate crawling/tagging failure to import status - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`50320ec`](karakeep-app/karakeep@50320ecd)
- fix: backfill old sessions and do queue backpressure ([#&#8203;2449](karakeep-app/karakeep#2449)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e8e48a4`](karakeep-app/karakeep@e8e48a41)
- feat: Import workflow v3 ([#&#8203;2378](karakeep-app/karakeep#2378)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3c838dd`](karakeep-app/karakeep@3c838ddb)
- feat: Add LLM-based OCR as alternative to Tesseract ([#&#8203;2442](karakeep-app/karakeep#2442)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3fcccb8`](karakeep-app/karakeep@3fcccb85)
- feat: batch meilisearch requests ([#&#8203;2441](karakeep-app/karakeep#2441)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`54243b8`](karakeep-app/karakeep@54243b8c)
- fix(mobile): migrate from RN image to expo-image - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e861880`](karakeep-app/karakeep@e8618800)
- feat(mobile): use native tabs for mobile - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`bf5c99c`](karakeep-app/karakeep@bf5c99cb)
- feat(mobile): add signup support to the mobile app - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5cb7306`](karakeep-app/karakeep@5cb73069)
- fix: better looking error message when article content is unavailable - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`67501ed`](karakeep-app/karakeep@67501ed6)
- refactor: migrate trpc to the new react query integration mode ([#&#8203;2438](karakeep-app/karakeep#2438)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`65f6e83`](karakeep-app/karakeep@65f6e83f)
- feat(mobile): show num bookmarks in the all lists view - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4bc1b90`](karakeep-app/karakeep@4bc1b90f)
- fix: use user's preferred language for manual summarization ([#&#8203;2429](karakeep-app/karakeep#2429)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`95bfa56`](karakeep-app/karakeep@95bfa569)
- feat(cli): Add bookmark search command ([#&#8203;2426](karakeep-app/karakeep#2426)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`42cdc93`](karakeep-app/karakeep@42cdc937)
- feat(search): add tag: alias for # and ! alias for negation ([#&#8203;2425](karakeep-app/karakeep#2425)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5656e39`](karakeep-app/karakeep@5656e394)
- feat(extension): autofocus on note open ([#&#8203;2366](karakeep-app/karakeep#2366)) - [@&#8203;SnowSquire](https://github.com/SnowSquire) in [`bf2c6de`](karakeep-app/karakeep@bf2c6ded)
- feat: Add attachedBy field to update tags endpoint ([#&#8203;2281](karakeep-app/karakeep#2281)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e09061b`](karakeep-app/karakeep@e09061bd)
- docker: add USE\_JEMALLOC env var and disable it by default - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`edf3f68`](karakeep-app/karakeep@edf3f681)
- docker: switch to jemalloc - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6535a5a`](karakeep-app/karakeep@6535a5a2)
- docker: move from alpine to debian - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b0036ef`](karakeep-app/karakeep@b0036ef1)
- feat: track api key usage dates - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7b5f632`](karakeep-app/karakeep@7b5f6328)
- deps(mobile): upgrade to sdk 54 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6094d36`](karakeep-app/karakeep@6094d360)
- feat(rules): add "Title Contains" condition to Rule Engine ([#&#8203;1670](karakeep-app/karakeep#1670)) ([#&#8203;2354](karakeep-app/karakeep#2354)) - [@&#8203;mokhovyk](https://github.com/mokhovyk) in [`c56cf4e`](karakeep-app/karakeep@c56cf4e2)
- fix(mobile): Reader settings preview on mobile matches reader view formatting ([#&#8203;2365](karakeep-app/karakeep#2365)) - [@&#8203;esimkowitz](https://github.com/esimkowitz) in [`1b98014`](karakeep-app/karakeep@1b98014d)
- fix(web): avoid masonry overflow in bookmark grids ([#&#8203;2400](karakeep-app/karakeep#2400)) - [@&#8203;evan6seven](https://github.com/evan6seven) in [`789188b`](karakeep-app/karakeep@789188b5)
- deps: upgrade react to 19.2.1 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`086b464`](karakeep-app/karakeep@086b464d)
- fix(mobile): add custom headers to card banners. fixes [#&#8203;2342](karakeep-app/karakeep#2342) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b4dbc9c`](karakeep-app/karakeep@b4dbc9ce)
- feat: privacy-respecting bookmark debugger admin tool ([#&#8203;2373](karakeep-app/karakeep#2373)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0f9132b`](karakeep-app/karakeep@0f9132b5)
- fix: Accept more permissive RSS feed content types and Fix User-Agent key ([#&#8203;2353](karakeep-app/karakeep#2353)) - [@&#8203;ElectricTea](https://github.com/ElectricTea) in [`0e938c1`](karakeep-app/karakeep@0e938c14)
- fix: harden the restate implementation ([#&#8203;2370](karakeep-app/karakeep#2370)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f48e98e`](karakeep-app/karakeep@f48e98e1)
- fix: parallelize queue enqueues in bookmark routes - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4ba1475`](karakeep-app/karakeep@4ba1475d)
- feat: add openai service tier configuration option ([#&#8203;2339](karakeep-app/karakeep#2339)) - [@&#8203;RobertRosca](https://github.com/RobertRosca) in [`aa7a81e`](karakeep-app/karakeep@aa7a81e0)
- fix: stop theme flashes with cloudflare rocket loader ([#&#8203;2340](karakeep-app/karakeep#2340)) - [@&#8203;sweepies](https://github.com/sweepies) in [`2a6fe6e`](karakeep-app/karakeep@2a6fe6e6)
- feat: Add retry buttons for pending bookmarks in admin panel ([#&#8203;2341](karakeep-app/karakeep#2341)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e195f40`](karakeep-app/karakeep@e195f40b)
- fix: Eliminate the O(n2) parsing of the netscape import parsing ([#&#8203;2338](karakeep-app/karakeep#2338)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6fe2063`](karakeep-app/karakeep@6fe20639)
- feat(mobile): use react native sonner - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`016433d`](karakeep-app/karakeep@016433d4)

</details>

---

### Configuration

📅 **Schedule**: 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 is behind base branch, 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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNS43IiwidXBkYXRlZEluVmVyIjoiNDMuMjUuNyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4163
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant