rcgit

/ karakeep
follow (on) | order: default date topo
Age Commit message Author Files +/-
fix(mobile): respect archiveDisplayBehaviour setting in lists and tags (#2499)
* fix(mobile): respect archiveDisplayBehaviour setting in lists and tags
The mobile app was not respecting the user's archiveDisplayBehaviour
setting when displaying bookmarks in home, tags, and lists views. This
fix adds the user settings query to these views and applies the setting
to filter archived bookmarks accordingly.
- When archiveDisplayBehaviour is "show", archived bookmarks are included
- When archiveDisplayBehaviour is "hide", archived bookmarks are filtered out
- Applied to home screen, tags view, and lists view
This brings the mobile app in line with the web app's behavior.
refactor(mobile): extract archive filter logic to shared hook
Created a reusable `useArchiveFilter` hook to centralize the logic for
determining whether to show archived bookmarks based on user settings.
This eliminates code duplication across home, tags, and lists views.
Benefits:
- Single source of truth for archive filtering logic
- Easier to maintain and update
- Consistent behavior across all bookmark views
- Cleaner component code
* fix
* revert the fix for home tab
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 3 -2/+29
fix(web): fix scrolling in manage lists/edit tags when inside a dialog. fixes… Mohamed Bassem 2 -1/+5
fix(mobile): remove the use of custom safe areas Mohamed Bassem 12 -461/+419
fix(mobile): remove smart lists from manage_lists page Mohamed Bassem 1 -3/+3
fix(mobile): fix formsheets on android Mohamed Bassem 2 -6/+18
fix(ui): fix the colors of buttons in the settings page Mohamed Bassem 8 -12/+10
fix(ui): Improve visual consistency in all settings page Mohamed Bassem 23 -876/+807
feat: add checkUrl endpoint to replace searchBookmarks for URL existence checks
Introduces a dedicated `checkUrl` tRPC endpoint that directly queries the
database for URL existence instead of going through the full search pipeline.
The endpoint uses the same LIKE matching semantics as the `url:` search
qualifier, then normalizes URLs (stripping hash fragments and trailing slashes)
for exact comparison server-side. This replaces the browser extension's
previous approach of calling searchBookmarks with `url:` and filtering
client-side.
Mohamed Bassem 6 -23/+231
fix: auto dismiss dialogs during crawling Mohamed Bassem 1 -0/+8
deps: fix mismatch in @types/react across packages Mohamed Bassem 5 -1046/+544
deps: upgrade playwright to 1.58.2 Mohamed Bassem 2 -192/+370
fix(mobile): drop the use of custom safe areas in bookmark lists Mohamed Bassem 6 -87/+42
fix(mobile): fix headers in android app Mohamed Bassem 12 -44/+98
fix: parallelize content extraction in crawler worker Mohamed Bassem 1 -154/+280
chore: upgrade react-slot to fix type error Mohamed Bassem 5 -53/+255
fix(ux): hide autocomplete dropdown when there are no suggestions
Previously, typing a search term with no matching autocomplete suggestions
would show a "No suggestions" empty state dropdown. Now the popover is
simply hidden when there are no recommendations to display.
https://claude.ai/code/session_015C4Kvd3NYqTJFmhAvomd27
Claude 2 -7/+2
feat: add synchronized reading progress for bookmarks (#2302)
* feat: add synchronized reading progress for bookmarks
Track and restore reading position in reader mode across web and mobile.
Uses text character offsets (matching the highlights pattern) to find
the first visible paragraph and scroll back to it on return.
- Add readingProgressOffset field to bookmarkLinks table
- Add updateReadingProgress tRPC mutation
- Create shared useReadingProgress hook with auto-save on unload
- Integrate in web full-screen reader (/reader/[bookmarkId])
- Integrate in mobile reader mode via WebView injectedJavaScript
- Only tracks progress for bookmark owners
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* it works
* align mobile functions
* fmt
* use generator for webview js fns, remove empty index.ts
* revert comments
* move shared fns into core
* address pr review
* watch core too
* address some pr comments
* fix race condition and jump when scrolling
* fix dead code and error handling, simplify some duplicate logic
* move reading progress to separate table
* remove arbitrary >100 char threshold for updates to progress
* only allow reading progress for link bookmarks, error on others
* add tests
* add tests for shared access reading progress
* simplify reading-progress hooks, visibility checks, remove char threshold on mobile
* remove unnecessary restoration lock
* remove unnecessary exports from reading-progress-core
* move position restoration to onload, more deterministic
* cleanup effects
* Update packages/shared-react/hooks/reading-progress.ts
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
* fix function signatures in generated js comment
* remove verbose comments
* add percentage progress fallback
* address comments
* some code dedupe and simplification
* missed one
* Remove lastKnownPositionRef
* remove unnecessary reading-progress-core test
* update savePosition comment
* drop the esbuild generated code
* re-add the db migrations
* wire the mobile dom with the reading progress
* banner for reading progress instead of hiding content
* dedup code from reader view and preview page
* more simplifications
* add a sticky progress bar tracker at the top
* more code simplification
* rename test
* extract reading progress into its own handler
* more polish
* fix scroll behavior of full page bookmark preview
* more polish
* fix pnpm-lock
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Evan Simkowitz 20 -57/+4769
feat(mobile): Add highlights support for the mobile app (#2494) Mohamed Bassem 21 -634/+911
fix(import): truncate title to max length in import worker Mohamed Bassem 1 -2/+9
feat(crawler): retrun 403, 429 and 5XX status codes Mohamed Bassem 1 -1/+25
fix(web): fix clipping of reader view in smaller screens Mohamed Bassem 1 -6/+5
fix(web): fix double scrolling in sidebar layout Mohamed Bassem 1 -3/+3
feat(ui): Add a better content fetching loading state in the bookmark preview Mohamed Bassem 2 -6/+14
feat: add a download button to the More submenu in bookmark options Mohamed Bassem 2 -0/+13
feat: add ToS and update privacy policy Mohamed Bassem 4 -63/+538
feat(cloud): switch to managed payments Mohamed Bassem 5 -39/+45
feat: add ways to link ToS and privacy policy Mohamed Bassem 4 -1/+53
fix(mobile): change initial page to be the home tab Mohamed Bassem 1 -0/+5
fix(mobile): show image uploading toast while upload is ongoing Mohamed Bassem 1 -3/+17
feat: add OAuth auto-redirect functionality (#2483)
* feat: add OAuth auto-redirect functionality
Add OAUTH_AUTO_REDIRECT environment variable to automatically redirect
users to the OAuth provider when both password authentication is disabled
and an OAuth provider is configured.
Changes:
- Add OAUTH_AUTO_REDIRECT config in packages/shared/config.ts
- Create OAuthAutoRedirect component for client-side redirect logic
- Update SignInForm to include auto-redirect functionality
- Add oauthAutoRedirect to client config context
- Document new environment variable in configuration docs
This improves user experience by eliminating unnecessary clicks when
OAuth is the only available authentication method.
Fixes #1189
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
* review comments
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
Mohamed Bassem 5 -0/+56
feat: export lists in backups and exports (#2484)
* feat(mobile): make the bookmark edit UIs look more native
* fix: dont invalidate getBookmark query on bookmark deletion
* feat: add list definitions and memberships to JSON export and backup
Include list definitions (name, icon, type, hierarchy) and per-bookmark
list memberships in both the JSON export endpoint and backup worker output.
The parser is updated to convert list data back into folder paths on import.
Streaming memory bounds are preserved by fetching memberships per batch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* more fixes
* more fixes
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Mohamed Bassem 10 -135/+823
feat(workers): extract html parsing into a subprocess (#2485)
* feat(mobile): make the bookmark edit UIs look more native
* fix: dont invalidate getBookmark query on bookmark deletion
* feat: run metascraper & readability parsing in a subprocess
Extract HTML parsing (metascraper metadata extraction + readability
content extraction) into a separate Node.js subprocess. This prevents
OOM crashes in the parser from killing the entire worker process.
The subprocess communicates via JSON over stdin/stdout, and all log
output is redirected to stderr. Two new config vars control the
subprocess heap size (CRAWLER_PARSE_MAX_OLD_SPACE_SIZE_MB, default
512MB) and timeout (CRAWLER_PARSE_TIMEOUT_SEC, default 60s).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix format
* some fixes
* some fixes
* some fixes
* last fix
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Mohamed Bassem 7 -139/+313
feat(mobile): make the bookmark edit UIs look more native Mohamed Bassem 5 -449/+526
fix: share PDFs as files instead of links in mobile app
Previously, sharing a PDF from the mobile app would share the asset URL
as a link. This changes the behavior to download the PDF first and share
it as an actual file (matching how images are already shared), with the
correct MIME type and UTI set for proper PDF handling on both platforms.
https://claude.ai/code/session_01VCeeCc64xyZsfEs9T3aQwc
Claude 1 -8/+31
feat(landing): add get started button Mohamed Bassem 1 -4/+15
feat: link to apps and extensions, docs and twitter in profile dropdown Mohamed Bassem 4 -2/+148
Revert "refactor: move assetdb to shared-server"
This reverts commit a04d3c35fc9082e529a713605a038d236bb072c7.
Mohamed Bassem 24 -833/+810
refactor: move assetdb to shared-server Mohamed Bassem 24 -810/+833
fix: dedup list and recent search suggestions Mohamed Bassem 1 -10/+32
feat(mobile): Add animated UI feedback to sharing modal (#2427)
* feat(mobile): Add animated UI feedback to sharing modal
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 4 -49/+417
feat(mobile): more native screens Mohamed Bassem 23 -798/+964
feat(ai): Support restricting AI tags to a subset of existing tags (#2444)
* feat(ai): Support restricting AI tags to a subset of existing tags
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 18 -18/+3538
feat(mcp): Support custom configurable HTTP headers (#2436)
* feat(mcp): Support custom configurable HTTP headers
* docs(mcp): Add KARAKEEP_CUSTOM_HEADERS documentation
* fix(mcp): Prioritize default headers and safely parse custom headers
* docs(mcp): Correct capitalization of Cloudflare headers
Chen Ye 2 -3/+19
feat: Added Import for Instapaper (#2434)
* Added Instapaper import
* Fixes #1444 Added Instapaper import support
Daniel Wieser 3 -1/+83
feat: Add drag-and-drop support for bookmarks to lists (#2469)
* feat: add drag and drop bookmark cards into sidebar lists
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 5 -111/+265
feat(crawler): Split bookmark metadata updates into two phases for faster…
* feat(crawler): write metadata to DB early for faster user feedback
Split the single DB transaction in crawlAndParseUrl into two phases:
- Phase 1: Write metadata (title, description, favicon, author, etc.)
  immediately after extraction, before downloading assets
- Phase 2: Write content and asset references after all assets are
  stored (banner image, screenshot, pdf, html content)
This gives users near-instant feedback with bookmark metadata while
the slower asset downloads and uploads happen in the background.
https://claude.ai/code/session_013vKTXDcb5CEve3WMszQJmZ
* fix(crawler): move crawledAt to phase 2 DB write
crawledAt should only be set once all assets are fully stored, not
during the early metadata write.
https://claude.ai/code/session_013vKTXDcb5CEve3WMszQJmZ
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 1 -22/+32
feat: add source filter to query language (#2465)
* feat: add source filter to query language
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* autocomplete source
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Mohamed Bassem 8 -4/+154
fix: treat bookmark not found as a no-op in rule engine instead of a failure…
When a bookmark is deleted before the rule engine worker processes its
event, the worker would throw an error, triggering failure metrics,
error logging, and retries. This changes both the worker and
RuleEngine.forBookmark to gracefully skip processing with an info log
instead.
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 3 -15/+24
fix(extension): dont store tab title when saving links or images. fixes #2462 Mohamed Bassem 1 -1/+5
feat: Add separate queue for import link crawling (#2452)
* feat: add separate queue for import link crawling
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 5 -36/+70
feat(metrics): add prometheus metric for bookmark crawl latency (#2461)
Track the time from bookmark creation to crawl completion as a histogram
(karakeep_bookmark_crawl_latency_seconds). This measures the end-to-end
latency users experience when adding bookmarks via extension, web, etc.
Excludes recrawls (crawledAt already set) and imports (low priority jobs).
https://claude.ai/code/session_019jTGGXGWzK9C5aTznQhdgz
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 3 -2/+28
feat(import): new import details page (#2451)
* feat(import): new import details page
* fix typecheck
* review comments
Mohamed Bassem 5 -2/+666
fix(ci): fix missing format error Mohamed Bassem 1 -1/+1
feat: add extra instrumentation in the otel traces (#2453) Mohamed Bassem 7 -31/+231
fix(import): sanitize error messages to prevent backend detail leakage (#2455)
The catch block in processOneBookmark was storing raw error strings via
String(error) in the resultReason field, which is exposed to users through
the getImportSessionResults tRPC route. This could leak internal details
like database constraint errors, file paths, stack traces, or connection
strings.
Replace String(error) with getSafeErrorMessage() that only allows through:
- TRPCError client errors (designed to be user-facing)
- Known safe validation messages from the import worker
- A generic fallback for all other errors
The full error is still logged server-side for debugging.
https://claude.ai/code/session_01F1NHE9dqio5LJ177vmSCvt
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 1 -1/+26
fix(import): skip counting pending items for paushed sessions MohamedBassem 1 -7/+16
fix(import): register improt metrics to the prom registry Mohamed Bassem 2 -1/+9
fix(import): propagate crawling/tagging failure to import status Mohamed Bassem 1 -18/+50
fix: extra logging for the import worker Mohamed Bassem 1 -13/+39
fix: backfill old sessions and do queue backpressure (#2449)
* fix: backfill old sessions and do queue backpressure
* fix typo
Mohamed Bassem 3 -22/+118
feat: Import workflow v3 (#2378)
* feat: import workflow v3
* batch stage
* revert migration
* cleanups
* pr comments
* move to models
* add allowed workers
* e2e tests
* import list ids
* add missing indicies
* merge test
* more fixes
* add resume/pause to UI
* fix ui states
* fix tests
* simplify progress tracking
* remove backpressure
* fix list imports
* fix race on claiming bookmarks
* remove the codex file
Mohamed Bassem 22 -483/+8300
feat: Add LLM-based OCR as alternative to Tesseract (#2442)
* feat(ocr): add LLM-based OCR support alongside Tesseract
Add support for using configured LLM inference providers (OpenAI or Ollama)
for OCR text extraction from images as an alternative to Tesseract.
Changes:
- Add OCR_USE_LLM environment variable flag (default: false)
- Add buildOCRPrompt function for LLM-based text extraction
- Add readImageTextWithLLM function in asset preprocessing worker
- Update extractAndSaveImageText to route between Tesseract and LLM OCR
- Update documentation with the new configuration option
When OCR_USE_LLM is enabled, the system uses the configured inference model
to extract text from images. If no inference provider is configured, it
falls back to Tesseract.
https://claude.ai/code/session_01Y7h7kDAmqXKXEWDmWbVkDs
* format
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 4 -10/+78
feat: batch meilisearch requests (#2441)
* feat: batch meilisearch requests
* more fixes
Mohamed Bassem 6 -20/+226
fix(mobile): migrate from RN image to expo-image Mohamed Bassem 6 -34/+55
chore: replace dayjs with data-fns Mohamed Bassem 7 -28/+13
fix(web): don't bundle tiktoken in client bundles Mohamed Bassem 9 -85/+144
feat(mobile): use native tabs for mobile Mohamed Bassem 5 -90/+62
fix(mobile): make the subtext in bookmark info page more subtle Mohamed Bassem 1 -3/+3
feat(mobile): add signup support to the mobile app Mohamed Bassem 1 -1/+14
feat: add support for redirectUrl after signup (#2439)
* feat: add support for redirectUrl after signup
* pr review
* more fixes
* format
* another fix
Mohamed Bassem 10 -21/+215
fix: better looking error message when article content is unavailable Mohamed Bassem 2 -1/+22
fix(mobile): fix some mobile warning after expo 54 upgrade Mohamed Bassem 11 -30/+50
refactor: remove unused trpc files from web and mobile Mohamed Bassem 76 -83/+102
refactor: migrate trpc to the new react query integration mode (#2438)
* refactor: migrate trpc to the new react query integration mode
* more fixes
* more migrations
* upgrade trpc client
Mohamed Bassem 112 -1871/+2536
refactor: centralize auth imports through new client module (#2437)
* refactor(web): centralize next-auth client-side utilities
Create lib/auth/client.ts to re-export all next-auth/react APIs (useSession,
signIn, signOut, SessionProvider) from a single location. This prepares
for future auth provider replacement by isolating the next-auth dependency.
https://claude.ai/code/session_01RLLL6SquzmegG6wKHdT3Fm
* format
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 15 -15/+25
feat(mobile): show num bookmarks in the all lists view Mohamed Bassem 1 -4/+30
fix(mobile): fix mobile list styling Mohamed Bassem 4 -12/+12
refactor: lazy init background queues Mohamed Bassem 5 -58/+155
feat(cli): Add bookmark search command (#2426)
* feat(cli): Add search subcommand to bookmarks
Add a new search subcommand that uses the searchBookmarks API endpoint.
The command supports:
- Full-text search with advanced query matchers (tag:, is:, list:, etc.)
- Pagination with --all flag to fetch all results
- Sorting by relevance, ascending, or descending order
- Optional full content inclusion with --include-content
- Configurable result limit per page
Example usage:
  bookmarks search "is:fav tag:important"
  bookmarks search "kotlin" --sort-order desc --limit 20
  bookmarks search "title:api" --include-content --all
* fixes + format
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 2 -12/+88
fix(ui): Improve visual consistency in all lists and highlights page Mohamed Bassem 5 -21/+29
feat: disable karakeep 2025 wrapped Mohamed Bassem 4 -56/+11
feat(extension): autofocus on note open (#2366)
* Autofocus on note open
Snoww 1 -0/+1
ux(mobile): align all lists in the all lists tab Mohamed Bassem 1 -19/+34
feat: track api key usage dates Mohamed Bassem 9 -20/+3078
deps(mobile): upgrade to sdk 54 Mohamed Bassem 6 -1176/+1644
feat(rules): add "Title Contains" condition to Rule Engine (#1670) (#2354)
* feat(rules): add "Title Contains" condition to Rule Engine (#1670)
* feat(rules): hide title conditions for bookmark created trigger
* fix typecheck
Andrii Mokhovyk 6 -1/+133
fix(mobile): Reader settings preview on mobile matches reader view formatting…
* fix: Reader settings preview on mobile matches reader view formatting
* address comments
Evan Simkowitz 2 -16/+170
fix(web): avoid masonry overflow in bookmark grids (#2400) Evan Frenkel 3 -5/+25
deps: upgrade react to 19.2.1 Mohamed Bassem 7 -1172/+1229
fix(mobile): add custom headers to card banners. fixes #2342 Mohamed Bassem 1 -6/+9
feat: privacy-respecting bookmark debugger admin tool (#2373)
* fix: parallelize queue enqueues in bookmark routes
* fix: guard meilisearch client init with mutex
* feat: add bookmark debugging admin tool
* more fixes
* more fixes
* more fixes
Mohamed Bassem 9 -18/+1304
fix: Accept more permissive RSS feed content types and Fix User-Agent key…
* Fix User-Agent key and accept more permissive content types
Some feeds are Content-Type application/xml only and will respond with a 406 error to responses with a header of content type application/rss+xml. This change allows for the more permissive content types application/xml and text/xml to be accepted
Also fixes UserAgent with correct User-Agent
* Fix: Remote trailing whitespace in feedWorker.ts
Fix formatting on HTTP Header for RSS Accceptable Content-Types introduced in commit 6896392
* format
E.T. 1 -2/+2
fix: stop theme flashes with cloudflare rocket loader (#2340) Sweepy 1 -1/+5
feat: Add retry buttons for pending bookmarks in admin panel (#2341) Mohamed Bassem 3 -2/+33
chore: add a note about hostname allowlists in the validation error message Mohamed Bassem 1 -1/+1
fix(mobile): fix the connection debug text area Mohamed Bassem 2 -17/+14
fix(mobile): fix save button in server-address screen on android Mohamed Bassem 1 -8/+9
feat(mobile): use react native sonner Mohamed Bassem 4 -260/+70
release(cli,sdk): release cli and sdk v0.30 Mohamed Bassem 3 -5/+15
release(mobile): Bump mobile version to 1.8.4 Mohamed Bassem 1 -3/+3
prevnext