aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* feat: change default for tag style to be title case with spacesMohamed Bassem2025-12-304-1/+3030
|
* fix: more tagging tweaksMohamed Bassem2025-12-291-4/+3
|
* build: fix broken CIMohamed Bassem2025-12-291-12/+3
|
* fix: change prompt to better recognize error pagesMohamed Bassem2025-12-291-3/+6
|
* refactor: reduce duplication in compare-models toolMohamed Bassem2025-12-2910-193/+313
|
* chore: add tracing for email functionsMohamed Bassem2025-12-291-115/+109
|
* feat(mobile): create new list edit screen (#2310)sergio2025-12-293-2/+178
| | | | | | | | | | | | | | | | | | | | | | | | | | | * 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
* feat: Add open telemetry (#2318)Mohamed Bassem2025-12-2912-51/+687
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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>
* fix: reset tagging status on crawl failure (#2316)Mohamed Bassem2025-12-298-18/+3094
| | | | | | | * feat: add the ability to specify a different changelog version * fix: reset tagging status on crawl failure * fix missing crawlStatus in loadMulti
* feat: add the ability to specify a different changelog versionMohamed Bassem2025-12-293-19/+44
|
* fix: remove duplicate mobile backdrop button in reader view (#2234)Evan Simkowitz2025-12-291-14/+0
|
* fix(landing): fix cloud banner on mobileMohamed Bassem2025-12-291-4/+4
|
* refactor: add suspense boundary in sidebar layoutMohamed Bassem2025-12-298-175/+297
|
* feat(mobile): make the settings menu look more native (#2307)Mohamed Bassem2025-12-295-103/+234
| | | | | | | * feat(mobile): make the settings menu look more native * more fixes * review comments
* feat(web): better looking scrollbar in the sidebarMohamed Bassem2025-12-282-1/+27
|
* feat(mobile): use oled friendly colors for android app. fixes #1958Mohamed Bassem2025-12-283-164/+5
|
* refactor: migrate toasts to sonnerMohamed Bassem2025-12-2866-289/+150
|
* feat: add customizable tag styles (#2312)Mohamed Bassem2025-12-2718-136/+3895
| | | | | | | | | | | | | | | * feat: add customizable tag styles * add tag lang setting * ui settings cleanup * fix migration * change look of the field * more fixes * fix tests
* feat: add Matter import support (#2245)Moondragon852025-12-2734-0/+99
| | | | | | | | | | | * Matter import * use zod * fix date parsing --------- Co-authored-by: Mohamed Bassem <me@mbassem.com>
* feat: support archiving as pdf (#2309)Mohamed Bassem2025-12-2716-33/+290
| | | | | | | | | | | * feat: support archiving as pdf * add supprot for manually triggering pdf downloads * fix submenu * menu cleanup * fix store pdf
* feat: add OPENAI_PROXY_URL configuration and support for proxy in OpenAI ↵rzxczxc2025-12-273-0/+13
| | | | | | | | | | | | | client (#2231) * 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>
* fix(tests): fix the asset upload testsMohamed Bassem2025-12-274-21/+58
|
* fix: reject spoofed content types on uploadsMohamed Bassem2025-12-273-1/+73
|
* deps: upgrade tesseract to v7Mohamed Bassem2025-12-262-16/+10
|
* feat(landing): announce cloud public beta in landing pageMohamed Bassem2025-12-261-2/+32
|
* chore: add a tool for comparing perf of different modelsMohamed Bassem2025-12-2614-12/+895
|
* feat: add notes to the bookmark edit dialogMohamed Bassem2025-12-251-0/+21
|
* fix(restate): change journal retention for services to 3dMohamed Bassem2025-12-251-0/+3
|
* fix(cli): migrate bookmark source in migration commandMohamed Bassem2025-12-251-0/+1
|
* fix: preserve failure count when rescheduling rate limited domains (#2303)Mohamed Bassem2025-12-255-48/+184
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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>
* feat: show bookmark owner icon in shared lists (#2277)Mohamed Bassem2025-12-248-46/+171
| | | | | | | | | | | | | | | | | | | | | | * 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>
* fix: make avatars publicMohamed Bassem2025-12-241-0/+5
|
* refactor: move assets to their own model (#2301)Mohamed Bassem2025-12-244-196/+274
| | | | | * refactor: move assets to their own model * move asset privacy checks to the model
* feat: add support for user avatars (#2296)Mohamed Bassem2025-12-2420-5/+610
| | | | | | | | | | | * feat: add support for user avatars * more fixes * more fixes * more fixes * more fixes
* fix: handle empty folder names in HTML bookmark imports (#2300)Mohamed Bassem2025-12-242-1/+85
| | | | | | | | | 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>
* feat: add a warning about viewing archives inline. fixes #2286Mohamed Bassem2025-12-223-1/+33
|
* fix(tests): fix the user setting testsMohamed Bassem2025-12-221-0/+12
|
* feat: Add user settings to disable auto tagging/summarization (#2275)Mohamed Bassem2025-12-2213-1/+3178
| | | | | | | | | | | | | | | | | | | | | | | | | | * 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>
* feat(mobile): Convert server address editing to modal in mobile app (#2290)Mohamed Bassem2025-12-223-84/+257
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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>
* fix: check quota usage instead bookmark transactionMohamed Bassem2025-12-222-124/+131
|
* fix: optimize tagging db queries (#2287)Mohamed Bassem2025-12-227-105/+3230
| | | | | | | | | * fix: optimize tagging db queries * review * parallel queries * refactoring
* docs: shuffle some docs aroundMohamed Bassem2025-12-226-1/+1
|
* docs: add RSS feeds integration documentation (#2288)Mohamed Bassem2025-12-221-0/+50
| | | | | | | | | | | | | | | | * 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>
* feat(restate): Add a var to control whether to expose core services or notMohamed Bassem2025-12-212-2/+11
|
* feat: add more restate semaphore controlsMohamed Bassem2025-12-201-55/+95
|
* feat(mobile): Show shared lists under a subsectionMohamed Bassem2025-12-201-8/+66
|
* fix(mobile): Fix title line clamp to 2 linesMohamed Bassem2025-12-201-4/+9
|
* fix(mobile): Add loading spinner to mobile list button (#2283)Mohamed Bassem2025-12-201-25/+51
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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>
* feat: add server version display to mobile app settings (#2276)Mohamed Bassem2025-12-202-0/+43
| | | | | | | | - 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>
* fix: add authentication checks to settings layout (#2274)Mohamed Bassem2025-12-201-2/+24
| | | | | | | | | | | | | | | | | 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>