100 Commits
Author SHA1 Message Date
Mohamed Bassem 5a2f009e2f feat(landing): add cloud status page 2026-08-31 23:51:58 +01:00
Mohamed Bassem f44b67fe6e refactor(landing): ehm, em-dashes? 2026-08-31 21:06:31 +01:00
Mohamed Bassem 5723c7e43c feat(landing): revamp pricing page 2026-08-31 21:01:38 +01:00
Mohamed Bassem ff0e6946e1 feat(landing): dropping the feature grid 2026-08-31 20:37:21 +01:00
Mohamed Bassem cc93284840 deps: upgrade liteque to 0.9.1 and move more transactions to begin immediate 2026-08-31 16:48:07 +01:00
Mohamed Bassem 2f3547445b tests: enable WAL on e2e tests 2026-08-31 15:51:33 +01:00
Mohamed Bassem f4efff9979 fix(mobile): prevent pagination from cancelling refetches 2026-08-31 15:37:00 +01:00
Mohamed Bassem 2620d9e6a7 feat: adding well-known urls for api, change pass, and security 2026-08-31 14:56:19 +01:00
Mohamed Bassem ed836e8e30 fix(mobile): revert ios context menu 2026-08-31 14:36:23 +01:00
Mohamed Bassem cdb5cbb3f9 feat(landing): revamp the landing page 2026-08-31 13:29:30 +01:00
Mohamed Bassem e77fa2069c feat(landing): some small landing changes 2026-08-31 12:00:44 +01:00
Mohamed Bassem 08d5963b23 feat(skill): improve skills to mention new features 2026-08-31 11:27:35 +01:00
Mohamed Bassem dd518bb3ac fix(db): open db in readonly mode while in degraded mode 2026-08-31 01:55:14 +01:00
Mohamed Bassem 7f5a56a29f fix: lazy load tracing and event logging deps only when they're enabled 2026-08-31 01:46:37 +01:00
Mohamed Bassem 6a4ac418a3 ci: drop parallel mode for CI 2026-08-31 01:32:10 +01:00
Mohamed Bassem 1a7b8c8553 feat: add a new degraded mode knob 2026-08-31 01:30:56 +01:00
Mohamed Bassem c9ab52c43e refactor: move assetdb into a plugin 2026-08-31 00:58:27 +01:00
Mohamed Bassem 046cb17ec1 refactor(plugins): avoid importing plugins that are not in use 2026-08-31 00:33:26 +01:00
Mohamed Bassem 6d013d1816 fix(workers): lazy import workers only when enabled 2026-08-31 00:17:59 +01:00
Mohamed Bassem d6d8d5ed33 feat(landing): link llms.txt in the footer 2026-08-30 18:50:55 +01:00
Mohamed Bassem 6ccbe89c11 docs: add codex desktop to mcp docs 2026-08-30 18:49:48 +01:00
Mohamed Bassem 5780b6eb00 release(mobile): release mobile v1.11.0-0 2026-08-30 18:28:32 +01:00
Mohamed Bassem fc401d02bf feat(mobile): tag management 2026-08-30 18:27:38 +01:00
Mohamed Bassem 8ca596bcca Move list actions above display options 2026-08-30 18:19:27 +01:00
Mohamed Bassem f422be034c fix(mobile): sort manage lists by path 2026-08-30 18:16:54 +01:00
Mohamed Bassem 0bb4a60c08 feat(mobile): streamline settings screens 2026-08-30 18:13:12 +01:00
Mohamed Bassem 685c689075 fix(tests): allow more time for the e2e import test 2026-08-30 17:44:13 +01:00
Mohamed Bassem 482369b718 fix(mobile): fix vertical image rendering in bookmark info 2026-08-30 17:30:30 +01:00
Mohamed Bassem 2b2771a6a1 fix(mobile): improve layout of bookmark cards without metadata 2026-08-30 17:23:36 +01:00
Mohamed Bassem af09dcb707 fix(mobile): fix metro crash caused by nativewind 2026-08-30 16:34:50 +01:00
Mohamed Bassem 0083f5f0d9 fix(mobile): make the server address less invasive in the login screen 2026-08-30 16:34:01 +01:00
Mohamed Bassem 4e974a8a09 fix(ci): fix diverged pnpm-lock 2026-08-30 15:55:07 +01:00
Mohamed Bassem baf0b1bbe3 feat(cli): bundle the official skill as part of the CLI 2026-08-30 15:53:34 +01:00
Mohamed Bassem 39df6c6ea7 feat(mcp): upgrade to mcp v2 2026-08-30 15:53:33 +01:00
Mohamed Bassem ca72503ca1 fix: upgrade SQLite bindings for Node 24 (#3043) 2026-08-30 15:33:54 +01:00
Mohamed Bassem 4f68dd187f docs: change docs page title 2026-08-30 12:26:58 +01:00
Mohamed Bassem ebf892c45b ci: pin Node.js to 24.18.1 2026-08-26 15:14:26 +01:00
Mohamed Bassem 017343fdf7 fix(web): upgrade Next.js to 16.3.3 2026-08-25 22:54:35 +01:00
Mohamed Bassem 7ca5ee236b feat(mobile): add parent list picker 2026-08-22 19:27:51 +01:00
Mohamed Bassem 6563ee1456 feat(mobile): add usage statistics screen 2026-08-22 19:23:03 +01:00
Mohamed Bassem f977712862 feat(mobile): allow creating a list from the manage lists page 2026-08-22 19:04:25 +01:00
Mohamed Bassem 2435a420e3 feat(mobile): restore toast on list attach/remove 2026-08-22 19:02:17 +01:00
Mohamed Bassem 428d1f22a4 feat(mobile): emoji selector on mobile for list names 2026-08-22 17:04:31 +01:00
Mohamed Bassem acbac6ad8e fix(web): A more mature delete all uncleaned tags button 2026-08-22 16:15:44 +01:00
Mohamed Bassem a416d043e6 feat(landing): open login and signup link in same window 2026-08-22 16:09:38 +01:00
Mohamed Bassem cb5b20e789 feat(landing): add markdown version of the pricing page 2026-08-22 14:36:48 +01:00
Mohamed Bassem a8450b3ca4 docs: add llms.txt for agent resources 2026-08-22 14:13:38 +01:00
Mohamed Bassem f6fae9c8d0 feat(landing): some landing page changes 2026-08-16 20:22:29 +01:00
Mohamed Bassem 44ea02845d refactor: optimze the lists stats query for manual lists 2026-08-13 10:01:42 +01:00
Mohamed Bassem 2434e65799 fix(web): fix type preventing the upload of .jpgs in attachment box 2026-08-13 09:33:50 +01:00
Mohamed Bassem ec7a0cc91c fix(workers): handle feed scheduling errors 2026-08-12 19:08:16 +01:00
Mohamed Bassem 135f116374 fix(trpc): fix bookmark pagination tie breakers 2026-08-12 19:07:40 +01:00
Mohamed Bassem 590019da33 refactor: drop support for ids in getBookmarks trpc endpoint 2026-08-12 19:07:15 +01:00
Mohamed Bassem c865bdca3a fix(api): fix asset upload potential collision 2026-08-12 19:06:34 +01:00
Mohamed Bassem 94e1ea212c fix: add pagination limit validation on trpc endpoints 2026-08-12 19:05:51 +01:00
Mohamed Bassem 5cd07ee9e6 fix(workers): drain response bodies on redirects 2026-08-12 18:57:47 +01:00
Mohamed Bassem ae9e23b35f fix(workers): crash entire worker process when one of the workers fail 2026-08-12 18:57:20 +01:00
Mohamed Bassem 53c70c428e deps: upgrade to nextjs 16.3 2026-08-12 17:43:30 +01:00
Mohamed Bassem 6f375972e1 fix(web): make bulk selection touch friendly (#3015) 2026-08-12 17:43:14 +01:00
Mohamed Bassem adf399be36 fix(workers): identify RSS fetcher 2026-08-12 12:43:18 +01:00
Mohamed Bassem a8df483502 fix(workers): force setting embedding format to float (#3009) 2026-08-11 19:58:57 +01:00
Mohamed Bassem 0d86b32c66 docs: update the docs for 0.33.2 2026-08-11 14:41:15 +01:00
Mohamed Bassem e715eb5e49 release: release cli patch 0.33.1 2026-08-11 14:36:40 +01:00
Mohamed Bassem 98c0c7896e fix: Set max completion tokens to true when using default openai config (#3007)
* fix: Set max completion tokens to true when using default openai config
2026-08-11 14:14:27 +01:00
Mohamed Bassem 951e50257a feat: migrate to a custom karakeep chrome image (#3005) 2026-08-11 13:35:37 +01:00
Mohamed Bassem b6415b3c25 feat: publish a new karakeep chrome container (#3004) 2026-08-11 13:14:49 +01:00
Mohamed Bassem f57aad1d86 feat(mobile): switch to using context menu in ios (#3002) 2026-08-11 11:57:35 +01:00
Mohamed Bassem 28e79094ef feat(mobile): switch to using context menu in ios 2026-08-02 17:26:58 +01:00
Mohamed Bassem 764ba850b7 fix(restate): use logger middleware instead of durable steps 2026-08-02 15:39:38 +01:00
Mohamed Bassem 1c0b0a9a3b fix(workers): drop inline media blocks before metadata parsing 2026-08-02 15:21:02 +01:00
Mohamed Bassem 5f6ba262c6 feat(cli): allow importing singlefile archives via the CLI 2026-08-02 15:18:01 +01:00
Mohamed Bassem 3af6f458cd docs: update intro doc with new features 2026-08-02 14:24:36 +01:00
Mohamed Bassem a81f935abf readme: update the readme and docs with the new features 2026-08-01 23:04:42 +01:00
Mohamed Bassem b3fbf6bb77 release: release cli, sdk & mcp 2026-08-01 22:36:02 +01:00
Mohamed Bassem aa69d1dead release(docs): release the 0.33 docs 2026-08-01 22:01:47 +01:00
Mohamed Bassem 8550eb09e7 fix(tagging): loosen the captcha rejection in the prompt a bit 2026-08-01 21:04:05 +01:00
Mohamed Bassem 98c52b85c2 fix(workers): wait for autoconsent in parallel with page load 2026-08-01 21:00:46 +01:00
Mohamed Bassem f249307b31 fix(tests): fix failing test after changing default model 2026-08-01 20:49:14 +01:00
Mohamed Bassem 1bc351a7f8 feat: change default inference model to gpt-5.6-luna 2026-08-01 20:12:03 +01:00
Mohamed Bassem bcbb577664 fix: enable auto embedding by default for default inference configuration (#2976) 2026-08-01 19:37:25 +01:00
Mohamed Bassem 7722c6ae65 fix: enable auto embedding by default for default inference configurations 2026-08-01 19:13:01 +01:00
Mohamed Bassem ccddfcf37a deps: upgrade docusaurus 2026-08-01 17:21:03 +01:00
Mohamed Bassem 385ec1df40 feat(landing): 28k starts 2026-08-01 16:52:25 +01:00
Mohamed Bassem 76b477c4c0 feat: add new article quality assessment (#2975) 2026-08-01 16:49:48 +01:00
Mohamed Bassem 6f12013326 fix: make queue registration idempotent 2026-08-01 13:28:43 +01:00
Mohamed Bassem 3b7982c185 i18n: some translation fixes 2026-08-01 12:56:43 +01:00
Mohamed Bassem b4b947401b feat(web): some UX improvements in signin and password forms 2026-08-01 12:41:02 +01:00
Mohamed Bassem c333f240a8 feat(workers): auto-dismiss consent dialogs with autoconsent (#2973)
* feat(workers): auto-dismiss consent dialogs with autoconsent

Add @duckduckgo/autoconsent CMP auto-opt-out to the browser crawl. The bundle
+ rules load once at browser init (browser.ts); each page installs the content
script via addInitScript over an exposeFunction bridge (crawler/autoconsent.ts),
after the SSRF router and redirect guard. When a CMP is detected we wait up to
3s (abort-aware) for opt-out before capturing HTML/screenshot/PDF; pages with
no CMP add zero latency. Gated by CRAWLER_ENABLE_AUTOCONSENT (default on).
2026-08-01 12:34:44 +01:00
Mohamed Bassem 114888967b deps: upgrade nextjs to 16.2.12 2026-07-26 20:15:28 +01:00
Mohamed Bassem 3a0421d0ce fix(workers): fix workers in dev mode 2026-07-26 20:10:28 +01:00
Mohamed Bassem a90034d1d2 deps: bump a bunch of deps 2026-07-26 20:06:28 +01:00
Mohamed Bassem 36c36e3e50 docs: hide the chat flags for now 2026-07-26 19:38:22 +01:00
Mohamed BassemandClaude Opus 5 036da4c0a1 fix(auth): close account enumeration oracles in login and password reset
The dummy comparison meant to equalise the timing of a login against a
non-existent account passed a 40 character string as the hash. bcrypt parses
the hash to recover its cost factor and salt, so an argument that isn't a valid
60 character hash makes it bail out immediately without deriving anything --
the branch cost 0.1ms against 53ms for a real account, a 500x gap that
identifies registered emails from a single request. Compare against a real
hash of a random secret at the same cost factor instead. Measured after the
change: 54.9ms, 55.1ms and 54.1ms for the real, unknown and password-less
paths.

The password-less branch returned with no comparison at all, which likewise
made OAuth-only accounts distinguishable from password accounts. Give it the
same treatment.

forgotPassword awaited the delivery of the reset email, which only real
accounts reach, leaking existence through response latency. Worse, a failure
there was rethrown as a 500, so an unhealthy SMTP server turned the endpoint
into an exact oracle: 500 for a registered address, 200 for an unregistered
one. Dispatch it without awaiting and log failures instead, so the response is
identical either way. Token creation failures still surface, since they don't
depend on whether the account exists.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q1xMm8rJm4riqQgyy9Eydu
2026-07-26 19:37:43 +01:00
Mohamed BassemandClaude Opus 5 9188958cd6 fix(mobile): don't silently swallow mutations fired while offline
Wiring up onlineManager means react-query's default "online" network mode now
takes effect for mutations, which pauses them instead of running them: onMutate
still applies its optimistic update, isPending stays true forever, and onError
never fires. shouldDehydrateMutation is false, so nothing is persisted either
-- the write is simply lost when the app is killed, with the UI having shown it
as successful. Favouriting, archiving or tagging offline all hit this.

Default mutations to "always" so they fail fast against the existing onError
handlers, restoring the pre-1.10 behaviour of surfacing a real error. Proper
offline queuing needs persisted mutations plus setMutationDefaults and
resumePausedMutations, which is a bigger change than this deserves.

The share sheet had a second problem: its idle branch rendered only a spinner,
with no dismiss affordance and no auto-close timer (the existing one returns
early for "idle"). An empty share intent never calls mutate at all, so nothing
can move it out of that state and the sheet has to be force-quit. Show a
dismiss escape hatch once a save has been idle for five seconds.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q1xMm8rJm4riqQgyy9Eydu
2026-07-26 19:27:57 +01:00
Mohamed BassemandClaude Opus 5 64ec6cbcf2 fix(plugins): don't cache a rejected init promise in the meilisearch providers
getClient() memoised the in-flight init promise but only cleared it on the
success path. If initClient() rejected -- meilisearch restarting, or the
explicit throw on an unsupported v0.x server -- the rejected promise stayed in
initPromise, and the early-return guard replayed that same rejection on every
subsequent call for the lifetime of the process. A transient blip therefore
disabled search or the vector store until the container was restarted, with
nothing in the logs to suggest a restart was needed.

Clear it in a finally instead, in both providers.

Also stop the admin connection check from resolving the clients outside its
try blocks. getClient() connects lazily, so it can throw, and one unreachable
backend was taking down the entire Server Stats page instead of reporting
itself as disconnected alongside the healthy ones. A throw means a provider is
registered but unreachable, so report it as configured with the error attached.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q1xMm8rJm4riqQgyy9Eydu
2026-07-26 19:26:38 +01:00
Mohamed BassemandClaude Opus 5 f0381b4277 fix(export): escape tag names in the netscape bookmark export
Tag names were concatenated straight into the TAGS="..." attribute of the
exported HTML with no escaping, while the URL and title on the same line were
both escaped. A tag containing a quote breaks out of the attribute, and one
containing `">` breaks out of the <A> element entirely.

Tag names are attacker-influenced: the AI tagger writes them from raw model
output, which is parsed as z.array(z.string()) with no character validation,
so a crawled page can steer the tagger into emitting a payload. The export is
served as text/html, so the script runs when the user opens the downloaded
file. The vector is also reachable cross-user, since a crafted netscape import
plants tags that the victim later re-exports.

Escape the joined tag names with the existing helper, and cover it with a test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q1xMm8rJm4riqQgyy9Eydu
2026-07-26 19:23:41 +01:00
Mohamed Bassem f2f6431db2 feat: add support for resaving already existing bookmarks (#2962) 2026-07-26 18:57:47 +01:00
Mohamed Bassem a698724705 feat(web): move keyboard shortcuts inside the profile options menu 2026-07-26 13:03:27 +01:00
Mohamed Bassem 28a48ec582 feat(web): allow triggering bulk edit on hover 2026-07-26 12:39:15 +01:00
Mohamed Bassem d155fa0eec fix(workers): denoise the log messages coming from the feedWorker 2026-07-26 11:29:47 +01:00