rcgit

/ karakeep
follow | order: default date topo
Age Commit message Author Files +/-
feat(ai): Support restricting AI tags to a subset of existing tags (#2444)
* feat(ai): Support restricting AI tags to a subset of existing tags
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 18 -18/+3538
feat: Added Import for Instapaper (#2434)
* Added Instapaper import
* Fixes #1444 Added Instapaper import support
Daniel Wieser 3 -1/+83
feat: add source filter to query language (#2465)
* feat: add source filter to query language
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* autocomplete source
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Mohamed Bassem 8 -4/+154
feat(import): new import details page (#2451)
* feat(import): new import details page
* fix typecheck
* review comments
Mohamed Bassem 5 -2/+666
feat: Import workflow v3 (#2378)
* feat: import workflow v3
* batch stage
* revert migration
* cleanups
* pr comments
* move to models
* add allowed workers
* e2e tests
* import list ids
* add missing indicies
* merge test
* more fixes
* add resume/pause to UI
* fix ui states
* fix tests
* simplify progress tracking
* remove backpressure
* fix list imports
* fix race on claiming bookmarks
* remove the codex file
Mohamed Bassem 22 -483/+8300
fix: better looking error message when article content is unavailable Mohamed Bassem 2 -1/+22
feat: track api key usage dates Mohamed Bassem 9 -20/+3078
feat(rules): add "Title Contains" condition to Rule Engine (#1670) (#2354)
* feat(rules): add "Title Contains" condition to Rule Engine (#1670)
* feat(rules): hide title conditions for bookmark created trigger
* fix typecheck
Andrii Mokhovyk 6 -1/+133
feat: privacy-respecting bookmark debugger admin tool (#2373)
* fix: parallelize queue enqueues in bookmark routes
* fix: guard meilisearch client init with mutex
* feat: add bookmark debugging admin tool
* more fixes
* more fixes
* more fixes
Mohamed Bassem 9 -18/+1304
feat: Add retry buttons for pending bookmarks in admin panel (#2341) Mohamed Bassem 3 -2/+33
fix: show a toast during banner upload Mohamed Bassem 2 -43/+30
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
Mohamed Bassem 6 -17/+205
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>
Mohamed Bassem 4 -2/+88
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>
Mohamed Bassem 5 -0/+51
feat: 2025 wrapped (#2322)
* feat: 2025 wrapped
* don't add wrapped for new users
Mohamed Bassem 13 -31/+1107
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 support for user avatars (#2296)
* feat: add support for user avatars
* more fixes
* more fixes
* more fixes
* more fixes
Mohamed Bassem 20 -5/+610
feat: add a warning about viewing archives inline. fixes #2286 Mohamed Bassem 3 -1/+33
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: 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
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: autocomplete search terms (#2178)
* refactor(web): split search autocomplete logic
* some improvements
* restructure the code
* fix typesafety
* add feed suggestions
* fix
Mohamed Bassem 4 -61/+629
feat: Add automated bookmark backup feature (#2182)
* feat: Add automated bookmark backup system
Implements a comprehensive automated backup feature for user bookmarks with the following capabilities:
Database Schema:
- Add backupSettings table to store user backup preferences (enabled, frequency, retention)
- Add backups table to track backup records with status and metadata
- Add BACKUP asset type for storing compressed backup files
- Add migration 0066_add_backup_tables.sql
Background Workers:
- Implement BackupSchedulingWorker cron job (runs daily at midnight UTC)
- Create BackupWorker to process individual backup jobs
- Deterministic scheduling spreads backup jobs across 24 hours based on user ID hash
- Support for daily and weekly backup frequencies
- Automated retention cleanup to delete old backups based on user settings
Export & Compression:
- Reuse existing export functionality for bookmark data
- Compress exports using Node.js built-in zlib (gzip level 9)
- Store compressed backups as assets with proper metadata
- Track backup size and bookmark count for statistics
tRPC API:
- backups.getSettings - Retrieve user backup configuration
- backups.updateSettings - Update backup preferences
- backups.list - List all user backups with metadata
- backups.get - Get specific backup details
- backups.delete - Delete a backup
- backups.download - Download backup file (base64 encoded)
- backups.triggerBackup - Manually trigger backup creation
UI Components:
- BackupSettings component with configuration form
- Enable/disable automatic backups toggle
- Frequency selection (daily/weekly)
- Retention period configuration (1-365 days)
- Backup list table with download and delete actions
- Manual backup trigger button
- Display backup stats (size, bookmark count, status)
- Added backups page to settings navigation
Technical Details:
- Uses Restate queue system for distributed job processing
- Implements idempotency keys to prevent duplicate backups
- Background worker concurrency: 2 jobs at a time
- 10-minute timeout for large backup exports
- Proper error handling and logging throughout
- Type-safe implementation with Zod schemas
* refactor: simplify backup settings and asset handling
- Move backup settings from separate table to user table columns
- Update BackupSettings model to use static methods with users table
- Remove download mutation in favor of direct asset links
- Implement proper quota checks using QuotaService.checkStorageQuota
- Update UI to use new property names and direct asset downloads
- Update shared types to match new schema
Key changes:
- backupSettingsTable removed, settings now in users table
- Backup downloads use direct /api/assets/{id} links
- Quota properly validated before creating backup assets
- Cleaner separation of concerns in tRPC models
* migration
* use zip instead of gzip
* fix drizzle
* fix settings
* streaming json
* remove more dead code
* add e2e tests
* return backup
* poll for backups
* more fixes
* more fixes
* fix test
* fix UI
* fix delete asset
* fix ui
* redirect for backup download
* cleanups
* fix idempotency
* fix tests
* add ratelimit
* add error handling for background backups
* i18n
* model changes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 32 -8/+5697
fix: separate shared lists in the sidebar (#2180)
* fix: separate shared lists in the sidebar
* fix sub
* i18n
Mohamed Bassem 4 -31/+237
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: use kbd for editor card Mohamed Bassem 5 -36/+58
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
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
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
feat: Add what's new modal in the sidebar (#2099)
* Refactor sidebar release modal to use React Query
* fixes
* fix manual server override
Mohamed Bassem 3 -13/+262
feat: Add view options to show tag/title and control image fit. Fixes #1960 Mohamed Bassem 6 -29/+214
feat: display notes on bookmark card (#2083)
* feat: display notes on bookmark card
* apply styling
* include mobile impl
* apply pr comments
* add display options menu into PR
* put it under app setting
* cleanup
* address pr comments
* change the default for show notes to false
* make the in-card note font lighter
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
xuatz 13 -25/+268
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
refactor: generalize tidy assets queue into admin maintenance (#2059)
* refactor: generalize admin maintenance queue
* more fixes
Mohamed Bassem 10 -159/+227
feat: Add service dependency checks in the server overview page Mohamed Bassem 7 -102/+404
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
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
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
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
feat: Add confirmations to background job actions MohamedBassem 2 -25/+40
feat: A redesigned background jobs page. #1551 MohamedBassem 4 -202/+499
feat: adding search history #1541 (#1627)
* feat: adding search history
* fix popover should close when no matched history
* remove unnecessary react import
* replace current Input component with CommandInput for better UX
* add i18n for recent searches label
* fix bug
* refactor local storage logic to make code reusable
* using zod schema to validate search history and revert debounce change
* Consolidate some of the files
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
lexafaxine 7 -47/+416
feat: Add stripe based subscriptions Mohamed Bassem 18 -60/+4351
fix: Fix i18n in the new stats page Mohamed Bassem 3 -37/+108
feat: Add new user stats page. Fixes #1523 Mohamed Bassem 6 -1/+1102
feat: Add per user bookmark count quota Mohamed Bassem 13 -168/+2553
feat(admin): add confirmation dialog for user deletion (#1648) (#1649)
* feat(admin): add confirmation dialog for user deletion (#1648)
* No need to manage dialog state
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Deepanshu Saini 2 -10/+32
feat: Add support for public lists (#1511)
* WIP: public lists
* Drop viewing modes
* Add the public endpoint for assets
* regen the openapi spec
* proper handling for different asset types
* Add num bookmarks and a no bookmark banner
* Correctly set page title
* Add a not-found page
* merge the RSS and public list endpoints
* Add e2e tests for the public endpoints
* Redesign the share list modal
* Make NEXTAUTH_SECRET not required
* propery render text bookmarks
* rebase migration
* fix public token tests
* Add more tests
Mohamed Bassem 36 -147/+3286
feat: add user customisable default archive display behaviour (#1505)
* fix typo
* implementation
* bug fix and refactoring
* Use nuqs for searchParam management
* remove the todo about the tests
* fix tests
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
xuatz 19 -24/+2226
feat: Generate RSS feeds from lists (#1507)
* refactor: Move bookmark utils from shared-react to shared
* Expose RSS feeds for lists
* Add e2e tests
* Slightly improve the look of the share dialog
* allow specifying a limit in the rss endpoint
Mohamed Bassem 26 -293/+3131
feat: Allow defaulting to reader mode when clicking on bookmarks. Fixes #662 Mohamed Bassem 16 -34/+2341
feat: Add AI auto summarization. Fixes #1163 Mohamed Bassem 34 -2639/+4843
fix(web): Switch to a tab view in small screens for bookmark previews
* feat: Implement tabbed layout for bookmark preview content and details
* feat: Enable swipe gesture to switch between content and details tabs
* feat: add scroll-based tab bar hide/show functionality
* fix: adjust tab bar layout to maintain content space when hidden
* fix: bg-muted was stopping midway in the background
* fix: disable mouse tracking for swipe detection in BookmarkPreview
* fix: improve scroll behavior to prevent glitchy tab bar animation
* Update apps/web/components/dashboard/preview/BookmarkPreview.tsx
Co-authored-by: xuatz <xzlow10@gmail.com>
* Update apps/web/components/dashboard/preview/BookmarkPreview.tsx
Co-authored-by: xuatz <xzlow10@gmail.com>
* feat: add responsive layout with tabs and swipe for BookmarkPreview
* Remove react swipe, scroll handlers and do screen detection using media queries
* Revert the grey background for the main content
* remove react-swip from the package.json
* more fixes
* Fix the black area under the tab bar
---------
Co-authored-by: xuatz <xzlow10@gmail.com>
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Olicorne 2 -37/+85
fix(search): add new relevance sort order (#1392)
* fix(search): add new relevance sort order
* address pr comments
* some minor fixes
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
xuatz 7 -16/+74
feat: Allow enabling/disabling RSS feeds Mohamed Bassem 10 -21/+2032
feat: Implement generic rule engine (#1318)
* Add schema for the new rule engine
* Add rule engine backend logic
* Implement the worker logic and event firing
* Implement the UI changesfor the rule engine
* Ensure that when a referenced list or tag are deleted, the corresponding event/action is
* Dont show smart lists in rule engine events
* Add privacy validations for attached tag and list ids
* Move the rules logic into a models
Mohamed Bassem 42 -40/+5787
chore: rename missing files/conf from Hoarder to Karakeep (#1280)
* refactor: Rename remaining project configuration from Hoarder to Karakeep
* some fixes
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
adripo 126 -5080/+5080
fix: Rename cached content into reader mode Mohamed Bassem 2 -5/+6
ui(web): Reduce shadows, lighten some fonts, and a smaller editor. #1261 Mohamed Bassem 12 -37/+67
feat: Add import support for Tab Session Manager (#1246)
* feat: Add import support for Tab Session Manager
* drop unneeded schema fields
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Jorge Barnaby 4 -2/+72
feat(web): Add support for merging lists (#1231)
* feat: Support list merging
* some fixes
* move @hoarder to @karakeep
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
omnitrix 8 -3/+325
feat: add support for filtering by bookmark age (#1228) Brandon Wong 8 -15/+162
feat: Allow editing the extracted content of an asset bookmark Mohamed Bassem 6 -6/+66
feat(web): Optionally add short description to lists (#1225)
* feat(web): Optionally add short description to lists
* regenerate openapi spec
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
ekambains 10 -1/+1743
feat: Allow editing bookmark details MohamedBassem 14 -102/+732
feat: Add a search matcher for rss feed bookmarks MohamedBassem 7 -1/+144
feat(web): A slightly better looking banner when no bookmarks are found MohamedBassem 3 -1/+27
fix(translations): fixes typo in video download (#1116) erik-nilcoast 1 -1/+1
feat: Move background jobs with the admin actions. Fixes #1083 Mohamed Bassem 8 -257/+284
fix: Fix missing workers in the server stats Mohamed Bassem 3 -0/+86
feat: Add a setting page to manage assets. Fixes #730 Mohamed Bassem 16 -347/+630
feat: Add PDF screenshot generation and display (#995)
* Updated pdf2json to 3.1.5
* Extract and store a screenshot from PDF files using pdf2pic
* Installing graphicsmagick and ghostscript
* Generate Missing PDF screenshot with tidyAssets worker for backward support
* Display PDF screenshot instead of the PDF in web if it exists.
* Display PDF screenshot in mobile app if exists.
* Updated pnpm-lock.yaml
* Removed console.log
* Revert the unnecessary changes in package.json
* Revert pnpm-lock changes
* Prevent rendering PDF files if the screenshot is not generated
* refactor: replace useEffect with useMemo for section initialization
* feat: show PDF file download button and handle large PDFs by defaulting to screenshot view
* feat: add file size to openapi spec
* feature: Add Assets preprocessing in fix mode to admin actions
* i18n: add reprocess_assets_fix_mode translation
* i18n: Add missing ar translations
* A bunch of fixes
* Fix openspec schema
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Ahmad Mujahid 34 -101/+545
i18n: Translated using Weblate (English)
Currently translated at 100.0% (249 of 249 strings)
Translation: Hoarder/Hoarder
Translate-URL: https://hosted.weblate.org/projects/hoarder/hoarder/en/
Daniel Vigaru 1 -1/+1
feat(web): Add the query explainer to the smart list modal Mohamed Bassem 2 -9/+38
feat: Change webhooks to be configurable by users Mohamed Bassem 23 -28/+4272
feat: Add ability to filter by bookmark type Mohamed Bassem 9 -14/+208
feat: Add Bookmark Sorting Feature (#812)
* feat: add bookmark sorting by creation date
- Add sort order toggle in GlobalActions component
- Implement ascending/descending sort functionality
- Update translations for sorting feature in all languages
- Add sort order icons and dropdown menu
- Maintain sort preference in URL params
* feat: add bookmark sorting by creation date
- Add sort order toggle in GlobalActions component
- Implement ascending/descending sort functionality
- Update translations for sorting feature in all languages
- Add sort order icons and dropdown menu
- Maintain sort preference in URL params during session
Note: Sort order resets to default on page refresh, server-side persistence can be implemented in future enhancement
* feat: Add global sort by date feature with shared sort order state
- Implement global sort order functionality using a shared Zustand store (`useSortOrder` hook).
- Update `getBookmarks` and `searchBookmarks` endpoints to accept a `sortOrder` parameter.
- Refactor code to import `ZSortOrder` from shared types (`bookmarks.ts`), ensuring consistency across the codebase.
- Update components (`UpdatableBookmarksGrid`, `bookmark-search`) to use the shared `useSortOrder` hook.
- Remove unused `zSortBy` definition from `packages/shared/types/bookmarks.ts` to avoid confusion.
- Ensure consistent naming conventions by prefixing Zod inferred types with `Z`.
- Clean up code and address previous PR feedback comments.
* tiny fixes and fixing TS errors
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Daksh Pareek 24 -32/+231
feat: Support customizing the summarization prompt. Fixes #731 Mohamed Bassem 10 -16/+1649
fix: Add i18n for query explainer and add missing url matcher Mohamed Bassem 4 -15/+82
feat: Add support for smart lists (#802)
* feat: Add support for smart lists
* i18n
* Fix update list endpoint
* Add a test for smart lists
* Add header to the query explainer
* Hide remove from lists in the smart context list
* Add proper validation to list form
---------
Co-authored-by: Deepak Kapoor <41769111+orthdron@users.noreply.github.com>
Mohamed Bassem 26 -100/+2045
feat: Add delete bookmark confirmation dialog. Fixes #776 (#787) Nicole Li 6 -38/+110
feat: add Linkwarden importer (#786)
* added in Linkwarden import
* simpler parsing
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Patrick Leonard 3 -1/+53
fix: Better handling for when there's no highlights in the all highlights page Mohamed Bassem 2 -3/+14
feat: Implement the all highlights page. Fixes #620 Mohamed Bassem 13 -85/+255
feat: Implement highlights support for links. Fixes #620 Mohamed Bassem 16 -6/+3837
feature: WYSIWYG markdown for notes. Fixes #701 (#715)
* #701 Improve note support : WYSIWYG markdown
First implementation with a wysiwyg markdown editor.
Update:
- Add Lexical markdown editor
- consistent rendering between card and preview
- removed edit modal, replaced by preview with save action
- simple markdown shortcut: underline, bold, italic etc...
* #701 Improve note support : WYSIWYG markdown
improved performance to not rerender all note card when one is updated
* Use markdown shortcuts
* Remove the alignment actions
* Drop history buttons
* Fix code and highlighting buttons
* Remove the unneeded update markdown plugin
* Remove underline support as it's not markdown native
* - added ListPlugin because if absent, there's a bug where you can't escape a list with enter + enter
    - added codeblock plugin
    - added prose dark:prose-invert prose-p:m-0 like you said (there's room for improvement I think, don't took the time too deep dive in) and removed theme
    - Added a switch to show raw markdown
    - Added back the react markdown for card (SSR)
* delete theme.ts
* add theme back for code element to be more like prism theme from markdown-readonly
* move the new editor back to the edit menu
* move the bookmark markdown component into dashboard/bookmark
* move the tooltip into its own component
* move save button to toolbar
* Better raw markdown
---------
Co-authored-by: Giuseppe Lapenta <giuseppe.lapenta@enovacom.com>
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Giuseppe 15 -129/+1177
feature: Store crawling status code and allow users to find broken links. Fixes… Mohamed Bassem 9 -6/+1628
feature: Add i18n support. Fixes #57 (#635)
* feature(web): Add basic scaffolding for i18n
* refactor: Switch most of the app's strings to use i18n strings
* fix: Remove unused i18next-resources-for-ts command
* Add user setting
* More translations
* Drop the german translation for now
Mohamed Bassem 56 -281/+929