rcgit

/ karakeep
order: default date topo
Age Commit message Author Files +/-
feat: add the ability to specify a different changelog version Mohamed Bassem 3 -19/+44
fix: remove duplicate mobile backdrop button in reader view (#2234) Evan Simkowitz 1 -14/+0
fix(landing): fix cloud banner on mobile Mohamed Bassem 1 -4/+4
refactor: add suspense boundary in sidebar layout Mohamed Bassem 8 -175/+297
feat(mobile): make the settings menu look more native (#2307)
* feat(mobile): make the settings menu look more native
* more fixes
* review comments
Mohamed Bassem 5 -103/+234
feat(web): better looking scrollbar in the sidebar Mohamed Bassem 2 -1/+27
feat(mobile): use oled friendly colors for android app. fixes #1958 Mohamed Bassem 3 -164/+5
refactor: migrate toasts to sonner Mohamed Bassem 66 -289/+150
feat: add customizable tag styles (#2312)
* feat: add customizable tag styles
* add tag lang setting
* ui settings cleanup
* fix migration
* change look of the field
* more fixes
* fix tests
Mohamed Bassem 18 -136/+3895
feat: add Matter import support (#2245)
* Matter import
* use zod
* fix date parsing
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Moondragon85 34 -0/+99
feat: support archiving as pdf (#2309)
* feat: support archiving as pdf
* add supprot for manually triggering pdf downloads
* fix submenu
* menu cleanup
* fix store pdf
Mohamed Bassem 16 -33/+290
feat: add OPENAI_PROXY_URL configuration and support for proxy in OpenAI client…
* Add OPENAI_PROXY_URL configuration and support for proxy in OpenAIInferenceClient
* docs: add OPENAI_PROXY_URL configuration for proxy support in OpenAI API requests
* format
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
rzxczxc 3 -0/+13
fix(tests): fix the asset upload tests Mohamed Bassem 4 -21/+58
fix: reject spoofed content types on uploads Mohamed Bassem 3 -1/+73
deps: upgrade tesseract to v7 Mohamed Bassem 2 -16/+10
feat(landing): announce cloud public beta in landing page Mohamed Bassem 1 -2/+32
chore: add a tool for comparing perf of different models Mohamed Bassem 14 -12/+895
feat: add notes to the bookmark edit dialog Mohamed Bassem 1 -0/+21
fix(restate): change journal retention for services to 3d Mohamed Bassem 1 -0/+3
fix(cli): migrate bookmark source in migration command Mohamed Bassem 1 -0/+1
fix: preserve failure count when rescheduling rate limited domains (#2303)
* fix: preserve retry count when rate-limited jobs are rescheduled
Previously, when a domain was rate-limited in the crawler worker,
the job would be re-enqueued as a new job, which reset the failure
count. This meant rate-limited jobs could retry indefinitely without
respecting the max retry limit.
This commit introduces a RateLimitRetryError exception that signals
the queue system to retry the job after a delay without counting it
as a failed attempt. The job is retried within the same invocation,
preserving the original retry count.
Changes:
- Add RateLimitRetryError class to shared/queueing.ts
- Update crawler worker to throw RateLimitRetryError instead of re-enqueuing
- Update Restate queue service to handle RateLimitRetryError with delay
- Update Liteque queue wrapper to handle RateLimitRetryError with delay
This ensures that rate-limited jobs respect the configured retry limits
while still allowing for delayed retries when domains are rate-limited.
* refactor: use liteque's native RetryAfterError for rate limiting
Instead of manually handling retries in a while loop, translate
RateLimitRetryError to liteque's native RetryAfterError. This is
cleaner and lets liteque handle the retry logic using its built-in
mechanism.
* test: add tests for RateLimitRetryError handling in restate queue
Added comprehensive tests to verify that:
1. RateLimitRetryError delays retry appropriately
2. Rate-limited retries don't count against the retry limit
3. Jobs can be rate-limited more times than the retry limit
4. Regular errors still respect the retry limit
These tests ensure the queue correctly handles rate limiting
without exhausting retry attempts.
* lint & format
* fix: prevent onError callback for RateLimitRetryError
Fixed two issues with RateLimitRetryError handling in restate queue:
1. RateLimitRetryError now doesn't trigger the onError callback since
   it's not a real error - it's an expected rate limiting behavior
2. Check for RateLimitRetryError in runWorkerLogic before calling onError,
   ensuring the instanceof check works correctly before the error gets
   further wrapped by restate
Updated tests to verify onError is not called for rate limit retries.
* fix: catch RateLimitRetryError before ctx.run wraps it
Changed approach to use a discriminated union instead of throwing
and catching RateLimitRetryError. Now we catch the error inside the
ctx.run callback before it gets wrapped by restate's TerminalError,
and return a RunResult type that indicates success, rate limit, or error.
This fixes the issue where instanceof checks would fail because
ctx.run wraps all errors in TerminalError.
* more fixes
* rename error name
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 5 -48/+184
feat: show bookmark owner icon in shared lists (#2277)
* feat: Add owner icon to bookmarks in shared lists
Display a small icon showing the bookmark owner's name and email on hover when viewing bookmarks from other users in shared lists. The icon appears in the top-right corner of bookmark cards across all layout types (grid, list, compact).
Changes:
- Add user field to ZBookmark type to include owner name and email
- Update bookmark queries to fetch user information via join
- Create BookmarkOwnerIcon component with tooltip showing owner details
- Integrate owner indicator into BookmarkLayoutAdaptingCard for all layouts
- Only show icon for bookmarks not owned by current user
* use icons in more places
* remove tooltip providers
* fix non list context
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 8 -46/+171
fix: make avatars public Mohamed Bassem 1 -0/+5
refactor: move assets to their own model (#2301)
* refactor: move assets to their own model
* move asset privacy checks to the model
Mohamed Bassem 4 -196/+274
feat: add support for user avatars (#2296)
* feat: add support for user avatars
* more fixes
* more fixes
* more fixes
* more fixes
Mohamed Bassem 20 -5/+610
fix: handle empty folder names in HTML bookmark imports (#2300)
When importing bookmarks from an HTML file, empty H3 tags (folder names)
are now replaced with "Unnamed" to prevent import failures.
Fixes #2299
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
Mohamed Bassem 2 -1/+85
feat: add a warning about viewing archives inline. fixes #2286 Mohamed Bassem 3 -1/+33
fix(tests): fix the user setting tests Mohamed Bassem 1 -0/+12
feat: Add user settings to disable auto tagging/summarization (#2275)
* feat: Add per-user settings to disable auto-tagging and auto-summarization
This commit adds user-level controls for AI features when they are enabled
on the server. Users can now toggle auto-tagging and auto-summarization
on/off from the AI Settings page.
Changes:
- Added autoTaggingEnabled and autoSummarizationEnabled fields to user table
- Updated user settings schemas and API endpoints to handle new fields
- Modified inference workers to check user preferences before processing
- Added toggle switches to AI Settings page (only visible when server has features enabled)
- Generated database migration for new fields
- Exposed enableAutoTagging and enableAutoSummarization in client config
The settings default to null (use server default). When explicitly set to false,
the user's bookmarks will skip the respective AI processing.
* revert migration
* i18n
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 13 -1/+3178
feat(mobile): Convert server address editing to modal in mobile app (#2290)
* feat: Convert server address editing to modal in mobile app
Changed the server address editing experience from an inline button to a modal dialog. This improves UX by forcing users to explicitly save or cancel their changes rather than forgetting to click a save button.
Changes:
- Created ServerAddressModal component following the CustomHeadersModal pattern
- Updated signin page to use the modal instead of inline editing
- Enhanced settings page to allow changing server address (was previously read-only)
- Added validation and error handling within the modal
- Made the settings page server address clickable with visual feedback
This resolves the issue where users forget to click the save button after editing the server address.
* refactor: Convert server address to screen modal
Changed from React Native Modal to Expo Router screen modal presentation.
This provides a better native experience with proper navigation stack integration.
Changes:
- Created server-address.tsx as a screen route with modal presentation
- Registered the route in root _layout.tsx
- Updated signin.tsx to navigate to the screen modal instead of opening RN modal
- Reverted settings page to original (no server address editing from settings)
- Removed ServerAddressModal component (no longer needed)
Benefits:
- Native modal presentation with proper animations
- Better integration with the navigation stack
- Cleaner separation of concerns
* merge the custom headers inside the server-add screen
* fix the look of the address UI
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 3 -84/+257
fix: check quota usage instead bookmark transaction Mohamed Bassem 2 -126/+133
fix: optimize tagging db queries (#2287)
* fix: optimize tagging db queries
* review
* parallel queries
* refactoring
Mohamed Bassem 7 -105/+3230
docs: shuffle some docs around Mohamed Bassem 12 -310/+310
docs: add RSS feeds integration documentation (#2288)
* docs: add RSS feeds integration documentation
Add detailed documentation for RSS feed integration covering:
- Publishing lists as RSS feeds with authentication tokens
- Consuming external RSS feeds with automatic bookmark creation
- Feed scheduling and management features
- Configuration options and troubleshooting guides
- API access and best practices
* changes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 1 -0/+50
feat(restate): Add a var to control whether to expose core services or not Mohamed Bassem 2 -2/+11
feat: add more restate semaphore controls Mohamed Bassem 1 -57/+97
feat(mobile): Show shared lists under a subsection Mohamed Bassem 1 -8/+66
fix(mobile): Fix title line clamp to 2 lines Mohamed Bassem 1 -4/+9
fix(mobile): Add loading spinner to mobile list button (#2283)
* fix: add loading spinner to manage lists buttons in mobile app
Adds visual feedback when adding/removing bookmarks from lists on the
manage lists page. The checkbox is replaced with an ActivityIndicator
while the operation is in progress, preventing multiple taps and
improving UX when the server is slow.
Changes:
- Track isPending and variables from add/remove mutations
- Add isListLoading helper to check if a specific list is loading
- Show ActivityIndicator instead of Checkbox during operations
- Disable Pressable interaction while loading
* fix: add loading spinner to manage tags page in mobile app
Adds visual feedback when adding/removing tags on the manage tags page.
A spinner appears on the specific tag being modified, replacing the
check/plus icon during the network request. Only the tag being modified
is disabled and dimmed to prevent multiple taps.
Changes:
- Track isPending and variables from updateTags mutation
- Add isTagLoading helper to check if a specific tag is loading
- Show ActivityIndicator on the specific tag being modified
- Only disable the tag item that's loading
* revert the change in the tags
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 1 -25/+51
feat: add server version display to mobile app settings (#2276)
- Created useServerVersion hook to fetch server version from /api/version
- Display both app version (from expo-constants) and server version
- Added version info at the bottom of settings page
- Server version shows loading state and handles errors gracefully
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 2 -0/+43
fix: add authentication checks to settings layout (#2274)
The settings layout was missing authentication checks, causing server
errors when unauthenticated users tried to access any settings page.
This fix adds:
- Session verification via getServerAuthSession()
- Redirect to "/" if no session exists
- Proper error handling with tryCatch wrapper
- Redirect to "/logout" for NOT_FOUND or UNAUTHORIZED errors
This brings the settings layout in line with the auth patterns used
in dashboard, admin, and reader layouts.
Fixes #2242
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 1 -2/+24
fix: only trigger search autocomplete on first search char Mohamed Bassem 2 -2/+9
feat(landing): remove waitlist link. fixes #2270 Mohamed Bassem 2 -5/+5
fix: don't fail the script if the user karakeep already exists. fixes #2242 Mohamed Bassem 1 -2/+6
fix: collapse reader settings by default Mohamed Bassem 1 -186/+209
docs: Add icons beside category names Mohamed Bassem 11 -13/+13
Revert "fix: fix restate service to return control to restate service on…
This reverts commit 6db14ac492cd5d9e26d0d986513771f14faa7fd0.
Mohamed Bassem 2 -21/+1
feat: Add unified reader settings with local overrides (#2230)
* Add initial impl
* fix some format inconsistencies, add indicator in user settings when local is out of sync
* Fix sliders in user settings, unify constants and formatting
* address CodeRabbit suggestions
* add mobile implementation
* address coderabbit nitpicks
* fix responsiveness of the reader settings popover
* Move more of the web UI strings to i18n
* update translations for more coverage
* remove duplicate logic/definitions
* fix android font family
* add shared reading setting hook between web and mobile
* unify reader settings context for both web and mobile
* remove unused export
* address coderabbit suggestions
* fix tests
Evan Simkowitz 30 -199/+4866
fix: fix restate service to return control to restate service on timeout Mohamed Bassem 2 -1/+21
fix: non-link bookmarks where stuck in pending summarization. Fixes #1605 Mohamed Bassem 4 -0/+2959
fix: move trpc error logging inside the dev check Mohamed Bassem 1 -1/+1
fix: Fix Amazon product image extraction on amazon.com URLs (#2108)
The metascraper-amazon package extracts the first .a-dynamic-image
element, which on amazon.com is often the Prime logo instead of the
product image. This works fine on amazon.co.uk where the product
image appears first in the DOM.
Created a custom metascraper plugin that uses more specific selectors
(#landingImage, #imgTagWrapperId, #imageBlock) to target the actual
product image. By placing this plugin before metascraperAmazon() in
the chain, we fix image extraction while preserving all other Amazon
metadata (title, brand, description).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
Randall Hand 2 -0/+79
feat: use reddit API for metadata extraction. Fixes #1853 #1883 Mohamed Bassem 4 -33/+346
fix: use GET requests for the content type request Mohamed Bassem 1 -1/+1
docs: fix sidebar on mobile Mohamed Bassem 1 -4/+2
feat: Add limits on number of rss feeds and webhooks per user Mohamed Bassem 6 -4/+218
release(cli): Bump CLI version to 0.29.1 Mohamed Bassem 1 -1/+1
readme: some readme updates Mohamed Bassem 1 -4/+12
docs: Update screenshots in docs Mohamed Bassem 7 -5/+1
docs: Adding user guides Mohamed Bassem 24 -186/+329
docs: drop docs for old versions Mohamed Bassem 342 -22139/+1
docs: restructure the docs Mohamed Bassem 61 -1425/+1676
docs: restyle the docs Mohamed Bassem 2 -66/+788
ci: run CI with node 24 Mohamed Bassem 1 -1/+2
deps: Upgrade to nodejs 24 Mohamed Bassem 6 -113/+125
fix!: changing default for includeContent to be false in the API Mohamed Bassem 1 -2/+1
deps: Upgrade nextjs to 15.3.8 Mohamed Bassem 2 -22/+22
deps: Upgrade nextjs to 15.3.7 Mohamed Bassem 2 -22/+22
fix: add more indicies for faster bookmark queries (#2246) Mohamed Bassem 5 -117/+3129
feat: make asset preprocessing worker timeout configurable
- Added ASSET_PREPROCESSING_JOB_TIMEOUT_SEC environment variable with default of 60 seconds (increased from hardcoded 30 seconds)
- Updated worker to use the configurable timeout from serverConfig
- Added documentation for the new configuration option
Claude 3 -1/+4
fix: Add cache control header on asset endpoints Mohamed Bassem 1 -0/+1
chore: Allowing multi user benchmarks and adding more coverage Mohamed Bassem 3 -31/+157
feat(cli): Add ability to list users for the admin in the CLI Mohamed Bassem 2 -0/+91
fix: fix correctly accounting for text bookmark in import sessions. #2208 Mohamed Bassem 2 -16/+58
fix: check import quota before importing bookmarks (#2232)
* feat: check import quota before importing bookmarks
Add quota validation before bookmark import to prevent users from
exceeding their bookmark limits. The implementation includes:
- New QuotaService.canImportBookmarks() method to check if user can import N bookmarks
- New tRPC checkImportQuota procedure for client-side quota validation
- Updated useBookmarkImport hook to parse files and check quota before import
- Added error banner in ImportExport component to display quota errors
- Optimized file parsing to avoid reading the file twice
The quota check displays remaining bookmarks and provides clear error
messages when the import would exceed the user's quota.
* fix
* some fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 3 -3/+54
build: fix typecheck error in query explainer Mohamed Bassem 1 -0/+10
fix: migrate to metascraper-x from metascraper-twitter Mohamed Bassem 3 -297/+16
feat: add is:broken search qualifier for broken links (#2225)
Add a new search qualifier `is:broken` that allows users to filter bookmarks
with broken or failed links. This matches the functionality on the broken links
settings page, where a link is considered broken if:
- crawlStatus is "failure"
- crawlStatusCode is less than 200
- crawlStatusCode is greater than 299
The qualifier supports negation with `-is:broken` to find working links.
Changes:
- Add brokenLinks matcher type definition
- Update search query parser to handle is:broken qualifier
- Implement query execution logic for broken links filtering
- Add autocomplete support with translations
- Add parser tests
- Update search query language documentation
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 7 -0/+60
feat: spread feed fetch scheduling deterministically over the hour (#2227)
Previously, all RSS feeds were fetched at the top of each hour (minute 0),
which could cause load spikes. This change spreads feed fetches evenly
throughout the hour using a deterministic hash of the feed ID.
Each feed is assigned a target minute (0-59) based on its ID hash, ensuring
consistent scheduling across restarts while distributing the load evenly.
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 1 -0/+31
fix: better extraction for youtube thumbnails. #2204 Mohamed Bassem 3 -18/+241
fix: remove queue triggers outside of updateTags transaction Mohamed Bassem 1 -15/+19
chore: add benchmarks (#2229)
* chore: add benchmarks
* upgrade deps
* fixes
* lint
Mohamed Bassem 15 -0/+789
build: dont update latest tags on release Mohamed Bassem 1 -8/+19
deps: Upgrade nextjs to 15.3.6 Mohamed Bassem 2 -55/+55
feat: add a notification badge for list invitations Mohamed Bassem 2 -0/+27
docs: add karakeep integration for Home Assistant (#2196)
* Update 13-community-projects.md
Add Karakeep integration for Home Assistant
* Update docs/docs/13-community-projects.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update docs/docs/13-community-projects.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update 13-community-projects.md
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Flo 1 -0/+8
fix: regen turnstile token on signup resubmission Mohamed Bassem 1 -1/+14
feat(landing): Add more features to the homepage Mohamed Bassem 1 -8/+47
ci: run arm docker image builds on arm machines Mohamed Bassem 1 -3/+3
ci: parallelize the docker workflow for platforms Mohamed Bassem 1 -23/+112
fix: reenable idempotency key for search indexing Mohamed Bassem 1 -2/+1
fix: fix bypass email verification in apiKey.exchange Mohamed Bassem 2 -0/+56
readme: add collaborative lists to the list of features Mohamed Bassem 1 -0/+1
fix: Add restate queued idempotency (#2169)
* fix: Add restate queued idempotency
* return on failed to acquire
Mohamed Bassem 4 -5/+65
feat: add support for turnstile on signup Mohamed Bassem 8 -0/+165
build: fix npm trusted publishing Mohamed Bassem 3 -3/+12
release: cli, mcp and sdk Mohamed Bassem 3 -3/+3
release(extension): Release version 1.2.8 Mohamed Bassem 1 -1/+1
release(mobile): Bump mobile version to 1.8.3 Mohamed Bassem 1 -3/+3
release(docs): release the 0.29 docs Mohamed Bassem 103 -30/+6020
prevnext