rcgit

/ karakeep
follow (on) | order: default date topo
Age Commit message Author Files +/-
feat: Add notes feature to highlights (#2154)
* feat: Add note-taking functionality to highlights
This commit adds the ability to add and edit notes on highlights, allowing users to capture their thoughts alongside highlighted text.
Changes:
- Updated zUpdateHighlightSchema to include optional note field
- Modified Highlight.update() method to persist notes to database
- Added note button (MessageSquare icon) beside color picker in highlight menu
- Implemented note dialog with textarea for adding/editing notes
- Updated Highlight interface to include optional note field
- Modified ReaderView to pass notes through create and update operations
- Enhanced HighlightCard to display notes below highlighted text
The note button appears alongside the color picker for both new and existing highlights. Notes are displayed in a smaller, muted font below the highlighted text in the HighlightCard component.
* refactor: Convert highlight UI to inline form
Changed the highlight creation/editing interface from a modal dialog to an inline form for a more streamlined user experience.
Changes:
- Replaced ColorPickerMenu and Dialog with a unified HighlightForm component
- Form now displays color selector and note textarea together inline
- Added labels for "Color" and "Note" sections
- Textarea is now optional and inline (placeholder: "Add a note (optional)...")
- Consolidated Save and Cancel buttons in the form
- Delete button appears only for existing highlights
- Removed MessageSquare icon - notes are now always visible in the form
- Simplified state management by removing separate dialog state
The form appears in a popover when text is selected or an existing highlight is clicked, showing both color options and note input in a single 320px wide form.
* fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 6 -48/+111
feat: Add search bar to highlights page (#2155)
* feat: Add search bar to All highlights page
This commit adds a search bar to the "All highlights page" that allows users to search their highlights by text content or notes.
Changes:
- Added search method to Highlight model with SQL LIKE query on text and note fields
- Added search endpoint to highlights router with pagination support
- Updated AllHighlights component to include search input with debouncing
- Search input includes clear button and search icon
- Maintains existing infinite scroll pagination for search results
Technical details:
- Uses SQL ilike for case-insensitive search
- 300ms debounce to reduce API calls
- Conditionally uses search or getAll endpoint based on search query
* fix db query
* small fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 3 -41/+156
fix: hide collaborator emails from non-owners (#2160)
* feat: Hide collaborator emails from non-owners in shared lists
Implemented privacy protection for collaborator emails in shared lists.
Non-owners (viewers and editors) can no longer see email addresses of
the list owner or other collaborators. Only the list owner can view
all email addresses.
Changes:
- Modified List.getCollaborators() to return empty strings for emails
  when the requester is not the owner
- Updated ManageCollaboratorsModal UI to conditionally display email
  fields only when they are not empty
- Added comprehensive test to verify email privacy for non-owners while
  ensuring owners can still see all emails
This follows existing privacy patterns in the codebase (similar to how
pending invitation names are masked as "Pending User").
* make the email field nullable
* fix tests
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 4 -10/+109
feat: Add invitation approval for shared lists (#2152)
* feat: Add invitation approval system for collaborative lists
- Add database schema changes to support pending invitations
  - Add status field (pending/accepted/declined) to listCollaborators
  - Add invitedAt and invitedEmail fields for tracking
  - Add index on status for efficient queries
- Update List model with invitation workflow methods
  - Modify addCollaboratorByEmail to create pending invitations
  - Add acceptInvitation() for users to accept invites
  - Add declineInvitation() for users to decline invites
  - Add revokeInvitation() for owners to revoke pending invites
  - Add getPendingInvitations() to get user's pending invites
- Implement privacy protection for pending invitations
  - Mask user names as "Pending User" until invitation is accepted
  - Only show email to list owner for pending invitations
- Update getSharedWithUser to only include accepted collaborations
  - Ensures lists only appear after invitation is accepted
* feat: Add tRPC procedures and email notifications for list invitations
- Add new tRPC procedures for invitation workflow
  - acceptInvitation: Allow users to accept pending invitations
  - declineInvitation: Allow users to decline invitations
  - revokeInvitation: Allow owners to revoke pending invitations
  - getPendingInvitations: Get all pending invitations for current user
- Update getCollaborators output schema
  - Add status, invitedAt fields to collaborator objects
  - Support privacy-masked user info for pending invitations
- Add sendListInvitationEmail function
  - Email notification when user is invited to collaborate
  - Includes list name, inviter name, and link to view invitation
  - Gracefully handles missing SMTP configuration
- Integrate email sending into invitation workflow
  - Send email when new invitation is created
  - Send email when declined invitation is renewed
  - Catch and log errors without failing the invitation
* feat: Add UI for list invitation approval workflow
- Update ManageCollaboratorsModal to support pending invitations
  - Show "Pending" badge for pending invitations
  - Add revoke button for owners to cancel pending invitations
  - Update success message to reflect invitation sent
  - Disable role change and remove buttons for pending invitations
- Create PendingInvitationsCard component
  - Display all pending invitations for the current user
  - Show list name, description, inviter, and role
  - Provide Accept and Decline buttons
  - Auto-hide when no pending invitations exist
- Add PendingInvitationsCard to lists page
  - Show at the top of the lists page
  - Only renders when user has pending invitations
* fix: Add missing translation keys and fix TypeScript errors
- Add translation keys for invitation system
  - lists.collaborators.invitation_sent
  - lists.collaborators.pending
  - lists.collaborators.revoke
  - lists.collaborators.invitation_revoked
  - lists.collaborators.failed_to_revoke
  - lists.invitations.* (all invitation-related keys)
- Fix TypeScript errors in email sending
  - Handle optional user.name with fallback to 'A user'
* wip
* fixes
* more fixes
* fix revoke
* more improvements
* comment fix
* fix email url
* fix schemas
* split pending invites into components
* more fixes
* test
* test fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 13 -346/+4874
fix: drop journal retention for sempahore and id providers Mohamed Bassem 2 -0/+2
refactor: remove the PrivacyAware interface Mohamed Bassem 10 -104/+9
feat: Add collaborative lists (#2146)
* feat: Add collaborative lists backend implementation
This commit implements the core backend functionality for collaborative
lists, allowing multiple users to share and interact with bookmark lists.
Database changes:
- Add listCollaborators table to track users with access to lists and
  their roles (viewer/editor)
- Add addedBy field to bookmarksInLists to track who added bookmarks
- Add relations for collaborative list functionality
Access control updates:
- Update List model to support role-based access (owner/editor/viewer)
- Add methods to check and enforce permissions for list operations
- Update Bookmark model to allow access through collaborative lists
- Modify bookmark queries to include bookmarks from collaborative lists
List collaboration features:
- Add/remove/update collaborators
- Get list of collaborators
- Get lists shared with current user
- Only manual lists can have collaborators
tRPC procedures:
- addCollaborator: Add a user as a collaborator to a list
- removeCollaborator: Remove a collaborator from a list
- updateCollaboratorRole: Change a collaborator's role
- getCollaborators: Get all collaborators for a list
- getSharedWithMe: Get all lists shared with the current user
- cloneBookmark: Clone a bookmark to the current user's collection
Implementation notes:
- Editors can add/remove bookmarks from the list (must own the bookmark)
- Viewers can only view bookmarks in the list
- Only the list owner can manage collaborators and list metadata
- Smart lists cannot have collaborators (only manual lists)
- Users cannot edit bookmarks they don't own, even in shared lists
* feat: Add collaborative lists frontend UI
This commit implements the frontend user interface for collaborative lists,
allowing users to view shared bookmarks and manage list collaborators.
New pages:
- /dashboard/shared: Shows bookmarks from lists shared with the user
  - Displays bookmarks from all collaborative lists
  - Uses SharedBookmarks component
  - Shows empty state when no lists are shared
Navigation:
- Added "Shared with you" link to sidebar with Users icon
- Positioned after "Home" in main navigation
- Available in both desktop and mobile sidebar
Collaborator management:
- ManageCollaboratorsModal component for managing list collaborators
  - Add collaborators by user ID with viewer/editor role
  - View current collaborators with their roles
  - Update collaborator roles inline
  - Remove collaborators
  - Shows empty state when no collaborators
- Integrated into ListOptions dropdown menu
- Accessible via "Manage Collaborators" menu item
Components created:
- SharedBookmarks.tsx: Server component fetching shared lists/bookmarks
- ManageCollaboratorsModal.tsx: Client component with tRPC mutations
- /dashboard/shared/page.tsx: Route for shared bookmarks page
UI features:
- Role selector for viewer/editor permissions
- Real-time collaborator list updates
- Toast notifications for success/error states
- Loading states for async operations
- Responsive design matching existing UI patterns
Implementation notes:
- Uses existing tRPC endpoints (getSharedWithMe, getCollaborators, etc.)
- Follows established modal patterns from ShareListModal
- Integrates seamlessly with existing list UI
- Currently uses user ID for adding collaborators (email lookup TBD)
* fix typecheck
* add collaborator by email
* add shared list in the sidebar
* fix perm issue
* hide UI components from non list owners
* list leaving
* fix shared bookmarks showing up in homepage
* fix getBookmark access check
* e2e tests
* hide user specific fields from shared lists
* simplify bookmark perm checks
* disable editable fields in bookmark preview
* hide lists if they don't have options
* fix list ownership
* fix highlights
* move tests to trpc
* fix alignment of leave list
* make tag lists unclickable
* allow editors to remove from list
* add a badge for shared lists
* remove bookmarks of user when they're removed from a list
* fix tests
* show owner in the manage collab modal
* fix hasCollab
* drop shared with you
* i18n
* beta badge
* correctly invalidate caches on collab change
* reduce unnecessary changes
* Add ratelimits
* stop manually removing bookmarks on remove
* some fixes
* fixes
* remove unused function
* improve tests
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 40 -596/+6705
deps: upgrade hono and playwright Mohamed Bassem 3 -153/+160
build: Improve docker caching (#2140)
* build: Improve docker caching
* more fixes
Mohamed Bassem 5 -10/+100
feat: import from mymind (#2138)
* feat: add mymind importer support
This commit adds support for importing bookmarks from mymind CSV exports.
Changes:
- Added mymind to ImportSource type in parsers.ts
- Implemented parseMymindBookmarkFile() to parse mymind CSV format
- Added mymind case to parseImportFile() switch statement
- Added mymind import card to ImportExport UI component
- Added English translation for mymind import description
- Added comprehensive test for mymind CSV parsing
The mymind CSV format includes:
- WebPages (URLs with optional notes)
- Notes (text content without URLs)
- Tags (comma-separated)
- Created timestamps (ISO format)
Fixes #654
* format
* use zod for parsing
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 4 -1/+163
fix(mobile): fix app memory page size compatibility (#2135)
* fix(mobile): Add 16KB memory page size support for Android
Updates to support Google Play's requirement for 16KB memory page sizes:
- Update Expo SDK from 53.0.11 to 53.0.19
- Update expo-image from 2.2.0 to 2.4.0
- Update React Native from 0.79.3 to 0.79.5
- Configure expo-build-properties with:
  - compileSdkVersion: 35
  - targetSdkVersion: 35
  - buildToolsVersion: 34.0.0
  - ndkVersion: 27.1.12297006 (r27 with 16KB support)
These changes ensure all native libraries are compiled with proper
alignment for 16KB page sizes as required by Android 15+ devices.
Fixes Google Play rejection: "Your app does not support 16 KB memory page sizes"
* some fixes
* more fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 4 -398/+351
feat: correct default prom metrics from web and worker containers Mohamed Bassem 2 -0/+2
fix: stop retrying indefinitely in restate queues Mohamed Bassem 1 -0/+9
feat: add crawler domain rate limiting (#2115) Mohamed Bassem 5 -32/+121
refactor: Allow runner functions to return results to onComplete Mohamed Bassem 8 -36/+32
refactor: Extract ratelimiter into separate plugin (#2112)
* refactor(trpc): extract rate limiter into dedicated plugin
Move the rate limiting middleware from the trpc package to the
centralized plugins package. This improves code organization by
consolidating all plugins in a single location.
Changes:
- Created packages/plugins/trpc-ratelimit/ plugin
- Moved rate limiter from packages/trpc/rateLimit.ts to
  packages/plugins/trpc-ratelimit/src/index.ts
- Added trpc-ratelimit export to plugins package.json
- Added @trpc/server dependency to plugins package
- Updated trpc package to import from @karakeep/plugins/trpc-ratelimit
- Added @karakeep/plugins dependency to trpc package
- Removed packages/trpc/plugins/ directory
* refactor(plugins): decouple rate limiter from tRPC
Refactor the rate limiting plugin to be framework-agnostic, allowing
it to be used outside of tRPC contexts. The plugin now has a generic
core with a tRPC-specific adapter.
Changes:
- Renamed trpc-ratelimit to ratelimit plugin
- Created generic RateLimiter class with framework-agnostic API
- Added checkRateLimit() method that returns allow/deny results
- Created separate tRPC adapter (src/trpc.ts) that uses the generic core
- Exported both generic (RateLimiter, globalRateLimiter) and
  tRPC-specific (createRateLimitMiddleware) APIs
- Updated trpc package to import from @karakeep/plugins/ratelimit
- Updated plugins package.json exports
Benefits:
- Rate limiter can now be used in any context (HTTP handlers, WebSocket, etc.)
- Cleaner separation of concerns
- Easy to create adapters for other frameworks
- Generic API allows for custom error handling
* refactor(plugins): integrate rate limiter with plugin registry
Refactor the rate limiting plugin to use the centralized plugin
system with PluginManager, making it consistent with other plugins
like queue and search providers.
Changes:
- Added RateLimit plugin type to PluginType enum
- Created RateLimitClient interface in packages/shared/ratelimiting.ts
- Created RateLimitProvider class implementing PluginProvider
- Updated plugin to auto-register with PluginManager on import
- Updated tRPC adapter to use getRateLimitClient() from PluginManager
- Added ratelimit plugin to loadAllPlugins() in shared-server
- Updated shared/plugins.ts with RateLimit type mapping
Benefits:
- Consistent plugin architecture across the codebase
- Rate limiter can be swapped with alternative implementations
- Centralized plugin management and logging
- Better separation of concerns
- Framework-agnostic core with tRPC adapter pattern
* refactor(trpc): move rate limit middleware to trpc package
Move the tRPC-specific rate limiting middleware from the plugins
package to the trpc package, making the plugins package
framework-agnostic.
Changes:
- Moved packages/plugins/ratelimit/src/trpc.ts to
  packages/trpc/lib/rateLimit.ts
- Updated packages/trpc/index.ts to import from local lib/rateLimit
- Removed tRPC export from packages/plugins/ratelimit/index.ts
- Removed @trpc/server dependency from packages/plugins/package.json
Benefits:
- plugins package is now framework-agnostic
- tRPC-specific code lives in the trpc package where it belongs
- Cleaner separation of concerns
- Rate limiter plugin can be used in any context without tRPC
* refactor(plugins): rename to ratelimit-memory and add tests
Rename the rate limiting plugin from "ratelimit" to "ratelimit-memory"
to better indicate it's an in-memory implementation. This naming leaves
room for future implementations like ratelimit-redis. Also added
comprehensive test coverage.
Changes:
- Renamed packages/plugins/ratelimit to ratelimit-memory
- Updated package.json export from ./ratelimit to ./ratelimit-memory
- Updated shared-server to import @karakeep/plugins/ratelimit-memory
- Added comprehensive unit tests (index.test.ts):
  - Rate limit enforcement tests
  - Window expiration tests
  - Identifier and path isolation tests
  - Reset functionality tests
  - Cleanup mechanism tests
- Added provider integration tests (provider.test.ts):
  - PluginProvider interface compliance
  - Client singleton behavior
  - End-to-end rate limiting functionality
Benefits:
- More descriptive plugin name indicating the storage mechanism
- Better test coverage ensuring reliability
- Easier to add alternative implementations (Redis, etc.)
* change the api to only take the key
* move the serverConfig check to the trpc
* fix lockfile
* get rid of the timer
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 12 -75/+451
feat: Add bookmark sources statistics section (#2110)
* feat: add bookmark sources statistics to usage stats page
Add a new section to the usage statistics page that displays stats about
bookmark sources (mobile, extension, web, API, CLI, etc).
Changes:
- Add bookmarksBySource field to user stats response schema
- Implement backend query to fetch bookmarks grouped by source
- Add new "Bookmark Sources" card to stats page UI
- Add helper function to format source names for display
* refactor: use stricter enum type for bookmark sources in stats API
Replace generic string type with zBookmarkSourceSchema enum for better
type safety and autocomplete. This ensures the API contract matches the
database schema definition.
Changes:
- Import and use zBookmarkSourceSchema in user stats response
- Define BookmarkSource type alias in frontend
- Update formatSourceName to use stricter type and return non-nullable
- Remove fallback case since all enum values are now handled
* refactor: use shared BookmarkSource type and add i18n support
- Replace local BookmarkSource type with canonical type from shared package
  using z.infer<typeof zBookmarkSourceSchema>
- Add translation support for "Bookmark Sources" title and empty state
- Add bookmark_sources.title and bookmark_sources.empty keys to English
  locale file
This ensures type consistency across the codebase and prepares for
future localization of the bookmark sources feature.
* fix icons
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 5 -1/+146
tests: fix crawling and search e2e tests (#2105)
* tests: Attempt to fix flaky tests
* fix internal address
* fix assets tests
Mohamed Bassem 8 -42/+114
feat(mobile): add custom headers configuration in sign-in screen (#2103)
* feat(mobile): add custom headers configuration in sign-in screen
Add ability for mobile app users to configure custom HTTP headers that are
sent with every API request. This enables users to add authentication headers,
proxy headers, or other custom headers required by their server setup.
Changes:
- Add customHeaders field to mobile app settings schema
- Create CustomHeadersModal component for managing headers
- Update sign-in screen with link to configure custom headers
- Modify tRPC provider to merge custom headers with Authorization header
The custom headers are stored securely in the app settings and persist
across sessions.
* fix keyboard
* add custom headers to other callsites
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 8 -5/+252
tests: Fix failing test Mohamed Bassem 1 -12/+16
feat: Add support for user uploaded files (#2100)
* feat: add user file upload support for bookmarks
Add a new "user-uploaded" asset type that allows users to upload and
attach their own files to bookmarks from the attachment box in the
bookmark preview page.
Changes:
- Add USER_UPLOADED asset type to database schema
- Add userUploaded to zAssetTypesSchema for type safety
- Update attachment permissions to allow attaching/detaching user files
- Add fileName field to asset schema for displaying custom filenames
- Add "Upload File" button in AttachmentBox component
- Display actual filename for user-uploaded files
- Allow any file type for user uploads (respects existing upload limits)
- Add Upload icon for user-uploaded files
Fixes #1863 related asset attachment improvements
* fix: ensure fileName is returned and remove edit button for user uploads
- Fix attachAsset mutation to fetch and return complete asset with fileName
  instead of just returning the input (which lacks fileName)
- Remove replace/edit button for user-uploaded files - users can only
  delete and re-upload instead
- This ensures the filename displays correctly in the UI immediately
  after upload
Fixes fileName propagation issue for user-uploaded assets
* fix asset file name
* remove filename from attach asset api
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 10 -31/+101
refactor: consolidate multiple karakeep plugins into one package (#2101)
* refactor: consolidate plugin packages into single plugins directory
- Create new `packages/plugins` directory with consolidated package.json
- Move queue-liteque, queue-restate, and search-meilisearch to subdirectories
- Update imports in packages/shared-server/src/plugins.ts
- Remove individual plugin package directories
- Update shared-server dependency to use @karakeep/plugins
This reduces overhead of maintaining multiple separate packages for plugins.
* refactor: consolidate plugin config files to root level
- Move .oxlintrc.json to packages/plugins root
- Move vitest.config.ts to packages/plugins root
- Update vitest config paths to work from root
- Remove individual config files from plugin subdirectories
This reduces configuration duplication across plugin subdirectories.
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 49 -1479/+1330
deps: Upgrade react-query to 5.90 MohamedBassem 12 -93/+93
feat(rss): Add import tags from RSS feed categories (#2031)
* feat(feeds): Add import tags from RSS feed categories
- Add importTags boolean field to rssFeedsTable schema (default: false)
- Create database migration 0063_add_import_tags_to_feeds.sql
- Update zod schemas (zFeedSchema, zNewFeedSchema, zUpdateFeedSchema) to include importTags
- Update Feed model to handle importTags in create and update methods
- Update feedWorker to:
  - Read title and categories from RSS parser
  - Attach categories as tags to bookmarks when importTags is enabled
  - Log warnings if tag attachment fails
Resolves #1996
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
* feat(web): Add importTags option to feed settings UI
- Add importTags toggle to FeedsEditorDialog (create feed)
- Add importTags toggle to EditFeedDialog (edit feed)
- Display as a bordered switch control with descriptive text
- Defaults to false for new feeds
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
* fix migration
* remove extra migration
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
Mohamed Bassem 8 -0/+2596
feat: Make search job timeout configurable Mohamed Bassem 4 -3/+8
fix: Stricter SSRF validation (#2082)
* fix: Stricter SSRF validation
* skip dns resolution if running in proxy context
* more fixes
* Add LRU cache
* change the env variable for internal hostnames
* make dns resolution timeout configerable
* upgrade ipaddr
* handle ipv6
* handle proxy bypass for request interceptor
Mohamed Bassem 10 -135/+602
fix: browser service connection check using dns instead. Fixes #2080 Mohamed Bassem 1 -6/+8
feat: Allow configuring inline asset size threshold Mohamed Bassem 5 -31/+32
feat: Add admin maintenance job to migrate large inline HTML (#2071)
* Add admin maintenance job to migrate large inline HTML
* add cursor
* more fixes
Mohamed Bassem 8 -4/+218
fix(inferance): skip token slicing when content is already witin max length Mohamed Bassem 1 -0/+3
refactor: generalize tidy assets queue into admin maintenance (#2059)
* refactor: generalize admin maintenance queue
* more fixes
Mohamed Bassem 10 -159/+227
fix: update OpenAI API to use max_completion_tokens instead of max_tokens…
* fix: update OpenAI API to use max_completion_tokens instead of max_tokens
The OpenAI API has deprecated max_tokens in favor of max_completion_tokens
for newer models. This change updates both text and image model calls.
* feat: add support for max_completion_tokens in OpenAI inference configuration
Benjamin Michaelis 3 -2/+9
fix(restate): Fix priority for restate queue Mohamed Bassem 2 -7/+8
fix(restate): Ensure that the semaphore and idProvider services are ingress… Mohamed Bassem 2 -0/+6
feat: Add source field to track bookmark creation sources (#2037)
* feat: Add source field to track bookmark creation sources
Add a new 'source' field to the bookmarks table to track where bookmarks
were created from. Possible values: api, web, cli, mobile, singlefile, rss.
Changes:
- Add source field to bookmarks table schema
- Update Zod schemas to include source field
- Update tRPC createBookmark procedure to store source
- Update all callsites to pass appropriate source value:
  - api: Default to "api" if not provided
  - singlefile: Set to "singlefile"
  - rss: Set to "rss" in feedWorker
  - cli: Set to "cli"
  - mobile: Set to "mobile" in all mobile app bookmark creation
  - browser-extension: Set to "web"
  - web: Set to "web" in all web app bookmark creation
- Create migration file for database schema change
Fixes #2036
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
* feat: Add extension source type for browser extension
- Add 'extension' to bookmark source enum
- Update browser extension to use 'extension' instead of 'web'
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
* fix CI
* fix CI
* fix the migration file
* add import source
* make source nullish
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
Mohamed Bassem 16 -12/+2650
feat: support passing multiple proxy values (#2039)
* feat: support passing multiple proxy values
* fix typo
* trim and filter
Mohamed Bassem 4 -36/+60
feat: Add service dependency checks in the server overview page Mohamed Bassem 7 -102/+404
fix(api): Return 200 when bookmark already exists instead of 200 Mohamed Bassem 4 -4/+31
tests: Add a test for the GET /bookmarks/bookmarkId/lists api Mohamed Bassem 1 -0/+48
fix(api): Document the API for getting lists of a bookmark. fixes #2030 Mohamed Bassem 8 -108/+268
fix: Correct grammatical errors in prompts (#2020)
Corrected "who's" to "whose" in buildImagePrompt and buildTextPrompt.
atsggx 1 -2/+2
fix: Disable idempotency keys for search Mohamed Bassem 1 -1/+2
feat: Restate-based queue plugin (#2011)
* WIP: Initial restate integration
* add retry
* add delay + idempotency
* implement concurrency limits
* add admin stats
* add todos
* add id provider
* handle onComplete failures
* add tests
* add pub key and fix logging
* add priorities
* fail call after retries
* more fixes
* fix retries left
* some refactoring
* fix package.json
* upgrade sdk
* some test cleanups
Mohamed Bassem 24 -13/+1049
feat: Revamp import experience (#2001)
* WIP: import v2
* remove new session button
* don't redirect after import
* store and lint to root list
* models + tests
* redesign the progress
* simplify the import session for ow
* drop status from session schema
* split the import session page
* i18n
* fix test
* remove pagination
* fix some colors in darkmode
* one last fix
* add privacy filter
* privacy check
* fix interactivity of import progress
* fix test
Mohamed Bassem 21 -37/+3618
feat: recursive list delete (#1989) Mohamed Bassem 5 -16/+437
fix: dont re-enqueue indexing for a bookmark already pending indexing Mohamed Bassem 1 -2/+5
feat: Add tag search and pagination (#1987)
* feat: Add tag search and use in the homepage
* use paginated query in the all tags view
* wire the load more buttons
* add skeleton to all tags page
* fix attachedby aggregation
* fix loading states
* fix hasNextPage
* use action buttons for load more buttons
* migrate the tags auto complete to the search api
* Migrate the tags editor to the new search API
* Replace tag merging dialog with tag auto completion
* Merge both search and list APIs
* fix tags.list
* add some tests for the endpoint
* add relevance based sorting
* change cursor
* update the REST API
* fix review comments
* more fixes
* fix lockfile
* i18n
* fix visible tags
Mohamed Bassem 32 -493/+1731
fix: optimize memory usage of tag listing Mohamed Bassem 2 -51/+137
fix: fix bundling liteque in the workers Mohamed Bassem 5 -7/+11
refactor: Move callsites to liteque to be behind a plugin Mohamed Bassem 39 -405/+707
feat: Regen api keys Mohamed Bassem 8 -29/+259
feat: Add Create Tag button to tags page (#1942)
* feat: add Create Tag button to tags page
- Added useCreateTag hook to shared-react/hooks/tags.ts
- Created CreateTagModal component for tag creation without bookmark attachment
- Added Create Tag button to AllTagsView component
- Added necessary translation keys for the new feature
Fixes #1937
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
* format
* localize toasts
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
Mohamed Bassem 4 -1/+170
refactor: strongly type the search plugin interface Mohamed Bassem 3 -10/+41
feat(search): add title search qualifier (#1940)
* fix(search): include link titles in title matcher
* docs(search): add title qualifier
* docs: remove title qualifier from v0.27 guide
Mohamed Bassem 9 -2/+142
fix: Fix ranking of search results. fixes #1922 Mohamed Bassem 1 -0/+2
fix: fix migration failing when no user settings are set. fixes #1919 (#1920) Gavin Mogan 1 -6/+6
fix: fix 5xx on invalid api key Mohamed Bassem 1 -1/+5
release(sdk): Release the 0.27 sdk Mohamed Bassem 1 -1/+1
fix: fix tag flicker caused by tag sorting Mohamed Bassem 6 -50/+53
feat: Add cookie support for browser page access
* feat: Add cookie support for browser page access
Implemented cookie functionality for browser page access, including BROWSER_COOKIE_PATH configuration to specify the cookies JSON file path.
* fix the docs
---------
Co-authored-by: lizz <lizong1204@gmail.com>
Mohamed Bassem 3 -2/+94
feat(workers): add worker enable/disable lists (#1885) Mohamed Bassem 3 -44/+71
feat: add gif asset type support (#1876)
* feat: add gif asset type support
* skip inference for gis
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Drashi 2 -2/+10
refactor: Extract quota logic into its own class Mohamed Bassem 11 -102/+133
fix: Reduce polling interval on meilisearch tasks Mohamed Bassem 3 -47/+13
fix: Incremental polling interval for ongoing crawls Mohamed Bassem 5 -36/+40
refactor: Move highlights object into models Mohamed Bassem 2 -131/+188
refactor: Move feed object into models Mohamed Bassem 2 -94/+134
fix: Respect wal mode for the queue db Mohamed Bassem 5 -13/+15
fix: handle list with slashes in their names and truncate long list names.… Mohamed Bassem 12 -602/+1076
fix: fix move the admin route to the /v1 prefix Mohamed Bassem 1 -1/+1
feat(mobile): Retheme the mobile app (#1872)
* Add nativewindui
* migrate to nativewindui text
* Replace buttons with nativewindui buttons
* Use nativewindui search input
* fix the divider color
* More changes
* fix manage tag icon
* fix styling of bookmark card
* fix ios compilation
* fix search clear
* fix tag pill border color
* Store theme setting in app settings
* fix setting color appearance
* fix coloring of search input
* fix following system theme
* add a save button to info
* fix the grey colors on android
* fix icon active tint color
* drop the use of TextField
Mohamed Bassem 47 -433/+1991
fix(security): Add CSP policies on asset serving path MohamedBassem 2 -2/+20
fix: Dont attempt to remove uploaded tmp file if it's already removed MohamedBassem 1 -1/+7
fix: Sanitize uploaded file names. #1765 MohamedBassem 1 -1/+2
feat: Export prometheus metrics from the workers MohamedBassem 17 -34/+181
feat: generate a random prometheus token on startup MohamedBassem 4 -37/+11
feat: Support video uploads and attachments (#1847)
This commit allows the following mime types to be uploaded and attached
as video assets on bookmarks.
- video/mp4
- video/webm
- video/x-matroska
Evan Sharp 2 -1/+11
deps: Upgrade expo & nextjs to react 19 (#1565)
* Attempt to upgrade expo 53
* Attempt upgrade nextjs
* Fix a bunch of peer deps
* upgrade some docs deps
* fix typecheck
* update the shadcn calendar component
* more fixes
* more fixes
* revert ollama upgrade
* update react version to use carets
* remove react-select from landing
* fix the typescript error caused by customFetch
* upgrade the new grid user setting to nextjs 15
* mobile: enable react canary to support react 19.1
* upgrade react native menu
* fix navigation context error
Mohamed Bassem 29 -3336/+2403
docker: Update chrome to 124 Mohamed Bassem 5 -5/+5
fix: Trim trailing slashes from nextauth urls. Fixes #1799 MohamedBassem 1 -1/+5
fix: Get rid of the userSetting table completely MohamedBassem 5 -56/+2359
refactor: Move webhook, users and tags into models MohamedBassem 12 -1120/+1602
feat: Drop support for time bounded invitations MohamedBassem 8 -124/+2376
refactor: Refactor crawlerWorker to use tryCatch MohamedBassem 2 -123/+141
fix: Use prometheus histogram instead of summary MohamedBassem 1 -2/+5
fix: fix hidden env variable parse error. fixes #1790 MohamedBassem 1 -167/+164
fix(tests): Load plugins on API package entrypoint MohamedBassem 3 -0/+7
feat: Support NO_COLOR for logging. Fixes #1778 MohamedBassem 3 -3/+10
refactor: Extract meilisearch as a plugin MohamedBassem 26 -155/+524
chore: More turbo fixes MohamedBassem 28 -57/+107
fix: Ensure that all packages are ESM packages MohamedBassem 5 -0/+5
fix: Fix package boundary violations MohamedBassem 6 -5/+14
fix: Add karakeep_ prefix to hono's metrics Mohamed Bassem 1 -0/+1
deps: Upgrade vite Mohamed Bassem 18 -1064/+847
feat: Hide AI settings tab if inference is not configured. #1781 Mohamed Bassem 2 -22/+21
fix: Drop legacy container notice Mohamed Bassem 2 -22/+2
deps: Upgrade trpc Mohamed Bassem 6 -87/+54
fix: prometheus add karakeep prefix to metrics (#1780)
* add: prometheus karakeep prefix
* readd: comments
Tobias 1 -7/+7
fix: Remove bcrypt from the api key validation route Mohamed Bassem 6 -25/+568
feat: Add a max output tokens env variable Mohamed Bassem 3 -1/+6
next