Skip to content

Conversation

@MohamedBassem
Copy link
Collaborator

Fixes #2063

claude and others added 2 commits November 21, 2025 08:40
This commit adds a search bar to the "All highlights page" that allows users to search their highlights by text content or notes.

Changes:
- Added search method to Highlight model with SQL LIKE query on text and note fields
- Added search endpoint to highlights router with pagination support
- Updated AllHighlights component to include search input with debouncing
- Search input includes clear button and search icon
- Maintains existing infinite scroll pagination for search results

Technical details:
- Uses SQL ilike for case-insensitive search
- 300ms debounce to reduce API calls
- Conditionally uses search or getAll endpoint based on search query
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 22, 2025

Walkthrough

Adds a paginated search: a client-side debounced search UI that switches queries, a new Highlight.search model method performing cursor-based database searches, and a tRPC router endpoint exposing the search API.

Changes

Cohort / File(s) Summary
Frontend search UI
apps/web/components/dashboard/highlights/AllHighlights.tsx
Added client-side search state with debounced input, conditional switching between getAll and search infinite queries, search input UI with icons/clear action, and integrated results/pagination handling.
Backend model
packages/trpc/models/highlights.ts
Added Highlight.search(ctx, searchText, cursor?, limit) implementing owner-scoped text/note matching with cursor-based pagination (uses limit+1 to compute nextCursor) and returns highlights plus nextCursor.
tRPC router
packages/trpc/routers/highlights.ts
Added search endpoint accepting { text, cursor, limit }, invoking Highlight.search, and returning results mapped to the existing public highlight response schema.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Review pagination correctness and ordering in Highlight.search (limit+1, nextCursor computation).
  • Verify input validation and zod typing for the new search router endpoint.
  • Check interaction between debounced input and query enabling/disabling to avoid redundant fetches or stale UI state.

Pre-merge checks

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Linked Issues check ❓ Inconclusive The PR implements search functionality for highlights with debounced search input and paginated results. However, the implementation adds a dedicated highlights search endpoint instead of using the suggested 'is:highlight' qualifier in the existing search syntax. Clarify whether the dedicated search endpoint is the intended solution or if integration with the existing search query language and 'is:highlight' qualifier is required per the issue's suggested implementation.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: Add search bar to highlights page' directly matches the main change: implementing search functionality for highlights with a UI search bar component.
Description check ✅ Passed The description 'Fixes #2063' is minimal but properly references the linked issue that defines the feature request being implemented.
Out of Scope Changes check ✅ Passed All changes are focused on adding search functionality to the highlights page: frontend search UI, backend search method, and new router endpoint. No unrelated changes detected.

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

Actionable comments posted: 2

🧹 Nitpick comments (2)
packages/trpc/routers/highlights.ts (1)

54-74: Search endpoint mirrors getAll correctly; consider minor hardening and scope check

The search procedure correctly:

  • Reuses DEFAULT_NUM_HIGHLIGHTS_PER_PAGE for pagination.
  • Returns the same zGetAllHighlightsResponseSchema shape.
  • Delegates to Highlight.search and maps to asPublicHighlight() like getAll.

Two follow‑ups to consider:

  • Add some basic constraints to text (e.g., .trim().min(1).max(256)) to avoid empty/overly long search strings hitting the DB.
  • The linked FR mentions an is:highlight qualifier in the existing global search language; this endpoint implements a dedicated highlights search instead. Confirm that this local, page‑specific search fully satisfies #2063 or whether a query‑language integration is still desired separately.
packages/trpc/models/highlights.ts (1)

2-2: Search implementation is consistent with getAll; consider empty-text guard and future indexing

The new Highlight.search method looks correct and consistent with getAll:

  • Auth is preserved via eq(highlights.userId, ctx.user.id).
  • Pagination window and nextCursor computation mirror getAll, so infinite queries behave identically.
  • Using like on text and note with a %${searchText}% pattern is straightforward and safe with Drizzle parameterization.

A couple of optional improvements:

  • Treat empty/whitespace‑only searchText as a special case (e.g., if (!searchText.trim()) return Highlight.getAll(ctx, cursor, limit);) to avoid generating a LIKE '%%' clause that behaves like an unfiltered scan if this method is ever called directly without frontend trimming.
  • At larger scales you may eventually want a dedicated index or FTS virtual table on highlight content to keep these LIKE queries fast; current schema only indexes userId and bookmarkId.

Also applies to: 117-161

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1b44eaf and 03eec00.

📒 Files selected for processing (3)
  • apps/web/components/dashboard/highlights/AllHighlights.tsx (3 hunks)
  • packages/trpc/models/highlights.ts (2 hunks)
  • packages/trpc/routers/highlights.ts (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-11-16T13:02:08.919Z
Learnt from: MohamedBassem
Repo: karakeep-app/karakeep PR: 2141
File: packages/db/schema.ts:160-165
Timestamp: 2025-11-16T13:02:08.919Z
Learning: In this codebase using Drizzle ORM with SQLite, enum definitions (e.g., `text("status", { enum: ["value1", "value2"] })`) only provide TypeScript-level type safety and do not require database migrations when values are added or modified. SQLite stores these as TEXT columns without database-level CHECK constraints, so schema changes to enums don't need corresponding migration files.

Applied to files:

  • packages/trpc/models/highlights.ts
🧬 Code graph analysis (3)
packages/trpc/routers/highlights.ts (3)
packages/trpc/index.ts (1)
  • authedProcedure (100-121)
packages/shared/types/highlights.ts (2)
  • DEFAULT_NUM_HIGHLIGHTS_PER_PAGE (5-5)
  • zGetAllHighlightsResponseSchema (37-40)
packages/trpc/models/highlights.ts (1)
  • Highlight (16-205)
packages/trpc/models/highlights.ts (3)
packages/trpc/index.ts (1)
  • AuthedContext (30-36)
packages/shared/types/pagination.ts (1)
  • zCursorV2 (3-6)
packages/db/schema.ts (1)
  • highlights (272-302)
apps/web/components/dashboard/highlights/AllHighlights.tsx (2)
packages/trpc/models/highlights.ts (1)
  • Highlight (16-205)
apps/web/components/dashboard/preview/BookmarkHtmlHighlighter.tsx (1)
  • Highlight (85-91)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: typecheck
  • GitHub Check: tests
🔇 Additional comments (2)
apps/web/components/dashboard/highlights/AllHighlights.tsx (2)

52-89: Debounced search + conditional infinite queries look solid

The debouncing and useSearchQuery flag combined with enabled on the two infinite queries are wired correctly and avoid double‑fetching while keeping initial SSR data via initialData. Switching between the base list and search results based on debouncedSearch.trim().length > 0 is clean and maintains the existing pagination shape.

Also applies to: 91-93


142-155: Infinite “Load More” behavior correctly shared between list and search

Reusing the same hasNextPage, isFetchingNextPage, and fetchNextPage wiring for both base and search queries via the useSearchQuery ? searchQueryResult : getAllQuery selection is a nice way to keep the pagination UI consistent across modes.

Comment on lines +127 to +141
{/* Results */}
<div className="flex flex-col gap-2">
{allHighlights &&
allHighlights.length > 0 &&
allHighlights.map((h) => (
<React.Fragment key={h.id}>
<Highlight highlight={h} />
<Separator className="m-2 h-0.5 bg-gray-100 last:hidden" />
</React.Fragment>
))}
{allHighlights && allHighlights.length == 0 && (
<p className="rounded-md bg-muted p-2 text-sm text-muted-foreground">
{t("highlights.no_highlights")}
</p>
)}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

Differentiate “no highlights yet” vs “no search results”

Right now the same t("highlights.no_highlights") message is shown both when the user has no highlights at all and when a search yields zero matches. That can be confusing when searching.

Consider branching on useSearchQuery and adding a dedicated “no search results” message key so users understand whether there are simply no highlights or just no matches for the current query.


I'll verify the review comment by examining the component structure and searching for related code patterns.


🏁 Script executed:

#!/bin/bash
# Get the full component file to understand its structure and state management
cat "apps/web/components/dashboard/highlights/AllHighlights.tsx"

Length of output: 4812


🏁 Script executed:

#!/bin/bash
# Search for useSearchQuery usage in the codebase to understand the pattern
rg -n "useSearchQuery" --type=ts --type=tsx -C 3

Length of output: 27


🏁 Script executed:

#!/bin/bash
# Search for search-related state or filters in the highlights context/hooks
rg -n "search" "apps/web/components/dashboard/highlights/" --type=ts --type=tsx -i -C 2

Length of output: 27


🏁 Script executed:

#!/bin/bash
# Look for i18n keys related to highlights and search
rg -n "highlights\." --type=ts --type=tsx -C 1 | grep -E "highlights\.(no_|search)" || echo "No search-related highlight keys found"

Length of output: 66


🏁 Script executed:

#!/bin/bash
# Check if there are any search-related props or parameters in the component
rg -n "search" "apps/web/components/dashboard/highlights/AllHighlights.tsx" -i

Length of output: 1029



🏁 Script executed:

#!/bin/bash
# Search for translation files with highlights keys
find . -type f \( -name "*.json" -o -name "*.ts" -o -name "*.js" \) -path "*/locales/*" -o -path "*/i18n/*" -o -path "*/translations/*" | head -20

Length of output: 774


🏁 Script executed:

#!/bin/bash
# Look for translation keys in common i18n file patterns
fd -t f "en\." --type f | head -20

Length of output: 93


🏁 Script executed:

#!/bin/bash
# Search for highlights translation keys in the codebase
rg "highlights\.no" -A 2 -B 2 | head -30

Length of output: 813


🏁 Script executed:

#!/bin/bash
# Check public or language directories for translation files
find . -type d \( -name "locales" -o -name "i18n" -o -name "translations" -o -name "lang" \) 2>/dev/null

Length of output: 47


Copy link
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.

Actionable comments posted: 0

🧹 Nitpick comments (1)
packages/trpc/routers/highlights.ts (1)

55-75: Well-structured search endpoint with room for input validation improvements.

The implementation correctly follows the existing getAll pattern and properly scopes results to the authenticated user. The use of zCursorV2.nullish() for cursor typing (line 59) is an improvement over getAll's z.any().nullish() (line 43).

However, consider adding validation for the text parameter:

  • Empty string handling: An empty search string would generate the pattern %%, matching all highlights. This could be expensive and may not reflect user intent.
  • Minimum length: Short search terms (1-2 characters) can be costly with LIKE queries and may return too many results.

Apply this diff to add input validation:

   .input(
     z.object({
-      text: z.string(),
+      text: z.string().min(1, "Search text cannot be empty").max(500, "Search text too long"),
       cursor: zCursorV2.nullish(),
       limit: z.number().optional().default(DEFAULT_NUM_HIGHLIGHTS_PER_PAGE),
     }),
   )

Optional performance consideration: The LIKE '%pattern%' query with leading wildcards cannot leverage database indexes efficiently. For large datasets, consider adding full-text search indexes or using a dedicated search service if search performance becomes a concern.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 03eec00 and 5f3390b.

📒 Files selected for processing (2)
  • apps/web/components/dashboard/highlights/AllHighlights.tsx (3 hunks)
  • packages/trpc/routers/highlights.ts (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/web/components/dashboard/highlights/AllHighlights.tsx
🧰 Additional context used
🧬 Code graph analysis (1)
packages/trpc/routers/highlights.ts (4)
packages/trpc/index.ts (1)
  • authedProcedure (100-121)
packages/shared/types/pagination.ts (1)
  • zCursorV2 (3-6)
packages/shared/types/highlights.ts (2)
  • DEFAULT_NUM_HIGHLIGHTS_PER_PAGE (5-5)
  • zGetAllHighlightsResponseSchema (37-40)
packages/trpc/models/highlights.ts (1)
  • Highlight (16-205)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: tests
  • GitHub Check: typecheck
🔇 Additional comments (1)
packages/trpc/routers/highlights.ts (1)

10-10: LGTM!

The import is necessary for the new search endpoint and properly typed.

@MohamedBassem MohamedBassem merged commit ed6a3bf into main Nov 23, 2025
10 checks passed
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Dec 3, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/karakeep-app/karakeep](https://github.com/karakeep-app/karakeep) | minor | `0.28.0` -> `0.29.0` |

---

### Release Notes

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

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

[Compare Source](karakeep-app/karakeep@v0.28.0...v0.29.0)

### 0.29.0

Welcome to the 0.29.0 release of Karakeep! This release ships some of our most awaited features. Collaborative lists, automated bookmark backups, search auto complete, highlighs are getting notes and search, and the mobile app is getting some more love. As usual thanks to [@&#8203;aa-ko](https://github.com/aa-ko), [@&#8203;fivestones](https://github.com/fivestones), 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. ~~We're still in private beta (you can signup for access [here](https://tally.so/r/wo8zzx)) and gradually letting more and more users in.~~ We're in public beta now and you can signup [here](https://cloud.karakeep.app) 🎉.

### New Features 🚀

- Collaborative lists are here! ([#&#8203;2146](karakeep-app/karakeep#2146), [#&#8203;2152](karakeep-app/karakeep#2152))
  - You can now invite collaborators to your lists and manage their access levels between viewers and editors.
  - This was the most requested feature on the roadmap, and it's now here!
- Automated bookmark backups you can schedule once and forget ([#&#8203;2182](karakeep-app/karakeep#2182))
  - Currently it only captures non-asset bookmarks, but I'm planning to include lists, tags, and other metadata in the future.
- Search gets autocomplete so you can find the right filters and terms faster ([#&#8203;2178](karakeep-app/karakeep#2178))
- Highlights overhaul: notes + search bar on web, plus a dedicated highlights page on mobile ([#&#8203;2154](karakeep-app/karakeep#2154), [#&#8203;2155](karakeep-app/karakeep#2155), [#&#8203;2156](karakeep-app/karakeep#2156), [#&#8203;2157](karakeep-app/karakeep#2157))
- Mobile catches up with smart list creation and an all-tags screen ([#&#8203;2153](karakeep-app/karakeep#2153), [#&#8203;2163](karakeep-app/karakeep#2163))
- Crawler domain rate limiting to avoid getting throttled by external sites ([#&#8203;2115](karakeep-app/karakeep#2115))
  - Configure it with `CRAWLER_DOMAIN_RATE_LIMIT_WINDOW_MS` and `CRAWLER_DOMAIN_RATE_LIMIT_MAX_REQUESTS`.
- Import from MyMind ([#&#8203;2138](karakeep-app/karakeep#2138))

### UX Improvements ✨

- Sidebar typography and colors should feel nicer (specially in dark mode).
- Page titles are now correctly displayed in the browser tabs.
- We have a friendlier 404 page for bookmarks/lists that don't exist.
- You can now see stats about the source of your bookmarks in the usage stats page (extension, web app, mobile app, etc).

### Fixes 🔧

- Prompts lazily load `js-tiktoken` which should cut between 70-150MB of karakeep's memory usage ([#&#8203;2176](karakeep-app/karakeep#2176))
- The edit dialog wasn't correctly showing the extracted text from assets, this is now fixed ([#&#8203;2181](karakeep-app/karakeep#2181)).
- IP validation allowlisting now allows bypassing all domains by setting `CRAWLER_ALLOWED_INTERNAL_HOSTNAMES` to `.`.
- Fix a worker crash when hitting invalid URLs with proxy enabled.

### For Developers 🛠️

- GET `/api/version` endpoint for getting server version ([#&#8203;2167](karakeep-app/karakeep#2167))
- More visibility: HTTP status Prometheus counters, failed\_permanent worker metric, and system metrics on web/worker containers ([#&#8203;2117](karakeep-app/karakeep#2117), [#&#8203;2107](karakeep-app/karakeep#2107))
- Documentation updates for `LOG_LEVEL` and Raycast links ([#&#8203;2166](karakeep-app/karakeep#2166), [#&#8203;1923](karakeep-app/karakeep#1923)) by [@&#8203;aa-ko](https://github.com/aa-ko) and [@&#8203;fivestones](https://github.com/fivestones)

### Screenshots 📸

#### Collaborative Lists

<img width="1342" height="840" alt="Screenshot 2025-11-29 at 6  23 18@&#8203;2x" src="https://github.com/user-attachments/assets/f19f9951-c460-413c-9757-6014a7ec4f7e" />

#### Automated Backups

<img width="1874" height="1540" alt="Screenshot 2025-11-29 at 6  23 57@&#8203;2x" src="https://github.com/user-attachments/assets/65dc7e0e-3ab3-4243-b451-5ef3a3e7130b" />

#### Search Autocomplete

<img width="1492" height="636" alt="Screenshot 2025-11-29 at 6  24 54@&#8203;2x" src="https://github.com/user-attachments/assets/ed2f7a61-835f-4ee6-8940-657110932526" />

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

- i18n: fix en\_US translation - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f01d96f`](karakeep-app/karakeep@f01d96fd)
- i18n: Sync weblate translations - [@&#8203;Hosted](https://github.com/Hosted) Weblate in [`e1ad2cf`](karakeep-app/karakeep@e1ad2cfd)
- feat: autocomplete search terms ([#&#8203;2178](karakeep-app/karakeep#2178)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ebafbe5`](karakeep-app/karakeep@ebafbe59)
- build: switch npm to trusted publishing - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`335a84b`](karakeep-app/karakeep@335a84bb)
- feat: Add automated bookmark backup feature ([#&#8203;2182](karakeep-app/karakeep#2182)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`86a4b39`](karakeep-app/karakeep@86a4b396)
- fix: making serverConfig readonly - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e67c33e`](karakeep-app/karakeep@e67c33e4)
- fix: fix react errors in signin and signup forms - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6ab7984`](karakeep-app/karakeep@6ab79845)
- fix: separate shared lists in the sidebar ([#&#8203;2180](karakeep-app/karakeep#2180)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`2619f4c`](karakeep-app/karakeep@2619f4cf)
- fix: correctly render asset extracted text in the edit bookmark dialog. fixes [#&#8203;2181](karakeep-app/karakeep#2181) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`9ed338f`](karakeep-app/karakeep@9ed338fe)
- fix: lazy load js-tiktoken in prompts module ([#&#8203;2176](karakeep-app/karakeep#2176)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e2877b4`](karakeep-app/karakeep@e2877b45)
- fix: fix colors in invitation form - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`a13a227`](karakeep-app/karakeep@a13a227e)
- fix: hide archived checkbox in shared lists - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`adde809`](karakeep-app/karakeep@adde8099)
- feat: improve font and colors of sidebar items - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5bea5d3`](karakeep-app/karakeep@5bea5d39)
- fix: Propagate group ids in queue calls ([#&#8203;2177](karakeep-app/karakeep#2177)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6821257`](karakeep-app/karakeep@6821257d)
- feat: Introduce groupId in restate queue ([#&#8203;2168](karakeep-app/karakeep#2168)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5426875`](karakeep-app/karakeep@54268759)
- fix: support invocation cancellation while awaiting sempahore - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`38842f7`](karakeep-app/karakeep@38842f77)
- docs: Add LOG\_LEVEL to configuration documentation ([#&#8203;2166](karakeep-app/karakeep#2166)) - [@&#8203;aa-ko](https://github.com/aa-ko) in [`6912d0d`](karakeep-app/karakeep@6912d0dd)
- docs: fix link to raycast extension ([#&#8203;1923](karakeep-app/karakeep#1923)) - [@&#8203;fivestones](https://github.com/fivestones) in [`9fedfc1`](karakeep-app/karakeep@9fedfc15)
- tests: Add a test for listing lists - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e16ae2a`](karakeep-app/karakeep@e16ae2a4)
- feat: add GET /api/version endpoint ([#&#8203;2167](karakeep-app/karakeep#2167)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`472adec`](karakeep-app/karakeep@472adec7)
- fix(mcp): propagate parent id to createList call. fixes: [#&#8203;2144](karakeep-app/karakeep#2144) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0d14130`](karakeep-app/karakeep@0d14130c)
- feat(mobile): proper handling for shared list permissions ([#&#8203;2165](karakeep-app/karakeep#2165)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c5c71ba`](karakeep-app/karakeep@c5c71ba9)
- feat(mobile): Add highlights page to mobile app ([#&#8203;2156](karakeep-app/karakeep#2156)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8a5a109`](karakeep-app/karakeep@8a5a109c)
- feat: A better looking 404 page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7f555f5`](karakeep-app/karakeep@7f555f57)
- fix: hide manage collaborators option for smart lists - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`2b38c00`](karakeep-app/karakeep@2b38c006)
- fix: Hide shared lists where user is a viewer in Manage Lists dialog ([#&#8203;2164](karakeep-app/karakeep#2164)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e4db9bf`](karakeep-app/karakeep@e4db9bf2)
- feat(mobile): Add AI summary field to mobile bookmark info ([#&#8203;2157](karakeep-app/karakeep#2157)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`45081dc`](karakeep-app/karakeep@45081dcb)
- feat(mobile): Add tags screen to mobile app ([#&#8203;2163](karakeep-app/karakeep#2163)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ad66f78`](karakeep-app/karakeep@ad66f78d)
- feat: Add notes feature to highlights ([#&#8203;2154](karakeep-app/karakeep#2154)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`de5ebbc`](karakeep-app/karakeep@de5ebbc4)
- feat(mobile): Add smart list creation in mobile app ([#&#8203;2153](karakeep-app/karakeep#2153)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`48ab8a1`](karakeep-app/karakeep@48ab8a19)
- feat: Add search bar to highlights page ([#&#8203;2155](karakeep-app/karakeep#2155)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ed6a3bf`](karakeep-app/karakeep@ed6a3bfa)
- fix: hide collaborator emails from non-owners ([#&#8203;2160](karakeep-app/karakeep#2160)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8ab5df6`](karakeep-app/karakeep@8ab5df67)
- feat: Add invitation approval for shared lists ([#&#8203;2152](karakeep-app/karakeep#2152)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5f0934a`](karakeep-app/karakeep@5f0934ac)
- deps: upgrade oxlint - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`daee8e7`](karakeep-app/karakeep@daee8e7a)
- fix: add a way to allowlist all domains from ip validation - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`67b8a3c`](karakeep-app/karakeep@67b8a3c1)
- fix: use kbd for editor card - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3345377`](karakeep-app/karakeep@3345377d)
- fix: drop journal retention for sempahore and id providers - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1b44eaf`](karakeep-app/karakeep@1b44eafe)
- refactor: remove the PrivacyAware interface - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`815e196`](karakeep-app/karakeep@815e1961)
- feat: Add collaborative lists ([#&#8203;2146](karakeep-app/karakeep#2146)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`88c73e2`](karakeep-app/karakeep@88c73e21)
- deps: upgrade hono and playwright - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`cc8fee0`](karakeep-app/karakeep@cc8fee0d)
- deps: Upgrade typescript to 5.9 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`391af8a`](karakeep-app/karakeep@391af8a5)
- build: Improve docker caching ([#&#8203;2140](karakeep-app/karakeep#2140)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6cccb9f`](karakeep-app/karakeep@6cccb9f1)
- fix: fix hydration error in admin user list - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`12d09a7`](karakeep-app/karakeep@12d09a74)
- feat: import from mymind ([#&#8203;2138](karakeep-app/karakeep#2138)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0c80f51`](karakeep-app/karakeep@0c80f515)
- feat: add Prometheus counter for HTTP status codes ([#&#8203;2117](karakeep-app/karakeep#2117)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4350666`](karakeep-app/karakeep@43506669)
- fix(mobile): upgrade react-native-pdf to v7 to fix page alignment - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4c6ef25`](karakeep-app/karakeep@4c6ef25d)
- fix(mobile): fix app memory page size compatibility ([#&#8203;2135](karakeep-app/karakeep#2135)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`fbd12ea`](karakeep-app/karakeep@fbd12ea3)
- release(mobile): Bump mobile version to 1.8.2 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`76c291a`](karakeep-app/karakeep@76c291a6)
- fix: remove incorrect array destructuring in mobile search ([#&#8203;2124](karakeep-app/karakeep#2124)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`07390ae`](karakeep-app/karakeep@07390aef)
- feat: correct default prom metrics from web and worker containers - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c34f70d`](karakeep-app/karakeep@c34f70da)
- fix: stop retrying indefinitely in restate queues - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d4b7b89`](karakeep-app/karakeep@d4b7b89a)
- fix: fix crash in crawler on invalid URL in matchesNoProxy - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d0f71a4`](karakeep-app/karakeep@d0f71a4c)
- feat: add crawler domain rate limiting ([#&#8203;2115](karakeep-app/karakeep#2115)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4cf0856`](karakeep-app/karakeep@4cf0856e)
- refactor: Allow runner functions to return results to onComplete - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b28cd03`](karakeep-app/karakeep@b28cd03a)
- refactor: Extract ratelimiter into separate plugin ([#&#8203;2112](karakeep-app/karakeep#2112)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0316148`](karakeep-app/karakeep@03161482)
- feat(extension): Add custom header support for extension ([#&#8203;2111](karakeep-app/karakeep#2111)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ec87813`](karakeep-app/karakeep@ec87813a)
- feat: Add bookmark sources statistics section ([#&#8203;2110](karakeep-app/karakeep#2110)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`725b521`](karakeep-app/karakeep@725b5218)
- feat: Add page titles ([#&#8203;2109](karakeep-app/karakeep#2109)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3083be0`](karakeep-app/karakeep@3083be0c)
- feat: add failed\_permanent metric for worker monitoring ([#&#8203;2107](karakeep-app/karakeep#2107)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1b8129a`](karakeep-app/karakeep@1b8129a2)
- release(docs): release the 0.28 docs - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d9ef832`](karakeep-app/karakeep@d9ef832e)
- release(extension): Release version 1.7.1 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7339d1d`](karakeep-app/karakeep@7339d1df)
- release(mobile): Bump mobile version to 1.8.1 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f06b8ea`](karakeep-app/karakeep@f06b8eab)

</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 this update 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:eyJjcmVhdGVkSW5WZXIiOiI0Mi41LjAiLCJ1cGRhdGVkSW5WZXIiOiI0Mi41LjAiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImltYWdlIl19-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/2214
Co-authored-by: Renovate Bot <[email protected]>
Co-committed-by: Renovate Bot <[email protected]>
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.

FR: searching for a highlight

3 participants