feat(mobile): Add highlights support for the mobile app#2494
feat(mobile): Add highlights support for the mobile app#2494MohamedBassem merged 1 commit intokarakeep-app:mainfrom
Conversation
WalkthroughThis 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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ 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. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (3)
apps/web/tailwind.config.ts (1)
6-9: Glob scope inconsistency with mobile config (minor).
apps/web/tailwind.config.tsscans../../packages/shared-react/components/**/*.{ts,tsx}, whileapps/mobile/tailwind.config.jsscans../../packages/shared-react/**/*.{js,jsx,ts,tsx}— broader scope coveringlib/and JS files too. For consistency (and to cover any future utility files that reference class strings outsidecomponents/), 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 likeborderLwould 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 anyonSuccess/onErrorcallbacks, 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 SummaryThis PR adds highlights support to the mobile app by extracting
Confidence Score: 4/5
Important Files Changed
Last reviewed commit: 97766e2 |
Additional Comments (2)
This Consider adding a dependency array with Prompt To Fix With AIThis 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.
Prompt To Fix With AIThis 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. |
There was a problem hiding this comment.
💡 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".
| <Button | ||
| size="sm" | ||
| onClick={onDelete} | ||
| variant="ghost" | ||
| title="Delete highlight" |
There was a problem hiding this comment.
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 👍 / 👎.
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 [@​esimkowitz](https://github.com/esimkowitz), [@​WieserDaniel](https://github.com/WieserDaniel), [@​chen-ye](https://github.com/chen-ye), [@​SnowSquire](https://github.com/SnowSquire), [@​mokhovyk](https://github.com/mokhovyk), [@​evan6seven](https://github.com/evan6seven), [@​ElectricTea](https://github.com/ElectricTea), [@​RobertRosca](https://github.com/RobertRosca), [@​sweepies](https://github.com/sweepies), [@​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 ([#​2302](karakeep-app/karakeep#2302)). By [@​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 ([#​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 ([#​2378](karakeep-app/karakeep#2378)) - The import experience got another big overhaul: a new import details page ([#​2451](karakeep-app/karakeep#2451)), a dedicated low-priority queue for import crawling ([#​2452](karakeep-app/karakeep#2452)), better progress tracking, ability to pause an import and more resilient error handling. - Drag-and-drop bookmarks into lists ([#​2469](karakeep-app/karakeep#2469)) - Highlights support on mobile ([#​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 ([#​2444](karakeep-app/karakeep#2444)). - Export lists in backups and exports ([#​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 ([#​2341](karakeep-app/karakeep#2341)). - Add signup support to the mobile app. - OpenAI service tier configuration via `OPENAI_SERVICE_TIER` ([#​2339](karakeep-app/karakeep#2339)). By [@​RobertRosca](https://github.com/RobertRosca)! - Import from Instapaper ([#​2434](karakeep-app/karakeep#2434)). By [@​WieserDaniel](https://github.com/WieserDaniel)! - Privacy-respecting bookmark debugger admin tool ([#​2373](karakeep-app/karakeep#2373)) - MCP server now supports custom configurable HTTP headers ([#​2436](karakeep-app/karakeep#2436)). By [@​chen-ye](https://github.com/chen-ye)! - New search qualifiers: - `source:` filter to search by bookmark source (mobile, extension, web, etc.) ([#​2465](karakeep-app/karakeep#2465)). - `tag:` alias for `#` and `!` alias for negation ([#​2425](karakeep-app/karakeep#2425)). - New "Title Contains" condition in the Rule Engine ([#​2354](karakeep-app/karakeep#2354)). By [@​mokhovyk](https://github.com/mokhovyk)! ##### UX Improvements ✨ - Mobile app overhaul: - Native tabs and more native-feeling screens. - Animated UI feedback in the sharing modal ([#​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 ([#​2467](karakeep-app/karakeep#2467)). - Links to apps, extensions and docs in the profile dropdown. - Extension autofocuses on note field on open ([#​2366](karakeep-app/karakeep#2366)). By [@​SnowSquire](https://github.com/SnowSquire)! - Improving the visual consistency of the settings page. - Opt-in OAuth auto-redirect for single-provider passwordless setups ([#​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 ([#​2400](karakeep-app/karakeep#2400)). By [@​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 [@​ByamB4](https://github.com/ByamB4) and published as a github advisory (GHSA-mg93-f9mw-wpgj). - Eliminated O(n²) parsing of Netscape bookmark imports ([#​2338](karakeep-app/karakeep#2338)). - Smart lists can now be used in search qualifiers and in other smart list queries ([#​2470](karakeep-app/karakeep#2470)) - Parallelize content extraction in the crawler worker for faster crawling. - Batch meilisearch indexing requests for better performance ([#​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 ([#​2429](karakeep-app/karakeep#2429)). - Accept more permissive RSS feed content types ([#​2353](karakeep-app/karakeep#2353)). By [@​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 ([#​2340](karakeep-app/karakeep#2340)). By [@​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 ([#​2258](karakeep-app/karakeep#2258)). - Respect archived display behavior setting in mobile lists and tags ([#​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. ([#​2503](karakeep-app/karakeep#2503)) - Reader settings preview in the mobile app now matches reader view formatting ([#​2365](karakeep-app/karakeep#2365)). By [@​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 ([#​2453](karakeep-app/karakeep#2453)). - Prometheus metric for bookmark crawl latency ([#​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 ([#​2281](karakeep-app/karakeep#2281)). - Upgraded to Expo SDK 54, React 19.2.1, and Node.js 24. - CLI can now search bookmarks ([#​2426](karakeep-app/karakeep#2426)). ##### Screenshots 📸 ##### Reader Progress  ##### Import Details  ##### 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 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ba3db95`](karakeep-app/karakeep@ba3db95) - fix(i18n): update en\_US translation strings - [@​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 ([#​2503](karakeep-app/karakeep#2503)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`627faf5`](karakeep-app/karakeep@627faf51) - fix(web): avoid flicker on closing bookmark preview on search page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ec0aaad`](karakeep-app/karakeep@ec0aaad0) - fix(mobile): respect archiveDisplayBehaviour setting in lists and tags ([#​2499](karakeep-app/karakeep#2499)) - [@​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 [#​2258](karakeep-app/karakeep#2258) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e37d728`](karakeep-app/karakeep@e37d7286) - fix(mobile): remove the use of custom safe areas - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ef0b50b`](karakeep-app/karakeep@ef0b50be) - fix(mobile): remove smart lists from manage\_lists page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`7124d15`](karakeep-app/karakeep@7124d15b) - docs: correct breaking typo in 05-singlefile.md doc ([#​2496](karakeep-app/karakeep#2496)) - [@​brandongalbraith](https://github.com/brandongalbraith) in [`0e3bc6f`](karakeep-app/karakeep@0e3bc6f1) - fix(mobile): fix formsheets on android - [@​MohamedBassem](https://github.com/MohamedBassem) in [`228eb20`](karakeep-app/karakeep@228eb208) - fix(ui): fix the colors of buttons in the settings page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`3d6c83d`](karakeep-app/karakeep@3d6c83d5) - fix(ui): Improve visual consistency in all settings page - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e02a4c5`](karakeep-app/karakeep@e02a4c5e) - feat: add checkUrl endpoint to replace searchBookmarks for URL existence checks - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b249273`](karakeep-app/karakeep@b2492735) - fix: auto dismiss dialogs during crawling - [@​MohamedBassem](https://github.com/MohamedBassem) in [`23ae17f`](karakeep-app/karakeep@23ae17fa) - deps: fix mismatch in [@​types/react](https://github.com/types/react) across packages - [@​MohamedBassem](https://github.com/MohamedBassem) in [`6f78d2f`](karakeep-app/karakeep@6f78d2f8) - deps: upgrade playwright to 1.58.2 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`07cc3ef`](karakeep-app/karakeep@07cc3eff) - fix(restate): call onError on rpc failures - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4fd0eaf`](karakeep-app/karakeep@4fd0eaf0) - fix(mobile): drop the use of custom safe areas in bookmark lists - [@​MohamedBassem](https://github.com/MohamedBassem) in [`447d2cc`](karakeep-app/karakeep@447d2cc8) - fix(mobile): fix headers in android app - [@​MohamedBassem](https://github.com/MohamedBassem) in [`349fe05`](karakeep-app/karakeep@349fe05e) - fix: parallelize content extraction in crawler worker - [@​MohamedBassem](https://github.com/MohamedBassem) in [`74c3452`](karakeep-app/karakeep@74c34529) - fix(ux): hide autocomplete dropdown when there are no suggestions - [@​MohamedBassem](https://github.com/MohamedBassem) in [`c6417d8`](karakeep-app/karakeep@c6417d8e) - docs: Add Cloudflare Workers AI provider ([#​2486](karakeep-app/karakeep#2486)) - [@​usr3](https://github.com/usr3) in [`5946ce8`](karakeep-app/karakeep@5946ce8f) - feat: add synchronized reading progress for bookmarks ([#​2302](karakeep-app/karakeep#2302)) - [@​esimkowitz](https://github.com/esimkowitz) in [`fff0a28`](karakeep-app/karakeep@fff0a280) - feat(mobile): Add highlights support for the mobile app ([#​2494](karakeep-app/karakeep#2494)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`459ee50`](karakeep-app/karakeep@459ee50e) - fix: dont trigger background jobs if bookmark doesn't change on updateTags call - [@​MohamedBassem](https://github.com/MohamedBassem) in [`fbc63b9`](karakeep-app/karakeep@fbc63b92) - fix(import): truncate title to max length in import worker - [@​MohamedBassem](https://github.com/MohamedBassem) in [`74b174a`](karakeep-app/karakeep@74b174ad) - feat(crawler): retrun 403, 429 and 5XX status codes - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1c5c8ec`](karakeep-app/karakeep@1c5c8ec6) - fix(web): fix clipping of reader view in smaller screens - [@​MohamedBassem](https://github.com/MohamedBassem) in [`41d2f0d`](karakeep-app/karakeep@41d2f0d7) - fix(web): fix double scrolling in sidebar layout - [@​MohamedBassem](https://github.com/MohamedBassem) in [`a8e8ce9`](karakeep-app/karakeep@a8e8ce98) - feat(ui): Add a better content fetching loading state in the bookmark preview - [@​MohamedBassem](https://github.com/MohamedBassem) in [`be09027`](karakeep-app/karakeep@be090270) - feat: add a download button to the More submenu in bookmark options - [@​MohamedBassem](https://github.com/MohamedBassem) in [`2c57aa8`](karakeep-app/karakeep@2c57aa87) - feat: add OAuth auto-redirect functionality ([#​2483](karakeep-app/karakeep#2483)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`33b91e3`](karakeep-app/karakeep@33b91e3f) - feat: export lists in backups and exports ([#​2484](karakeep-app/karakeep#2484)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`0c458ba`](karakeep-app/karakeep@0c458ba1) - feat(workers): extract html parsing into a subprocess ([#​2485](karakeep-app/karakeep#2485)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`7a10067`](karakeep-app/karakeep@7a100672) - feat(mobile): make the bookmark edit UIs look more native - [@​MohamedBassem](https://github.com/MohamedBassem) in [`ec7ef00`](karakeep-app/karakeep@ec7ef00f) - fix: share PDFs as files instead of links in mobile app - [@​MohamedBassem](https://github.com/MohamedBassem) in [`0fab1aa`](karakeep-app/karakeep@0fab1aa6) - feat: link to apps and extensions, docs and twitter in profile dropdown - [@​MohamedBassem](https://github.com/MohamedBassem) in [`d72788f`](karakeep-app/karakeep@d72788ff) - fix: dedup list and recent search suggestions - [@​MohamedBassem](https://github.com/MohamedBassem) in [`8539c83`](karakeep-app/karakeep@8539c836) - fix: Support nested smart lists with cycle detection ([#​2470](karakeep-app/karakeep#2470)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b3d3602`](karakeep-app/karakeep@b3d3602d) - feat(mobile): Add animated UI feedback to sharing modal ([#​2427](karakeep-app/karakeep#2427)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b41b564`](karakeep-app/karakeep@b41b5647) - feat(mobile): more native screens - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e455e46`](karakeep-app/karakeep@e455e468) - feat(ai): Support restricting AI tags to a subset of existing tags ([#​2444](karakeep-app/karakeep#2444)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4186c4c`](karakeep-app/karakeep@4186c4c6) - feat(mcp): Support custom configurable HTTP headers ([#​2436](karakeep-app/karakeep#2436)) - [@​chen-ye](https://github.com/chen-ye) in [`77b186c`](karakeep-app/karakeep@77b186c3) - feat: Added Import for Instapaper ([#​2434](karakeep-app/karakeep#2434)) - [@​WieserDaniel](https://github.com/WieserDaniel) in [`fbe7e3a`](karakeep-app/karakeep@fbe7e3a9) - feat: Add drag-and-drop support for bookmarks to lists ([#​2469](karakeep-app/karakeep#2469)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`485e994`](karakeep-app/karakeep@485e9948) - feat(crawler): Split bookmark metadata updates into two phases for faster feedback ([#​2467](karakeep-app/karakeep#2467)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`c8464e3`](karakeep-app/karakeep@c8464e30) - feat: add source filter to query language ([#​2465](karakeep-app/karakeep#2465)) - [@​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 ([#​2464](karakeep-app/karakeep#2464)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`960ca9b`](karakeep-app/karakeep@960ca9b6) - fix(extension): dont store tab title when saving links or images. fixes [#​2462](karakeep-app/karakeep#2462) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`1a01f75`](karakeep-app/karakeep@1a01f75d) - feat: Add separate queue for import link crawling ([#​2452](karakeep-app/karakeep#2452)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`bbd65fd`](karakeep-app/karakeep@bbd65fd6) - fix: lower the priority of recrawling - [@​MohamedBassem](https://github.com/MohamedBassem) in [`7d53e2e`](karakeep-app/karakeep@7d53e2e4) - feat(metrics): add prometheus metric for bookmark crawl latency ([#​2461](karakeep-app/karakeep#2461)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b264080`](karakeep-app/karakeep@b2640803) - feat(db): add OpenTelemetry instrumentation for database queries - [@​MohamedBassem](https://github.com/MohamedBassem) in [`9e5693c`](karakeep-app/karakeep@9e5693c6) - feat(import): new import details page ([#​2451](karakeep-app/karakeep#2451)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e59fd98`](karakeep-app/karakeep@e59fd98b) - feat: add extra instrumentation in the otel traces ([#​2453](karakeep-app/karakeep#2453)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`538035c`](karakeep-app/karakeep@538035c4) - fix(import): sanitize error messages to prevent backend detail leakage ([#​2455](karakeep-app/karakeep#2455)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`93ad2e2`](karakeep-app/karakeep@93ad2e20) - fix(import): propagate crawling/tagging failure to import status - [@​MohamedBassem](https://github.com/MohamedBassem) in [`50320ec`](karakeep-app/karakeep@50320ecd) - fix: backfill old sessions and do queue backpressure ([#​2449](karakeep-app/karakeep#2449)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e8e48a4`](karakeep-app/karakeep@e8e48a41) - feat: Import workflow v3 ([#​2378](karakeep-app/karakeep#2378)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`3c838dd`](karakeep-app/karakeep@3c838ddb) - feat: Add LLM-based OCR as alternative to Tesseract ([#​2442](karakeep-app/karakeep#2442)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`3fcccb8`](karakeep-app/karakeep@3fcccb85) - feat: batch meilisearch requests ([#​2441](karakeep-app/karakeep#2441)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`54243b8`](karakeep-app/karakeep@54243b8c) - fix(mobile): migrate from RN image to expo-image - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e861880`](karakeep-app/karakeep@e8618800) - feat(mobile): use native tabs for mobile - [@​MohamedBassem](https://github.com/MohamedBassem) in [`bf5c99c`](karakeep-app/karakeep@bf5c99cb) - feat(mobile): add signup support to the mobile app - [@​MohamedBassem](https://github.com/MohamedBassem) in [`5cb7306`](karakeep-app/karakeep@5cb73069) - fix: better looking error message when article content is unavailable - [@​MohamedBassem](https://github.com/MohamedBassem) in [`67501ed`](karakeep-app/karakeep@67501ed6) - refactor: migrate trpc to the new react query integration mode ([#​2438](karakeep-app/karakeep#2438)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`65f6e83`](karakeep-app/karakeep@65f6e83f) - feat(mobile): show num bookmarks in the all lists view - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4bc1b90`](karakeep-app/karakeep@4bc1b90f) - fix: use user's preferred language for manual summarization ([#​2429](karakeep-app/karakeep#2429)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`95bfa56`](karakeep-app/karakeep@95bfa569) - feat(cli): Add bookmark search command ([#​2426](karakeep-app/karakeep#2426)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`42cdc93`](karakeep-app/karakeep@42cdc937) - feat(search): add tag: alias for # and ! alias for negation ([#​2425](karakeep-app/karakeep#2425)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`5656e39`](karakeep-app/karakeep@5656e394) - feat(extension): autofocus on note open ([#​2366](karakeep-app/karakeep#2366)) - [@​SnowSquire](https://github.com/SnowSquire) in [`bf2c6de`](karakeep-app/karakeep@bf2c6ded) - feat: Add attachedBy field to update tags endpoint ([#​2281](karakeep-app/karakeep#2281)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e09061b`](karakeep-app/karakeep@e09061bd) - docker: add USE\_JEMALLOC env var and disable it by default - [@​MohamedBassem](https://github.com/MohamedBassem) in [`edf3f68`](karakeep-app/karakeep@edf3f681) - docker: switch to jemalloc - [@​MohamedBassem](https://github.com/MohamedBassem) in [`6535a5a`](karakeep-app/karakeep@6535a5a2) - docker: move from alpine to debian - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b0036ef`](karakeep-app/karakeep@b0036ef1) - feat: track api key usage dates - [@​MohamedBassem](https://github.com/MohamedBassem) in [`7b5f632`](karakeep-app/karakeep@7b5f6328) - deps(mobile): upgrade to sdk 54 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`6094d36`](karakeep-app/karakeep@6094d360) - feat(rules): add "Title Contains" condition to Rule Engine ([#​1670](karakeep-app/karakeep#1670)) ([#​2354](karakeep-app/karakeep#2354)) - [@​mokhovyk](https://github.com/mokhovyk) in [`c56cf4e`](karakeep-app/karakeep@c56cf4e2) - fix(mobile): Reader settings preview on mobile matches reader view formatting ([#​2365](karakeep-app/karakeep#2365)) - [@​esimkowitz](https://github.com/esimkowitz) in [`1b98014`](karakeep-app/karakeep@1b98014d) - fix(web): avoid masonry overflow in bookmark grids ([#​2400](karakeep-app/karakeep#2400)) - [@​evan6seven](https://github.com/evan6seven) in [`789188b`](karakeep-app/karakeep@789188b5) - deps: upgrade react to 19.2.1 - [@​MohamedBassem](https://github.com/MohamedBassem) in [`086b464`](karakeep-app/karakeep@086b464d) - fix(mobile): add custom headers to card banners. fixes [#​2342](karakeep-app/karakeep#2342) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`b4dbc9c`](karakeep-app/karakeep@b4dbc9ce) - feat: privacy-respecting bookmark debugger admin tool ([#​2373](karakeep-app/karakeep#2373)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`0f9132b`](karakeep-app/karakeep@0f9132b5) - fix: Accept more permissive RSS feed content types and Fix User-Agent key ([#​2353](karakeep-app/karakeep#2353)) - [@​ElectricTea](https://github.com/ElectricTea) in [`0e938c1`](karakeep-app/karakeep@0e938c14) - fix: harden the restate implementation ([#​2370](karakeep-app/karakeep#2370)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`f48e98e`](karakeep-app/karakeep@f48e98e1) - fix: parallelize queue enqueues in bookmark routes - [@​MohamedBassem](https://github.com/MohamedBassem) in [`4ba1475`](karakeep-app/karakeep@4ba1475d) - feat: add openai service tier configuration option ([#​2339](karakeep-app/karakeep#2339)) - [@​RobertRosca](https://github.com/RobertRosca) in [`aa7a81e`](karakeep-app/karakeep@aa7a81e0) - fix: stop theme flashes with cloudflare rocket loader ([#​2340](karakeep-app/karakeep#2340)) - [@​sweepies](https://github.com/sweepies) in [`2a6fe6e`](karakeep-app/karakeep@2a6fe6e6) - feat: Add retry buttons for pending bookmarks in admin panel ([#​2341](karakeep-app/karakeep#2341)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`e195f40`](karakeep-app/karakeep@e195f40b) - fix: Eliminate the O(n2) parsing of the netscape import parsing ([#​2338](karakeep-app/karakeep#2338)) - [@​MohamedBassem](https://github.com/MohamedBassem) in [`6fe2063`](karakeep-app/karakeep@6fe20639) - feat(mobile): use react native sonner - [@​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>
shared-reactto be able to use it in the mobile app withuse dom.BookmarkHighligher.shared-reactpackage to be used by the shared components lib.