Skip to content

deps: upgrade nextjs to 16 - #2827

Merged
MohamedBassem merged 6 commits into
karakeep-app:mainfrom
MohamedBassem:chore/upgrade-next-16
May 20, 2026
Merged

MohamedBassem merged 6 commits into
karakeep-app:mainfrom
MohamedBassem:chore/upgrade-next-16

Conversation

@MohamedBassem

Copy link
Copy Markdown
Member

No description provided.

@coderabbitai

coderabbitai Bot commented May 20, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b77f9f5f-bef1-4e5f-9f62-3bf94c5cd602

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

React runtime and type dependencies are upgraded from 19.2.1 to 19.2.6 across all workspace apps (browser-extension, landing, mobile, web, docs). Next.js in the web app is upgraded from 15.5.18 to 16.2.6. Build configuration is updated to add Turbopack SVG handling, adjust TypeScript and ESLint settings, and configure allowed development origins. Generated next-env.d.ts is cleared and ignored.

Changes

React and Next.js Dependency Upgrades

Layer / File(s) Summary
React and type dependency upgrades
apps/browser-extension/package.json, apps/landing/package.json, apps/mobile/package.json, apps/web/package.json, docs/package.json
React and react-dom are bumped to 19.2.6 across all apps. React type definitions (@types/react, @types/react-dom) are updated to 19.2.15 and 19.2.3 respectively.
Next.js 16 configuration and build settings
apps/web/next.config.mjs, .gitignore
Next.js is upgraded to 16.2.6 in apps/web package.json. Turbopack SVG rule is added for @svgr/webpack bundling. TypeScript build errors remain ignored; ESLint build errors ignore is removed. allowedDevOrigins is set to ["10.0.10.13"]. The auto-generated next-env.d.ts is cleared from tracking and added to .gitignore via **/next-env.d.ts.

🎯 2 (Simple) | ⏱️ ~12 minutes


Possibly related PRs

  • karakeep-app/karakeep#2740: Adds oxlint/oxfmt configuration that depends on the .gitignore updates in this PR to control which files are processed by formatting and linting tools.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning No pull request description was provided by the author. The required template sections including Description, How Has This Been Tested, and Checklist are completely missing. Add a comprehensive PR description following the template, including: rationale for the upgrade, testing performed (especially for Next.js 16 compatibility), and completion of the required checklist items.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'deps: upgrade nextjs to 16' accurately describes the main change in the changeset, which involves upgrading Next.js from version 15 to 16 along with related dependency updates.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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


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.

@greptile-apps

greptile-apps Bot commented May 20, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR upgrades Next.js from 15.5.18 to 16.2.6 across the monorepo, pins React and @types/* packages to exact versions (19.2.6 / 19.2.15 / 19.2.3), and migrates PWA manifest handling from the next-pwa plugin to Next.js's native app/manifest.ts route.

  • Next.js upgrade: next and @next/bundle-analyzer moved to 16.2.6; next-pwa removed; Turbopack SVG rule added alongside the existing webpack rule; next typegen prepended to the typecheck script so route types are regenerated before tsc.
  • Manifest migration: public/manifest.json deleted and replaced with app/manifest.ts; the static manifest: "/manifest.json" metadata field removed from layout.tsx since Next.js now auto-injects the manifest link tag.
  • allowedDevOrigins: the previously hardcoded private IP is replaced by a comma-separated env variable ALLOWED_DEV_ORIGINS, and next-env.d.ts is removed from version control and added to .gitignore.

Confidence Score: 5/5

Straightforward dependency upgrade with no logic changes; the manifest migration is mechanically equivalent to the deleted static file.

All changes are package version bumps and a well-scoped migration of PWA manifest handling to the Next.js native API. No application logic was modified, and the manifest content matches the deleted static file. The two concerns from prior review threads (ESLint build suppression and the allowedDevOrigins filter) were already flagged and are known to the author.

No files require special attention.

Important Files Changed

Filename Overview
apps/web/package.json Next.js upgraded from 15.5.18 to 16.2.6; next-pwa removed; react/react-dom pinned to exact 19.2.6; @types/* pinned to exact versions
apps/web/next.config.mjs Removed next-pwa wrapper; added Turbopack SVG rule; ESLint ignoreDuringBuilds removed (already flagged in prior thread); allowedDevOrigins now reads from env var (prior thread concern addressed)
apps/web/app/manifest.ts New Next.js native manifest route replaces the static public/manifest.json; functionally equivalent with minor omission of the purpose field on the 16x16 icon
apps/web/app/layout.tsx Removed manifest metadata link; Next.js now auto-discovers app/manifest.ts and injects the link tag, so this removal is correct
.gitignore Added **/next-env.d.ts to gitignore; the existing apps/web/next-env.d.ts was deleted as it is now auto-generated by next typegen

Reviews (2): Last reviewed commit: "fix build" | Re-trigger Greptile

Comment thread apps/web/next.config.mjs Outdated
Comment thread apps/web/next.config.mjs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/next.config.mjs`:
- Line 67: Remove the unused dead configuration property allowedDevOrigins from
the Next.js config in next.config.mjs: locate the allowedDevOrigins:
["10.0.10.13"] entry (it isn’t referenced elsewhere) and delete that line so the
config no longer contains the unused setting; ensure no other code depends on
allowedDevOrigins after removal.

In `@apps/web/package.json`:
- Line 76: Update the app to be compatible with Next.js 16: audit all
server/route handlers and change uses of params and searchParams to await the
async values, and update any calls to cookies(), headers(), and draftMode() to
await their promises; replace legacy caching config with the new 'use cache'
directive and update revalidateTag(tag) calls to include the second arg (e.g.,
revalidateTag(tag, 'max')); migrate next/image config from images.domains to
images.remotePatterns and adjust handling of local images with query strings;
rename middleware.ts to proxy.ts and ensure Node.js >=20.9.0 and TypeScript
>=5.1.0 in project tooling; run the official Next.js upgrade codemod and
manually review data-fetching patterns for any additional breaking-change fixes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2b3ad58c-42b5-41be-a361-1318c766b304

📥 Commits

Reviewing files that changed from the base of the PR and between b45d41c and 49c2018.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (8)
  • .gitignore
  • apps/browser-extension/package.json
  • apps/landing/package.json
  • apps/mobile/package.json
  • apps/web/next-env.d.ts
  • apps/web/next.config.mjs
  • apps/web/package.json
  • docs/package.json
💤 Files with no reviewable changes (1)
  • apps/web/next-env.d.ts

Comment thread apps/web/next.config.mjs Outdated
eslint: { ignoreDuringBuilds: true },
typescript: { ignoreBuildErrors: true },

allowedDevOrigins: ["10.0.10.13"],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

# First, let's check if the file exists and read the relevant section
if [ -f "apps/web/next.config.mjs" ]; then
  echo "=== File exists, reading content around line 67 ==="
  sed -n '60,75p' apps/web/next.config.mjs
else
  echo "File not found, searching for next.config files"
  find . -name "next.config.*" -type f
fi

Repository: karakeep-app/karakeep

Length of output: 409


🏁 Script executed:

# Read the full next.config.mjs file to understand context
wc -l apps/web/next.config.mjs
echo "---"
cat -n apps/web/next.config.mjs

Repository: karakeep-app/karakeep

Length of output: 2332


🏁 Script executed:

# Search for allowedDevOrigins usage
rg "allowedDevOrigins" --type mjs --type js --type ts

Repository: karakeep-app/karakeep

Length of output: 93


🏁 Script executed:

# Search for allowedDevOrigins in all files
rg "allowedDevOrigins"

Repository: karakeep-app/karakeep

Length of output: 127


🏁 Script executed:

# Check for environment files and variables used
find . -name ".env*" -type f | head -20
echo "---"
# Search for origin validation or CORS logic
rg "origin" -i --type js --type ts | grep -i "allow\|cors\|valid" | head -20

Repository: karakeep-app/karakeep

Length of output: 305


🏁 Script executed:

# Check the main .env.sample
cat .env.sample
echo "---"
# Search for any middleware or validation of origins
rg "middleware\|CORS\|origin" --type ts --type js -i -l | head -10

Repository: karakeep-app/karakeep

Length of output: 176


🏁 Script executed:

# Search for middleware files in the web app
find apps/web -name "*middleware*" -type f
echo "---"
# Search for any validation of this property
rg "allowedDev\|ALLOWED_DEV"

Repository: karakeep-app/karakeep

Length of output: 69


🏁 Script executed:

# Check package.json to see what next-pwa version is used and search for comments about this config
cat apps/web/package.json | grep -A 5 -B 5 "next-pwa\|pwa" || echo "Not in web package.json, checking root"
echo "---"
cat package.json | grep "next-pwa" || echo "Not found in root package.json"
echo "---"
# Check git history of this file
git log --oneline apps/web/next.config.mjs | head -5

Repository: karakeep-app/karakeep

Length of output: 450


🏁 Script executed:

# Let's check the next-pwa plugin documentation or source to see if allowedDevOrigins is a valid property
# First check if there's any node_modules reference or documentation
rg "allowedDevOrigins" -r . --max-depth 5 node_modules/next-pwa 2>/dev/null | head -5 || echo "Not in node_modules (expected)"
echo "---"
# Check git history more thoroughly - when was this added?
git log -p apps/web/next.config.mjs | grep -A 3 -B 3 "allowedDevOrigins" | head -20

Repository: karakeep-app/karakeep

Length of output: 69


🏁 Script executed:

# Let's check the git log differently
git log --follow -p apps/web/next.config.mjs 2>/dev/null | head -100

Repository: karakeep-app/karakeep

Length of output: 2213


Remove unused allowedDevOrigins configuration.

The allowedDevOrigins property is hardcoded but not referenced or consumed anywhere in the codebase. It appears to be dead code that was added but never wired up. Since it has no functional effect and the CORS headers already allow all origins ("Access-Control-Allow-Origin": "*"), simply remove this line:

Suggested fix
-  allowedDevOrigins: ["10.0.10.13"],
});
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
allowedDevOrigins: ["10.0.10.13"],
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/next.config.mjs` at line 67, Remove the unused dead configuration
property allowedDevOrigins from the Next.js config in next.config.mjs: locate
the allowedDevOrigins: ["10.0.10.13"] entry (it isn’t referenced elsewhere) and
delete that line so the config no longer contains the unused setting; ensure no
other code depends on allowedDevOrigins after removal.

Comment thread apps/web/package.json
"lucide-react": "^0.501.0",
"modern-screenshot": "^4.6.7",
"next": "15.5.18",
"next": "16.2.6",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🌐 Web query:

What are the breaking changes and migration requirements for Next.js 16?

💡 Result:

Next.js 16, which reached stable release in late 2025 and is currently supported (latest version 16.2.6 as of May 2026), introduces significant architectural changes that require careful migration [1][2][3][4]. Breaking Changes and Migration Requirements Async Request APIs Synchronous access to request APIs is fully removed [5]. You must update your code to use asynchronous access: - Props such as params and searchParams must be awaited (e.g., await params) [5][2]. - Core request helpers including cookies, headers, and draftMode are now strictly asynchronous and must be awaited [5][2]. - Metadata image generation functions now receive params and id as promises [5][2]. Caching and Data Fetching Next.js 16 introduces "Cache Components" as a new directive-based caching model, replacing older route-segment configurations [6][7]. - The 'use cache' directive is now the primary way to manage component and function caching [7]. - Legacy flags like experimental_ppr and force-static / force-dynamic are deprecated or removed in favor of this new model [2][6]. - The revalidateTag function now requires a second argument (a profile, e.g., revalidateTag(tag, 'max')) [2][8]. Omitting the second argument will result in a TypeScript error [8]. Next/Image Updates - Local images used with query strings now require updated images.localPatterns configuration to prevent security vulnerabilities [2]. - Default values for images.maximumRedirects (now capped at 3), imageSizes, and qualities have been adjusted [5][2]. - The images.domains configuration is deprecated in favor of the more secure images.remotePatterns [2]. Infrastructure and Deprecations - Middleware: The middleware.ts filename is deprecated and should be renamed to proxy.ts to clarify its role in the network boundary [5][2][7]. - Node.js: The minimum required Node.js version has been increased (typically 20.9.0+) [5]. - TypeScript: The minimum supported TypeScript version is now 5.1.0 [5]. Upgrade Path To migrate to Next.js 16, you can use the official upgrade codemod provided by the framework [5]. Due to the architectural shift in caching and async APIs, manual review of data-fetching patterns is strongly recommended [2][8]. Additionally, all users on versions 16.2.5 or older are advised to update immediately to 16.2.6 to patch critical security vulnerabilities [4][9].

Citations:


Review and update code for Next.js 16 breaking changes.

Next.js 16.2.6 introduces several breaking changes requiring code updates:

  • Async Request APIs: params and searchParams must be awaited; cookies(), headers(), and draftMode() are now strictly asynchronous
  • Caching: The new 'use cache' directive replaces legacy route-segment configurations; revalidateTag() now requires a second argument (e.g., revalidateTag(tag, 'max'))
  • Next/Image: images.domains is deprecated in favor of images.remotePatterns; local images with query strings need updated configuration
  • Infrastructure: Rename middleware.ts to proxy.ts; minimum Node.js is 20.9.0+; minimum TypeScript is 5.1.0+

Additionally, versions 16.2.5 and older contain critical security vulnerabilities. Use the official Next.js upgrade codemod to assist with migration, and review data-fetching patterns for manual updates.

Also applies to: 110-110

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/package.json` at line 76, Update the app to be compatible with
Next.js 16: audit all server/route handlers and change uses of params and
searchParams to await the async values, and update any calls to cookies(),
headers(), and draftMode() to await their promises; replace legacy caching
config with the new 'use cache' directive and update revalidateTag(tag) calls to
include the second arg (e.g., revalidateTag(tag, 'max')); migrate next/image
config from images.domains to images.remotePatterns and adjust handling of local
images with query strings; rename middleware.ts to proxy.ts and ensure Node.js
>=20.9.0 and TypeScript >=5.1.0 in project tooling; run the official Next.js
upgrade codemod and manually review data-fetching patterns for any additional
breaking-change fixes.

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

Copy link
Copy Markdown

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: 49c20188fe

ℹ️ 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 thread apps/web/package.json
"lucide-react": "^0.501.0",
"modern-screenshot": "^4.6.7",
"next": "15.5.18",
"next": "16.2.6",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Force webpack builds while next-pwa remains configured

Upgrading next to 16.2.6 makes Turbopack the default for next build, but this app still relies on next-pwa, which integrates via webpack plugins/hooks. Because Turbopack does not apply webpack plugin pipelines, production builds can silently stop generating the PWA service worker/offline assets after this version bump unless you explicitly use next build --webpack (or migrate away from webpack-dependent PWA tooling).

Useful? React with 👍 / 👎.

Comment thread .gitignore

# next.js
.next/
**/next-env.d.ts

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 Run Next type generation before ignoring next-env.d.ts

This change ignores/removes next-env.d.ts, but the web typecheck flow still uses plain tsc --noEmit without a preceding next typegen. On a clean checkout (where neither next dev nor next build has run yet), Next-generated declarations may be missing, which can break CI/local typechecks or drop framework-specific type coverage.

Useful? React with 👍 / 👎.

@MohamedBassem

Copy link
Copy Markdown
Member Author

@codex review
@greptile review

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

Copy link
Copy Markdown

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: 1766d7eb65

ℹ️ 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 thread apps/web/next.config.mjs Outdated
typescript: { ignoreBuildErrors: true },
});

allowedDevOrigins: (process.env.ALLOWED_DEV_ORIGINS ?? "").split(","),

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 Leave allowedDevOrigins undefined when env var is unset

This line always produces an array (at minimum ['']), so allowedDevOrigins is never undefined. In Next.js 16, undefined has different behavior from a defined array: it keeps cross-origin dev checks in warn mode, while a defined value switches to blocking mode. With ALLOWED_DEV_ORIGINS unset, this can unexpectedly block proxied/cross-origin dev requests that previously only warned. Gate this assignment so the field is omitted/undefined when no env value is provided.

Useful? React with 👍 / 👎.

@MohamedBassem
MohamedBassem merged commit ff57d9c into karakeep-app:main May 20, 2026
6 checks passed
ajgon pushed a commit to deedee-ops/home-ops that referenced this pull request Aug 1, 2026
… 0.33.1) (#498)

This PR contains the following updates:

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

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/7) for more information.

---

### Release Notes

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

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

[Compare Source](karakeep-app/karakeep@v0.32.0...v0.33.1)

##### 0.33.1

Welcome to the `0.33` release of Karakeep! The headline of this release is **semantic search**. Karakeep can now generate embeddings for your bookmarks, letting you search by meaning instead of exact keywords (and making auto-tagging noticeably more consistent along the way). The mobile app gets **offline reading**, so you can save articles to your device and read them on a plane, along with new layouts, sorting, and one-tap clipboard saving. **Cookie and GDPR consents** should be something of the past with this release (finally). Plus a big batch of crawler, security and performance fixes.

Thanks to everyone who contributed to this release: [@&#8203;esimkowitz](https://github.com/esimkowitz), [@&#8203;joestump](https://github.com/joestump), [@&#8203;zerone0x](https://github.com/zerone0x), [@&#8203;ElectricTea](https://github.com/ElectricTea), [@&#8203;optix2000](https://github.com/optix2000), [@&#8203;thiswillbeyourgithub](https://github.com/thiswillbeyourgithub), [@&#8203;jcgoodwin86](https://github.com/jcgoodwin86), [@&#8203;InventorB](https://github.com/InventorB), [@&#8203;VrtxOmega](https://github.com/VrtxOmega), [@&#8203;pike00](https://github.com/pike00), [@&#8203;KayMi](https://github.com/KayMi), [@&#8203;TanishValesha](https://github.com/TanishValesha), [@&#8203;mahirhir](https://github.com/mahirhir), [@&#8203;moduvoice](https://github.com/moduvoice), [@&#8203;eviaaaaa](https://github.com/eviaaaaa), [@&#8203;archit-goyal](https://github.com/archit-goyal), [@&#8203;CertStone](https://github.com/CertStone), and everyone who shipped code, triaged bugs, or shared feedback.

*Note: the changes mentioned here for the extension and mobile releases will need to go through the different store (apple, google, mozilla) reviews. So it might take a couple of days until all of them are released.*

> If you enjoy using Karakeep, consider supporting the project [here ☕️](https://buymeacoffee.com/mbassem) or via GitHub [here](https://github.com/sponsors/MohamedBassem). Also share Karakeep's managed offering (☁️ [link](https://cloud.karakeep.app)) with your friends who're not into selfhosting.

<a href="https://www.buymeacoffee.com/mbassem" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" width="auto" height="50" ></a>

##### New Features 🚀

- **Semantic Search** ([#&#8203;2959](karakeep-app/karakeep#2959), [#&#8203;2960](karakeep-app/karakeep#2960)) - Search is no longer limited to exact keyword matching. There are now three search modes, switchable from a dropdown in the search bar:
  - `Full text` - the existing keyword search (still the default).
  - `Semantic` \[Experimental] - pure meaning-based search powered by embeddings. Searching for "how to make coffee" will find your espresso bookmarks even if they never use those words.
  - `Hybrid` \[Experimental] - fuses the results of both.
  - The new mode is also available in the API, MCP and CLI which is going to be the most useful with agents.
  - Semantic search is still new and experimental, so results might not be super accurate yet, but it's a start.
  - ⚠️ Semantic search requires embeddings to be enabled, read the upgrade notes for details about how to enable them.
- **Smarter auto-tagging using embeddings** ([#&#8203;2858](karakeep-app/karakeep#2858)) - When tagging a new bookmark, Karakeep now looks up semantically similar bookmarks and feeds their existing tags into the LLM prompt as suggestions. The result is a lot less tag sprawl (no more `k8s`, `kubernetes` and `Kubernetes` all coexisting). This also requires embeddings to be enabled, read the upgrade notes for details about how them.
- **Cleaner saved pages** ([#&#8203;2973](karakeep-app/karakeep#2973)): the crawler now detects common consent dialogs (cookies and GDPR) and automatically opts out before capturing the article, screenshot and PDF.
- **Offline reading on mobile** ([#&#8203;2957](karakeep-app/karakeep#2957)) - The mobile app can now work without a connection:
  - **Save articles for offline**: from a bookmark's "…" menu, pick *Make available offline*. The full article is downloaded and kept on device until you remove it.
  - **Recent cache**: everything you browse (bookmark lists, tags, lists, highlights) is now persisted for 7 days, so recently visited screens still open when you're offline.
- **Mobile app improvements**:
  - **New layouts** ([#&#8203;2837](karakeep-app/karakeep#2837)): switch between the existing card layout and a new compact list layout. *Note: the default is now the list layout.*
  - **Sorting** ([#&#8203;2777](karakeep-app/karakeep#2777)): sort your bookmarks newest-first or oldest-first (overdue, sorry!).
  - **Save from clipboard** ([#&#8203;2868](karakeep-app/karakeep#2868)): a new *Clipboard* entry in the "+" menu saves whatever is in your clipboard in one tap. Thanks [@&#8203;InventorB](https://github.com/InventorB)!
  - The manage bookmark sheet now has favourite, archive, share and highlights actions instead of just delete.
- **Karakeep for agentic usage** - continuing where 0.32 left off:
  - **MCP server went from 8 to 29 tools**. Newly added: full list CRUD, full tag CRUD, highlights, `delete-bookmark`, and `get-asset`. Big thanks to [@&#8203;joestump](https://github.com/joestump) for the list/tag CRUD work ([#&#8203;2917](karakeep-app/karakeep#2917))!
  - **New readable content API** ([#&#8203;2660](karakeep-app/karakeep#2660)): `GET /api/v1/bookmarks/{bookmarkId}/content` returns a bookmark's article content as markdown or plain text, cursor-paginated in LLM-friendly chunks that snap to paragraph boundaries.
- **Much faster bookmark metadata** ([#&#8203;2932](karakeep-app/karakeep#2932)): Karakeep's pre-flight http request to the website can now contribute to its metadata extraction. This results into some metadata (e.g. title) appearing much faster. A new `CRAWLER_PREFLIGHT_USER_AGENT` option lets you set a user agent for that probe request, and let's just say that a good user agent makes a huge difference.
- The default OpenAI model has changed from `gpt-4.1-mini` to `gpt-5.6-luna` which is half as cheap, though a bit slower given that it's a reasoning model.

##### UX Improvements ✨

- **Re-saving an existing bookmark now actually does something** ([#&#8203;2962](karakeep-app/karakeep#2962)) - Saving a link you've saved before used to just tell you "Bookmark already exists" and do nothing. Now it re-saves it: the bookmark is un-archived and bumped back to the top of your list.
- **Smarter bookmark previews** ([#&#8203;2975](karakeep-app/karakeep#2975)) - Newly crawled pages are now assessed for how well they work in Reader View. Articles continue to open in the clean reader, while homepages, search results, product pages and other non-article content default to a screenshot or a new page-overview panel instead of showing a poor text extraction. You can still switch among the overview, Reader View, screenshot, PDF and archived page from the preview selector.
- **Bulk edit is now one hover away**: instead of first switching bulk edit on from the toolbar, a selection circle appears directly on a bookmark card when you hover it. Selecting one card puts you into bulk edit mode for the rest.
- The sidebar is now wider on large screens, and its scrollbar only appears when you hover it instead of sitting there permanently.
- Mobile polish: a proper loading state while an article is still being crawled, better reader contrast in dark mode, a rebuilt login screen with much clearer connection errors, faster Manage Tags page on large libraries (server-side search instead of loading every tag), iPad/tablet reader toolbar and FAB fixes by [@&#8203;esimkowitz](https://github.com/esimkowitz) ([#&#8203;2788](karakeep-app/karakeep#2788), [#&#8203;2793](karakeep-app/karakeep#2793), [#&#8203;2794](karakeep-app/karakeep#2794)), and a bunch of redundant success toasts removed.
- Karakeep is now installable as a PWA in Chrome again, allowing you to use karakeep on your desktop as if it's one of the apps.
- New **Instagram renderer** ([#&#8203;2836](karakeep-app/karakeep#2836)): Instagram posts and reels now render as the actual embedded post in the bookmark preview, joining the existing YouTube, X, TikTok and Amazon renderers.

##### Fixes 🐛

- **Security fixes**:
  - Fixed a DNS rebinding / TOCTOU hole in the crawler's SSRF protection ([#&#8203;2945](karakeep-app/karakeep#2945)). Reported by [@&#8203;celinke97](https://github.com/celinke97) (GHSA-vc53-r298-c6h6).
  - API key and signed asset token verification now use timing-safe comparisons, reported by [@&#8203;xancyber](https://github.com/xancyber) (GHSA-hjm9-gc55-5hgv).
  - Bookmark URLs are now restricted to `http`/`https` on create and update. Reported by [@&#8203;therawdev](https://github.com/therawdev) and [@&#8203;shukla304](https://github.com/shukla304) (GHSA-6mfw-xrw2-h5x3).
  - Legacy bookmarks with unsafe schemes are filtered out of RSS feeds and Netscape HTML exports, and the exported URLs are HTML-escaped. Reported by [@&#8203;karen93shieh](https://github.com/karen93shieh) and [@&#8203;MuxiLyuLucy](https://github.com/MuxiLyuLucy) (GHSA-4vx2-9j8p-jg8v).
  - Tag names are now HTML-escaped in Netscape bookmark exports, preventing a crafted or AI-generated tag from breaking out of the `TAGS` attribute when the export is opened in a browser.
  - User-supplied names (user names, list names, inviter names) are HTML-escaped in outgoing emails, fixing HTML injection in the list invitation email. Reported by [@&#8203;therawdev](https://github.com/therawdev) and [@&#8203;shukla304](https://github.com/shukla304) (GHSA-pvj2-rgwm-r7f8).
  - Password logins are now rate limited (10 attempts per 15 minutes per IP + email). Note that this requires `RATE_LIMITING_ENABLED=true`.
  - Closed account-enumeration side channels in login and password reset.
- Much faster bookmark deletion ([#&#8203;2669](karakeep-app/karakeep#2669)): added the missing indexes that should make deletions less IO intensive for large libraries.
- Old completed import sessions are now archived after 30 days: their summary counts are kept, but the per-bookmark staging rows are deleted, which keeps the DB from growing unboundedly after big imports.
- YouTube/video downloads work again - yt-dlp now uses the bundled node as its JS runtime, by [@&#8203;pike00](https://github.com/pike00) ([#&#8203;2805](karakeep-app/karakeep#2805)).
- Fixed `BROWSER_WEB_URL` failing to resolve on IPv6-only Docker networks by [@&#8203;VrtxOmega](https://github.com/VrtxOmega) ([#&#8203;2863](karakeep-app/karakeep#2863)).
- Fixed the X/Twitter renderer, which broke after the API changed its response shape.
- Inline images in SingleFile archives are no longer clobbered by the lazy-load normalization, by [@&#8203;zerone0x](https://github.com/zerone0x) ([#&#8203;2928](karakeep-app/karakeep#2928)).
- Banner/preview image extraction now works for SingleFile and precrawled archives that inline the image as a data URI.
- Fixed summarization producing garbled output for users running with `INFERENCE_OUTPUT_SCHEMA=json`, by [@&#8203;eviaaaaa](https://github.com/eviaaaaa) ([#&#8203;2926](karakeep-app/karakeep#2926)).
- New `OPENAI_TIMEOUT_SEC` option to control the per-request inference timeout, useful for slow self-hosted providers, by [@&#8203;optix2000](https://github.com/optix2000) ([#&#8203;2876](karakeep-app/karakeep#2876)).
- Hardened the tagging prompt: tags are now capped to 1–3 words, and Karakeep explicitly returns no tags for error pages, Cloudflare/CAPTCHA interstitials, cookie banners and login walls - so no more `just a moment` or `cloudflare` tags on failed crawls.
- Fixed the MCP `get-bookmark-content` tool crashing on bookmarks that haven't been crawled yet, by [@&#8203;joestump](https://github.com/joestump) ([#&#8203;2915](karakeep-app/karakeep#2915)).
- Fixed scrolling in the bookmark preview's screenshot view by [@&#8203;VrtxOmega](https://github.com/VrtxOmega) ([#&#8203;2864](karakeep-app/karakeep#2864)).
- The browser extension now requests host permissions at runtime for client-side crawling ([#&#8203;2784](karakeep-app/karakeep#2784)), instead of asking for them up front.
- Added missing Japanese translations by [@&#8203;mahirhir](https://github.com/mahirhir) ([#&#8203;2903](karakeep-app/karakeep#2903)) and filled in the missing Korean translation keys by [@&#8203;moduvoice](https://github.com/moduvoice) ([#&#8203;2938](karakeep-app/karakeep#2938)).
- PDF previews now render via `<embed>` so they display in Safari, by [@&#8203;KayMi](https://github.com/KayMi) ([#&#8203;2806](karakeep-app/karakeep#2806)).
- Import progress is now tracked per import job ([#&#8203;2950](karakeep-app/karakeep#2950)), so running two imports at once no longer makes their progress bars fight each other. Thanks [@&#8203;jcgoodwin86](https://github.com/jcgoodwin86)!

##### For Developers 🛠️

- Docker healthchecks now respect a custom `PORT` by [@&#8203;zerone0x](https://github.com/zerone0x) ([#&#8203;2948](karakeep-app/karakeep#2948)).
- OAuth providers can now use a configurable ID token signing algorithm via `OAUTH_ID_TOKEN_SIGNED_RESPONSE_ALG`, by [@&#8203;CertStone](https://github.com/CertStone) ([#&#8203;2850](karakeep-app/karakeep#2850)).

##### Community Projects 💡

*Checkout our community projects page [here](https://docs.karakeep.app/community-projects).*

- [wdoc](https://github.com/thiswillbeyourgithub/wdoc): A RAG-powered document/knowledge querying tool with Karakeep support, by [@&#8203;thiswillbeyourgithub](https://github.com/thiswillbeyourgithub) ([#&#8203;2904](karakeep-app/karakeep#2904))

##### Screenshots 📸

##### Offline Reading

<img width="603" height="1311" alt="Screenshot 2026-08-01 at 7 41 17 PM" src="https://github.com/user-attachments/assets/15eca558-2fa9-44d2-9c75-c7e6042b44c1" />

##### New Mobile List Layouts

*Please don't judge my saved content*

<img width="603" height="1258" alt="Screenshot 2026-08-01 at 7 38 55 PM" src="https://github.com/user-attachments/assets/bf5aa418-b80f-4d75-968a-2b99914df803" />

##### Upgrading 📦

To upgrade:

- If you're using `KARAKEEP_VERSION=release`, run `docker compose pull && docker compose up -d`.
- If you're pinning it to a specific version, upgrade the version and then run `docker compose pull && docker compose up -d`.

##### Enabling Embeddings

1. Karakeep's embedding uses your existing meilisearch installation as the default vector store. If you're an OG, and running an old meilisearch version, you'll need to ensure you're on meilisearch version (1.13 or higher). Check [this guide](https://www.meilisearch.com/docs/resources/migration/updating#updating-a-self-hosted-meilisearch-instance) for info on how to update.
2. If you're using the default OpenAI based configuration, auto embeddings of new bookmarks will be enabled automatically and will use the `text-embedding-3-small` model.
3. If you're using a custom provider, you'll need to pass in the `EMBEDDING_TEXT_MODEL=<your_mode>`, the size of the dimension of the model via `EMBEDDING_DIMENSIONS` and then pass `EMBEDDING_ENABLE_AUTO_INDEXING=true` to enable embeddings. Check out [our docs](https://docs.karakeep.app/configuration/different-ai-providers) for example models and configurations.

Once you've enabled embeddings, you'll need to regenerate embeddings for all existing bookmarks. Head to the admin panel's Background Jobs page (new "Embeddings" card) and regenerate embeddings for all/pending bookmarks. This might take a while depending on how many bookmarks you have, and will cost you money (though embeddings are usually pretty cheap).

NOTE: Changing the model or its dimension after embedding even a single bookmark will require you to regenerate embeddings for *all* bookmarks.

##### All Commits

- fix(tagging): loosen the captcha rejection in the prompt a bit - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8550eb0`](karakeep-app/karakeep@8550eb09)
- fix(workers): wait for autoconsent in parallel with page load - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`98c52b8`](karakeep-app/karakeep@98c52b85)
- fix(tests): fix failing test after changing default model - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f249307`](karakeep-app/karakeep@f249307b)
- feat: change default inference model to gpt-5.6-luna - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1bc351a`](karakeep-app/karakeep@1bc351a7)
- fix: enable auto embedding by default for default inference configuration ([#&#8203;2976](karakeep-app/karakeep#2976)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`bcbb577`](karakeep-app/karakeep@bcbb5776)
- fix: enable auto embedding by default for default inference configurations - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7722c6a`](karakeep-app/karakeep@7722c6ae)
- deps: upgrade docusaurus - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ccddfcf`](karakeep-app/karakeep@ccddfcf3)
- feat: Add support for configurable ID token signing algorithm in OAuth ([#&#8203;2850](karakeep-app/karakeep#2850)) - [@&#8203;CertStone](https://github.com/CertStone) in [`b2b2579`](karakeep-app/karakeep@b2b2579b)
- feat(landing): 28k starts - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`385ec1d`](karakeep-app/karakeep@385ec1df)
- feat: add new article quality assessment ([#&#8203;2975](karakeep-app/karakeep#2975)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`76b477c`](karakeep-app/karakeep@76b477c4)
- fix: make queue registration idempotent - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6f12013`](karakeep-app/karakeep@6f120133)
- i18n: some translation fixes - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3b7982c`](karakeep-app/karakeep@3b7982c1)
- i18n: Sync weblate translations - Hosted Weblate in [`590c670`](karakeep-app/karakeep@590c6700)
- feat(web): some UX improvements in signin and password forms - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b4b9474`](karakeep-app/karakeep@b4b94740)
- feat(workers): auto-dismiss consent dialogs with autoconsent ([#&#8203;2973](karakeep-app/karakeep#2973)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c333f24`](karakeep-app/karakeep@c333f240)
- deps: upgrade nextjs to 16.2.12 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1148889`](karakeep-app/karakeep@11488896)
- fix(workers): fix workers in dev mode - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3a0421d`](karakeep-app/karakeep@3a0421d0)
- deps: bump a bunch of deps - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`a90034d`](karakeep-app/karakeep@a90034d1)
- i18n: Sync weblate translations - Hosted Weblate in [`8b4b917`](karakeep-app/karakeep@8b4b9170)
- docs: hide the chat flags for now - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`36c36e3`](karakeep-app/karakeep@36c36e3e)
- fix(auth): close account enumeration oracles in login and password reset - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`036da4c`](karakeep-app/karakeep@036da4c0)
- fix(mobile): don't silently swallow mutations fired while offline - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`9188958`](karakeep-app/karakeep@9188958c)
- fix(plugins): don't cache a rejected init promise in the meilisearch providers - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`64ec6cb`](karakeep-app/karakeep@64ec6cbc)
- fix(export): escape tag names in the netscape bookmark export - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f0381b4`](karakeep-app/karakeep@f0381b42)
- feat: add support for resaving already existing bookmarks ([#&#8203;2962](karakeep-app/karakeep#2962)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f2f6431`](karakeep-app/karakeep@f2f6431d)
- feat(web): move keyboard shortcuts inside the profile options menu - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`a698724`](karakeep-app/karakeep@a6987247)
- fix(web): fix preview screenshot scrolling ([#&#8203;2864](karakeep-app/karakeep#2864)) - [@&#8203;VrtxOmega](https://github.com/VrtxOmega) in [`595392a`](karakeep-app/karakeep@595392a9)
- feat(web): allow triggering bulk edit on hover - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`28a48ec`](karakeep-app/karakeep@28a48ec5)
- fix(workers): denoise the log messages coming from the feedWorker - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d155fa0`](karakeep-app/karakeep@d155fa0e)
- fix(ux): make the sidebar wider on larger screens - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f417b90`](karakeep-app/karakeep@f417b900)
- feat: make it possible to trigger admin jobs for a certain duration - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0a1821b`](karakeep-app/karakeep@0a1821ba)
- release(mobile): release mobile v1.10.0-1 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`369f5a6`](karakeep-app/karakeep@369f5a68)
- fix(mobile): improve reader contrast in dark mode - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c007bc7`](karakeep-app/karakeep@c007bc76)
- feat(mobile): add semantic search mode selector - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8175539`](karakeep-app/karakeep@8175539e)
- feat(mobile): show offline storage usage - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ec81015`](karakeep-app/karakeep@ec810158)
- release(mobile): release mobile v1.10.0 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3a6f282`](karakeep-app/karakeep@3a6f2822)
- feat(web): add semantic search to the UI ([#&#8203;2960](karakeep-app/karakeep#2960)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`2f740d0`](karakeep-app/karakeep@2f740d00)
- feat: add semantic search ([#&#8203;2959](karakeep-app/karakeep#2959)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`71ea4d9`](karakeep-app/karakeep@71ea4d9b)
- feat(mcp): more MCP tools - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8de38d4`](karakeep-app/karakeep@8de38d48)
- feat(cli): expose assets and readable conent in the CLI - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`a296871`](karakeep-app/karakeep@a2968718)
- feat(api): add an api for fetching readable content of a bookmark. [#&#8203;2660](karakeep-app/karakeep#2660) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f391113`](karakeep-app/karakeep@f3911139)
- feat(mcp): add ability to fetch assets via signed URLs - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`06d99bd`](karakeep-app/karakeep@06d99bd6)
- fix(mobile): better error message in the login page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e88a606`](karakeep-app/karakeep@e88a606c)
- fix(mobile): fix formsheet colors - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b8fe26a`](karakeep-app/karakeep@b8fe26ad)
- feat(mobile): offline reading ([#&#8203;2957](karakeep-app/karakeep#2957)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`2075c33`](karakeep-app/karakeep@2075c33a)
- feat(mobile): minor cleanups to the login page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`9b1b2b7`](karakeep-app/karakeep@9b1b2b73)
- fix(mobile): add a loading indicator to article content - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`198ea1e`](karakeep-app/karakeep@198ea1e5)
- readme: drop heavy dev notice now that it's stable enough - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`bc50630`](karakeep-app/karakeep@bc506307)
- ci: fix failing trpc test - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`bf2749e`](karakeep-app/karakeep@bf2749e8)
- fix: add timeSafe checks for signed tokens and api keys - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e8a138f`](karakeep-app/karakeep@e8a138f1)
- fix: drop redundant db indicies - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7ced044`](karakeep-app/karakeep@7ced044b)
- feat: archive old completed sessions - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1717af8`](karakeep-app/karakeep@1717af84)
- fix: upgrade some packages - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f0d254d`](karakeep-app/karakeep@f0d254d0)
- fix: respect PORT in Docker healthchecks ([#&#8203;2948](karakeep-app/karakeep#2948)) - [@&#8203;zerone0x](https://github.com/zerone0x) in [`7d703b8`](karakeep-app/karakeep@7d703b8b)
- fix: track import progress per-job ([#&#8203;2950](karakeep-app/karakeep#2950)) - [@&#8203;jcgoodwin86](https://github.com/jcgoodwin86) in [`4224da4`](karakeep-app/karakeep@4224da4f)
- feat: prep for sub tier overrides - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5e5692f`](karakeep-app/karakeep@5e5692f7)
- feat: add chat configuration and persistence schema - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`28cb149`](karakeep-app/karakeep@28cb149d)
- refactor(web): replace AI Elements message components with shadcn chat components - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4423da1`](karakeep-app/karakeep@4423da19)
- \[mobile] Upgrade mobile app to Expo SDK 56 ([#&#8203;2946](karakeep-app/karakeep#2946)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`08fd866`](karakeep-app/karakeep@08fd866b)
- fix: rename root package to [@&#8203;karakeep/root](https://github.com/karakeep/root). fixes [#&#8203;2939](karakeep-app/karakeep#2939) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`7ff5a46`](karakeep-app/karakeep@7ff5a46f)
- \[network] fix dns rebinding problems post internal hostname validation ([#&#8203;2945](karakeep-app/karakeep#2945)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`978544d`](karakeep-app/karakeep@978544df)
- fix: add missing indicies needed for bookmark deletion. [#&#8203;2669](karakeep-app/karakeep#2669) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`eb1f472`](karakeep-app/karakeep@eb1f4727)
- i18n: fill missing Korean (ko) translation keys ([#&#8203;2938](karakeep-app/karakeep#2938)) - [@&#8203;moduvoice](https://github.com/moduvoice) in [`7b19b0d`](karakeep-app/karakeep@7b19b0da)
- fix(mobile): propagate error message in sharing screen - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1b7b247`](karakeep-app/karakeep@1b7b2477)
- revert: remove --headless=new flag from default chrome docker compose ([#&#8203;2936](karakeep-app/karakeep#2936)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4af8bb2`](karakeep-app/karakeep@4af8bb2f)
- release(mcp): Bump mcp server to 0.32.1 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`aa78aa8`](karakeep-app/karakeep@aa78aa8f)
- feat(mcp): add list CRUD, tag CRUD, delete-bookmark ([#&#8203;2917](karakeep-app/karakeep#2917)) - [@&#8203;joestump](https://github.com/joestump) in [`831d6bf`](karakeep-app/karakeep@831d6bf5)
- refactor: split crawler file into separate modules ([#&#8203;2933](karakeep-app/karakeep#2933)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`b2c52c9`](karakeep-app/karakeep@b2c52c9c)
- feat: add extra metadata parse in the probe fetch ([#&#8203;2932](karakeep-app/karakeep#2932)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8439928`](karakeep-app/karakeep@84399288)
- fix(crawler): preserve inline GIF data images ([#&#8203;2928](karakeep-app/karakeep#2928)) - [@&#8203;zerone0x](https://github.com/zerone0x) in [`28d321c`](karakeep-app/karakeep@28d321ce)
- feat: add a script to adhocly test the crawler + improve chrome flags ([#&#8203;2929](karakeep-app/karakeep#2929)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5b0d7fe`](karakeep-app/karakeep@5b0d7fe6)
- fix(inference): only set JSON response\_format for schema requests ([#&#8203;2926](karakeep-app/karakeep#2926)) - [@&#8203;eviaaaaa](https://github.com/eviaaaaa) in [`545e6f8`](karakeep-app/karakeep@545e6f80)
- fix: fix banner extraction of singlefile archives - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ba6adfc`](karakeep-app/karakeep@ba6adfce)
- fix: ratelimit password login attempts - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f7d0429`](karakeep-app/karakeep@f7d04297)
- fix: sanitize input url and list names - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ffd1058`](karakeep-app/karakeep@ffd10589)
- feat: tagging prompt hardening - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`9ceb077`](karakeep-app/karakeep@9ceb077c)
- fix(mcp): coerce null htmlContent before turndown in get-bookmark-content ([#&#8203;2915](karakeep-app/karakeep#2915)) - [@&#8203;joestump](https://github.com/joestump) in [`1ebf5b0`](karakeep-app/karakeep@1ebf5b08)
- \[codex] Document browser extension dev port ([#&#8203;2918](karakeep-app/karakeep#2918)) - [@&#8203;archit-goyal](https://github.com/archit-goyal) in [`fc1c127`](karakeep-app/karakeep@fc1c127d)
- fix: forget password workflow - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c3d6028`](karakeep-app/karakeep@c3d60280)
- feat(stripe): add a trpc command for force syncing customer detail - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`a787ee4`](karakeep-app/karakeep@a787ee47)
- fix(billing): pick the latest active subscription when user has multiple subs - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`9bcac9c`](karakeep-app/karakeep@9bcac9cc)
- ci: disable plugin tests - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`43425e1`](karakeep-app/karakeep@43425e1d)
- chore: drop jemalloc support - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e862bf3`](karakeep-app/karakeep@e862bf3b)
- fix(restate): lower inactivity timeouts on dispatchers ([#&#8203;2911](karakeep-app/karakeep#2911)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ac51b35`](karakeep-app/karakeep@ac51b359)
- feat(i18n): add missing Japanese (ja) translations (keyboard shortcuts, admin embeddings) ([#&#8203;2903](karakeep-app/karakeep#2903)) - [@&#8203;mahirhir](https://github.com/mahirhir) in [`475483e`](karakeep-app/karakeep@475483e3)
- docs(community): add wdoc to community projects ([#&#8203;2904](karakeep-app/karakeep#2904)) - [@&#8203;thiswillbeyourgithub](https://github.com/thiswillbeyourgithub) in [`c93cbc2`](karakeep-app/karakeep@c93cbc2a)
- feat(landing): 26k stars. Take 2 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`9879eb5`](karakeep-app/karakeep@9879eb5d)
- docker: fix monolith build in docker - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`05c4e04`](karakeep-app/karakeep@05c4e04a)
- feat(landing): 26k stars - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3afe675`](karakeep-app/karakeep@3afe675a)
- fix(inference): add OpenAI request timeout config ([#&#8203;2876](karakeep-app/karakeep#2876)) - [@&#8203;optix2000](https://github.com/optix2000) in [`c0ac8a4`](karakeep-app/karakeep@c0ac8a47)
- feat(mobile): easy clipboard saving ([#&#8203;2868](karakeep-app/karakeep#2868)) - [@&#8203;InventorB](https://github.com/InventorB) in [`207016e`](karakeep-app/karakeep@207016e8)
- fix(workers): Fix BROWSER\_WEB\_URL IPv6 host resolution ([#&#8203;2863](karakeep-app/karakeep#2863)) - [@&#8203;VrtxOmega](https://github.com/VrtxOmega) in [`cf1964f`](karakeep-app/karakeep@cf1964ff)
- chore: AI assistant component prep ([#&#8203;2861](karakeep-app/karakeep#2861)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`76cbbf3`](karakeep-app/karakeep@76cbbf39)
- fix(api): make metrics registration idempotent - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4ae50c5`](karakeep-app/karakeep@4ae50c52)
- fix: fast track tagging after embedding generation ([#&#8203;2860](karakeep-app/karakeep#2860)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`6369416`](karakeep-app/karakeep@63694167)
- feat: add embeddings-based potentially relevant tags to LLM context d… ([#&#8203;2858](karakeep-app/karakeep#2858)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`2fbd77b`](karakeep-app/karakeep@2fbd77bd)
- feat: add bookmark embedding support ([#&#8203;2857](karakeep-app/karakeep#2857)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`84ab354`](karakeep-app/karakeep@84ab354d)
- deps: upgrade meilisearch client package - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`af3677a`](karakeep-app/karakeep@af3677a1)
- feat(cli): add --description flag to bookmarks update command ([#&#8203;2856](karakeep-app/karakeep#2856)) - [@&#8203;TanishValesha](https://github.com/TanishValesha) in [`8463ad0`](karakeep-app/karakeep@8463ad07)
- fix: fix twitter renderer - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`dc26820`](karakeep-app/karakeep@dc268202)
- fix: fix plugin and stats registration in nextjs across reloads - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`a043c88`](karakeep-app/karakeep@a043c889)
- fix(workers): fix misleading error message when rss import fails to create bookmark. fixes [#&#8203;2838](karakeep-app/karakeep#2838) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`9651c79`](karakeep-app/karakeep@9651c79c)
- release(mobile): release mobile v1.9.5-2 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`78e012f`](karakeep-app/karakeep@78e012f2)
- fix(mobile): fix taglist skeleton - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8d9a015`](karakeep-app/karakeep@8d9a0154)
- release(mobile): release mobile v1.9.5-1 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`a031d43`](karakeep-app/karakeep@a031d433)
- fix(mobile): remove redundant toasts in the bookmarks info page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4e677c5`](karakeep-app/karakeep@4e677c55)
- fix(mobile): change default layout to be list layout - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5332ca3`](karakeep-app/karakeep@5332ca33)
- fix(mobile): add bookmark grid settings to favs and archive pages - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c272037`](karakeep-app/karakeep@c2720375)
- release(mobile): release mobile v1.9.5 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`5d29229`](karakeep-app/karakeep@5d292292)
- feat(mobile): add mobile sorting support. fixes [#&#8203;2777](karakeep-app/karakeep#2777) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d5ea3f5`](karakeep-app/karakeep@d5ea3f5a)
- fix(mobile): fix the padding of the tag pills - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0fe7d70`](karakeep-app/karakeep@0fe7d706)
- feat(mobile): add different mobile layouts to the mobile app ([#&#8203;2837](karakeep-app/karakeep#2837)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`bc29d61`](karakeep-app/karakeep@bc29d61d)
- feat(mobile): change tag colors - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`633016c`](karakeep-app/karakeep@633016c7)
- feat(mobile): add archive,fav,share and highlights to info page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`c32b7f9`](karakeep-app/karakeep@c32b7f99)
- refactor(mobile): use a composite component for the bookmark card - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`77c6523`](karakeep-app/karakeep@77c6523c)
- feat: instagram renderer ([#&#8203;2836](karakeep-app/karakeep#2836)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`3c1a020`](karakeep-app/karakeep@3c1a0201)
- fix(web): fix PWA installaiblity in chrome - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`95555f1`](karakeep-app/karakeep@95555f1f)
- fix(web): fix alignment of keyboard button in global actions - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`0893e51`](karakeep-app/karakeep@0893e512)
- fix(web): change sidebar collapse toggle to chevrons - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`e6756e0`](karakeep-app/karakeep@e6756e05)
- fix(mobile): remove unncessary toast from manage list actions on mobile - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`199d032`](karakeep-app/karakeep@199d0327)
- fix(docker): set yt-dlp to use bundled node as JS runtime ([#&#8203;2805](karakeep-app/karakeep#2805)) - [@&#8203;pike00](https://github.com/pike00) in [`e92f2f0`](karakeep-app/karakeep@e92f2f02)
- fix(web): render PDFs via <embed> so Safari can display them ([#&#8203;2806](karakeep-app/karakeep#2806)) - [@&#8203;KayMi](https://github.com/KayMi) in [`ff28861`](karakeep-app/karakeep@ff288613)
- chore: upgrade to pnpm 11 ([#&#8203;2833](karakeep-app/karakeep#2833)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`8f19963`](karakeep-app/karakeep@8f199631)
- build: stop update old personal docker images - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d10effa`](karakeep-app/karakeep@d10effa2)
- chore: pin github action deps ([#&#8203;2832](karakeep-app/karakeep#2832)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`341f721`](karakeep-app/karakeep@341f7217)
- chore: Add seed snapshot generator ([#&#8203;2829](karakeep-app/karakeep#2829)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`53da5e2`](karakeep-app/karakeep@53da5e2b)
- deps: upgrade nextjs to 16 ([#&#8203;2827](karakeep-app/karakeep#2827)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ff57d9c`](karakeep-app/karakeep@ff57d9c2)
- chore: improve AGENTS.md ([#&#8203;2826](karakeep-app/karakeep#2826)) - [@&#8203;ElectricTea](https://github.com/ElectricTea) in [`b45d41c`](karakeep-app/karakeep@b45d41cc)
- fix: fix error on admin user list due to react query hydration ([#&#8203;2824](karakeep-app/karakeep#2824)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1997bd3`](karakeep-app/karakeep@1997bd38)
- chore: add a .ignore file to filter out noisy dirs from search - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`37b3712`](karakeep-app/karakeep@37b37124)
- docs: update SECURITY.md - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`4b22229`](karakeep-app/karakeep@4b22229d)
- deps: upgrade nextjs to 15.5.18 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f823724`](karakeep-app/karakeep@f8237243)
- fix: serve unoptimized nextjs images - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`61a2bde`](karakeep-app/karakeep@61a2bdeb)
- release(mobile): release mobile v1.9.4 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`01d636f`](karakeep-app/karakeep@01d636f2)
- fix(mobile): improve perf of manage\_tags page - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`84dfea5`](karakeep-app/karakeep@84dfea5e)
- fix(mobile): fix color of list separator in recent searches list - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d426cdb`](karakeep-app/karakeep@d426cdb2)
- fix(mobile): fix formsheet padding in manage\_lists, manage\_tags and info sheets - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`41633c2`](karakeep-app/karakeep@41633c2a)
- feat(mobile): tablet/iPad UI polish for toolbar and FAB ([#&#8203;2788](karakeep-app/karakeep#2788)) - [@&#8203;esimkowitz](https://github.com/esimkowitz) in [`d871f57`](karakeep-app/karakeep@d871f57b)
- fix(mobile): stack Upload Image Quality slider on two lines ([#&#8203;2794](karakeep-app/karakeep#2794)) - [@&#8203;esimkowitz](https://github.com/esimkowitz) in [`75b6e91`](karakeep-app/karakeep@75b6e910)
- fix(mobile): fix insets on new iOS settings formSheet modal ([#&#8203;2793](karakeep-app/karakeep#2793)) - [@&#8203;esimkowitz](https://github.com/esimkowitz) in [`7ce940a`](karakeep-app/karakeep@7ce940a5)
- docs: update screenshots in the docs - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`66a7ac4`](karakeep-app/karakeep@66a7ac48)
- release(extension): Release version 1.2.11 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`f638064`](karakeep-app/karakeep@f638064e)
- feat(browser-extension): request host permission at runtime for client side crawling ([#&#8203;2784](karakeep-app/karakeep#2784)) - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1a7a2fe`](karakeep-app/karakeep@1a7a2fef)
- docs: minor docs update to mention the skills and the new singlefile integration - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`1c7872c`](karakeep-app/karakeep@1c7872ce)
- release(cli): release CLI 0.32.0 - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`ad9ef51`](karakeep-app/karakeep@ad9ef514)
- release: release cli, sdk, mobile and extension - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`58f9b30`](karakeep-app/karakeep@58f9b302)
- release(docs): release the 0.32 docs - [@&#8203;MohamedBassem](https://github.com/MohamedBassem) in [`d28ff5f`](karakeep-app/karakeep@d28ff5fd)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Warsaw)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4yLjEiLCJ1cGRhdGVkSW5WZXIiOiI0NC4yLjEiLCJ0YXJnZXRCcmFuY2giOiJtYXN0ZXIiLCJsYWJlbHMiOlsicmVub3ZhdGUvY29udGFpbmVyIiwidHlwZS9taW5vciJdfQ==-->

Reviewed-on: https://git.ajgon.casa/deedee/mark13/pulls/498
djmango referenced this pull request in djmango/karakeep Sep 19, 2026
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