Commit Graph

976 Commits

Author SHA1 Message Date
Sweepy
2a6fe6e6fa fix: stop theme flashes with cloudflare rocket loader (#2340) 2026-01-03 19:22:29 +00:00
Mohamed Bassem
e195f40b14 feat: Add retry buttons for pending bookmarks in admin panel (#2341) 2026-01-03 19:21:49 +00:00
Mohamed Bassem
1af9b9ddf6 chore: add a note about hostname allowlists in the validation error message 2026-01-02 23:50:43 +00:00
Mohamed Bassem
0250d163a4 fix(mobile): fix the connection debug text area 2026-01-02 22:35:27 +00:00
Mohamed Bassem
0e1d28a595 fix(mobile): fix save button in server-address screen on android 2026-01-02 22:24:52 +00:00
Mohamed Bassem
016433d482 feat(mobile): use react native sonner 2026-01-01 14:35:04 +00:00
Mohamed Bassem
2b89f1777e release(cli,sdk): release cli and sdk v0.30 2026-01-01 14:18:24 +00:00
Mohamed Bassem
b63f133e48 release(mobile): Bump mobile version to 1.8.4 2026-01-01 11:19:34 +00:00
Mohamed Bassem
d472a3a1c4 i18n: fix en_US translation 2026-01-01 10:27:23 +00:00
Hosted Weblate
401ea6a917 i18n: Sync weblate translations
Co-authored-by: OpenAI <noreply-mt-openai@weblate.org>
Co-authored-by: killallpie <killallpie@inbox.ru>
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ar/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/cs/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/da/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/de/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/el/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/en_US/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/es/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/fa/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/fi/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/fr/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ga/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/gl/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/hr/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/hu/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/it/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ja/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ko/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/nl/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/pl/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/pt/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/ru/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/sk/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/sl/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/sv/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/tr/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/uk/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/vi/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/karakeep/karakeep/zh_Hant/
Translation: Karakeep/Karakeep
2026-01-01 10:36:42 +01:00
Mohamed Bassem
bf9d6105b8 chore: drop the experimental tag from the rule engine 2026-01-01 08:35:57 +00:00
Mohamed Bassem
9555f409be fix: show a toast during banner upload 2026-01-01 08:22:04 +00:00
Mohamed Bassem
3d652eee04 feat: add replace banner and attachment download (#2328)
* feat: add replace banner and attachment download

* add pdf preview in mobile app

* fix menu order

* fix comment
2026-01-01 08:01:43 +00:00
Mohamed Bassem
7a76216e5c feat: Add bulk remove from list (#2279)
* feat: Add bulk remove from list action in list context

- Add "Remove from List" button in bulk actions menu
- Only visible when in a manual list context with editor/owner role
- Includes confirmation dialog before removal
- Uses same concurrency pattern as bulk add (50 concurrent operations)
- Displays success count in toast notification
- Add translation key "actions.remove" for consistency

This complements the existing bulk add to list functionality and allows
users to efficiently remove multiple bookmarks from a list at once.

* fmt

* fix list context

* add remove from list

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-30 11:30:35 +00:00
Mohamed Bassem
b20ba9cfcc feat: add "URL Does Not Contain" condition to rule engine (#2280)
* feat: add "URL Does Not Contain" condition to rule engine

Add a new condition type `urlDoesNotContain` that allows users to create
rules based on URLs that do NOT contain specific strings. This enables
more flexible rule configurations, such as:

- Automatically adding bookmarks to a "Read Later" list if the URL
  does not contain "reddit.com" or "youtube.com"

Changes:
- Added `urlDoesNotContain` condition type to Zod schema
- Implemented evaluation logic in RuleEngine
- Added UI support in ConditionBuilder component
- Added translation key for new condition type
- Added test coverage for the new condition

Fixes #2259

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Mohamed Bassem <MohamedBassem@users.noreply.github.com>

* fix type link

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
2025-12-30 11:29:03 +00:00
Mohamed Bassem
a0b4a26ad3 feat: 2025 wrapped (#2322)
* feat: 2025 wrapped

* don't add wrapped for new users
2025-12-30 10:52:50 +00:00
Mohamed Bassem
7ab7db8e48 chore: worker tracing (#2321) 2025-12-30 10:43:08 +00:00
Mohamed Bassem
d852ee1a69 feat(landing): add corporate pricing 2025-12-30 09:41:52 +00:00
sergio
a43d375f55 fix(mobile): mobile modal UI issues (#2320)
* fix(mobile): Make list type selector visible on Android

* fix(mobile): Add native iOS overlay on Toast
2025-12-30 09:07:22 +00:00
sergio
30fa06feac feat(mobile): create new list edit screen (#2310)
* feat(mobile): create new edit screen and path

* refactor(mobile): use correct import for back navigation

* refactor(mobile): remove set state for list type

* feat(mobile): handle loading state

* feat(mobile): add error handling

* feat(mobile): add local validation for empty list name

* refactor(mobile): use correct param name in edit path

* feat(mobile): handle all pending state cases

* refactor(mobile): remove unnecessary return

* refactor(mobile): move type validation to top of the file

* refactor(mobile): revert validation order

* refactor(mobile): clean up submit values

* fix(mobile): fix button views
2025-12-29 21:45:36 +00:00
Mohamed Bassem
5537fe85ed feat: Add open telemetry (#2318)
* feat: add OpenTelemetry tracing infrastructure

Introduce distributed tracing capabilities using OpenTelemetry:

- Add @opentelemetry packages to shared-server for tracing
- Create tracing utility module with span helpers (withSpan, addSpanEvent, etc.)
- Add tRPC middleware for automatic span creation on API calls
- Initialize tracing in API and workers entry points
- Add demo instrumentation to bookmark creation and crawler worker
- Add configuration options (OTEL_TRACING_ENABLED, OTEL_EXPORTER_OTLP_ENDPOINT, etc.)
- Document tracing configuration in environment variables docs

When enabled, traces are collected for tRPC calls, bookmark creation flow,
and crawler operations, with support for any OTLP-compatible backend (Jaeger, Tempo, etc.)

* refactor: remove tracing from workers for now

Keep tracing infrastructure but remove worker instrumentation:
- Remove tracing initialization from workers entry point
- Remove tracing instrumentation from crawler worker
- Fix formatting in tracing files

The tracing infrastructure remains available for future use.

* add hono and next tracing

* remove extra span logging

* more fixes

* update config

* some fixes

* upgrade packages

* remove unneeded packages

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-29 17:11:16 +00:00
Mohamed Bassem
f7920bdc94 fix: reset tagging status on crawl failure (#2316)
* feat: add the ability to specify a different changelog version

* fix: reset tagging status on crawl failure

* fix missing crawlStatus in loadMulti
2025-12-29 11:26:38 +00:00
Mohamed Bassem
1082076133 feat: add the ability to specify a different changelog version 2025-12-29 11:12:46 +00:00
Evan Simkowitz
3f44e3198c fix: remove duplicate mobile backdrop button in reader view (#2234) 2025-12-29 10:58:41 +00:00
Mohamed Bassem
23f285300a fix(landing): fix cloud banner on mobile 2025-12-29 09:10:05 +00:00
Mohamed Bassem
3c3d86855c refactor: add suspense boundary in sidebar layout 2025-12-29 08:56:45 +00:00
Mohamed Bassem
6ee48ffb9d feat(mobile): make the settings menu look more native (#2307)
* feat(mobile): make the settings menu look more native

* more fixes

* review comments
2025-12-29 08:23:36 +00:00
Mohamed Bassem
f7523a210b feat(web): better looking scrollbar in the sidebar 2025-12-28 08:59:37 +00:00
Mohamed Bassem
e800d744b5 feat(mobile): use oled friendly colors for android app. fixes #1958 2025-12-28 08:48:22 +00:00
Mohamed Bassem
173fb99aed refactor: migrate toasts to sonner 2025-12-28 08:32:32 +00:00
Mohamed Bassem
af3010abaa 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
2025-12-27 14:30:11 +00:00
Moondragon85
93630ce88d feat: add Matter import support (#2245)
* Matter import

* use zod

* fix date parsing

---------

Co-authored-by: Mohamed Bassem <me@mbassem.com>
2025-12-27 11:52:37 +00:00
Mohamed Bassem
267db79129 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
2025-12-27 09:59:39 +00:00
Mohamed Bassem
347793ada2 deps: upgrade tesseract to v7 2025-12-26 23:59:52 +00:00
Mohamed Bassem
c3b2326c58 feat(landing): announce cloud public beta in landing page 2025-12-26 23:24:38 +00:00
Mohamed Bassem
ecb7a710ca feat: add notes to the bookmark edit dialog 2025-12-25 20:23:48 +00:00
Mohamed Bassem
65cfa87107 fix(cli): migrate bookmark source in migration command 2025-12-25 13:01:57 +00:00
Mohamed Bassem
ddd4b578cd 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>
2025-12-25 12:46:45 +00:00
Mohamed Bassem
ef27670f5c 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>
2025-12-24 13:15:46 +00:00
Mohamed Bassem
314c363e5c feat: add support for user avatars (#2296)
* feat: add support for user avatars

* more fixes

* more fixes

* more fixes

* more fixes
2025-12-24 10:18:08 +00:00
Mohamed Bassem
e336513fad feat: add a warning about viewing archives inline. fixes #2286 2025-12-22 17:40:41 +00:00
Mohamed Bassem
0bdba54ba2 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>
2025-12-22 14:59:04 +00:00
Mohamed Bassem
ece68ed078 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>
2025-12-22 14:36:23 +00:00
Mohamed Bassem
e18dc4c93e fix: optimize tagging db queries (#2287)
* fix: optimize tagging db queries

* review

* parallel queries

* refactoring
2025-12-22 13:52:46 +00:00
Mohamed Bassem
837dea5e1b feat(mobile): Show shared lists under a subsection 2025-12-20 12:37:53 +00:00
Mohamed Bassem
15cfa1379a fix(mobile): Fix title line clamp to 2 lines 2025-12-20 12:37:53 +00:00
Mohamed Bassem
7b98c52af8 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>
2025-12-20 12:36:21 +00:00
Mohamed Bassem
bd969b34d7 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>
2025-12-20 12:29:54 +00:00
Mohamed Bassem
e53f3ae528 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>
2025-12-20 11:11:46 +00:00
Mohamed Bassem
92e352f3f6 fix: only trigger search autocomplete on first search char 2025-12-20 10:43:21 +00:00