rcgit

/ karakeep
follow (on) | order: default date topo
Age Commit message Author Files +/-
feat: 2025 wrapped (#2322)
* feat: 2025 wrapped
* don't add wrapped for new users
Mohamed Bassem 13 -31/+1107
refactor: add suspense boundary in sidebar layout Mohamed Bassem 8 -175/+297
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: A better looking 404 page Mohamed Bassem 1 -2/+41
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
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: Add page titles (#2109)
* feat: add Next.js metadata titles to dynamic and settings pages
Add page titles using Next.js metadata API for better SEO and user experience:
- List pages: Show list name in format "<name> | Karakeep"
- Tag pages: Show tag name in format "<name> | Karakeep"
- Admin pages: Add titles for overview, users, and background jobs pages
- Settings pages: Add titles for all settings pages (API keys, AI, feeds, import, info, webhooks, subscription, rules, stats, assets, broken links)
For client components (rules, stats, assets, broken-links), created layout.tsx files to export metadata since metadata can only be exported from server components.
* feat: add Next.js metadata titles to dashboard pages
Add page titles using Next.js metadata API to archive, favourites, highlights, and all tags pages:
- Archive page: Show "Archive | Karakeep"
- Favourites page: Show "Favourites | Karakeep"
- Highlights page: Show "Highlights | Karakeep"
- All Tags page: Show "All Tags | Karakeep"
Improves SEO and user experience across all dashboard browsing pages.
* refactor: use i18n translations for dashboard page titles
Convert hardcoded page titles to use translations via generateMetadata:
- Archive page: Uses common.archive translation
- Favourites page: Uses lists.favourites translation
- Highlights page: Uses common.highlights translation
- All Tags page: Uses tags.all_tags translation
Improves localization support across dashboard pages.
* feat: add i18n translations to admin and settings page titles
Convert hardcoded page titles to use translations via generateMetadata:
- Admin Overview: Uses admin.admin_settings translation
- AI Settings: Uses settings.ai.ai_settings translation
- API Keys: Uses settings.api_keys.api_keys translation
- Feed Settings: Uses settings.feeds.rss_subscriptions translation
- Import/Export: Uses settings.import.import_export translation
- Account Info: Uses settings.info.user_info translation
- Subscription: Uses settings.subscription.subscription translation
- Webhooks: Uses settings.webhooks.webhooks translation
Improves localization support across admin and settings pages.
* revert accidental commit
* more translations
* more fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mohamed Bassem 20 -0/+247
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(web): Handle user deletion more gracefully Mohamed Bassem 1 -4/+22
feat: A better looking catch all error boundary Mohamed Bassem 1 -2/+39
feat: Add a bookmark skeleton for search Mohamed Bassem 2 -2/+86
fix: fix nextjs warning about dialog without title in bookmark preview MohamedBassem 3 -3/+18
fix(web): fix query getting rest when bookmark preview is closed. fixes #1521 MohamedBassem 4 -17/+34
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
refactor: Extract meilisearch as a plugin MohamedBassem 26 -155/+524
feat(web): Slightly nicer looking tags page Mohamed Bassem 3 -80/+94
feat(workers): Allow custmoizing max parallelism for a bunch of workers. Fixes… Mohamed Bassem 9 -15/+45
chore: migrate away from eslint to oxlint (#1642)
* chore: migrate away from eslint to oxlint
* revert turbo task name lint
* it seems like we can remove the seemingly default globals
xuatz 70 -1695/+1174
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: Allow defaulting to reader mode when clicking on bookmarks. Fixes #662 Mohamed Bassem 16 -34/+2341
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
chore: Rename hoarder packages to karakeep MohamedBassem 230 -644/+654
fix: Add missing list to PWA. Fixes #884 Mohamed Bassem 1 -2/+18
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
refactor: Refactor sidebar into a shared component Mohamed Bassem 15 -372/+276
feat: Change the admin page to be tabbed similar to that of the settings page Mohamed Bassem 26 -1029/+1152
feat: Implement the all highlights page. Fixes #620 Mohamed Bassem 13 -85/+255
feat: Add basic pagination to searchBookmarks tRPC Mohamed Bassem 5 -19/+75
feature: Add an admin notice about the usage of the legacy container images Mohamed Bassem 7 -9/+229
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
feature(web): Add the ability to view the bookmarks of a particular rss feed Mohamed Bassem 5 -2/+77
ui: Redesign the settings page and move it to its own layout Mohamed Bassem 32 -1163/+1263
fix(web): Fix settings tab overflow on mobile layouts MohamedBassem 1 -1/+1
feature(web): Introduce a new sticky navbar. Fixes 520 (#515)
* ui: add global header
* fix: design fixes
* fix: tests
* fix navbar background, hide y scrollbar and change sidebar footer to show version
---------
Co-authored-by: MohamedBassem <me@mbassem.com>
Md Saban 13 -151/+180
feature(web): Async validate JWT account and sign out the user if they no… MohamedBassem 3 -2/+39
feature(web): Change the settings page to be tabbed MohamedBassem 5 -357/+379
fix(web): Simplify the language for inference settings MohamedBassem 3 -330/+330
feature(web): Add the ability to customize the inference prompts. Fixes #170 MohamedBassem 13 -39/+1764
feature(web): Move bookmark imports into settings MohamedBassem 4 -27/+165
feat: Add bulk edit option for bookmarks. Fixes #84 (#259)
* feat: add bulk edit option for bookmarks
* fix: resolve comments
* fix: resolve comments
* fix: resolve comments
* fix: resolve comments
* rename bulk action store, simplify the bulk action toolbar
---------
Co-authored-by: MohamedBassem <me@mbassem.com>
Md Saban 14 -27/+314
ui: refactor admin settings page (#249)
* ui: refactor admin ui
* fix: pr comments
* chore: lint fix
* chore: refactor
* minor tweaks
---------
Co-authored-by: MohamedBassem <me@mbassem.com>
Md Saban 4 -282/+301
ui: Changes for user settings page (#251)
* fix: ui refactoring for user settings page
* fix: type error
* fix: pr comments
Md Saban 6 -44/+108
ui(web): move layout selector to main screen (#252) Md Saban 9 -100/+99
docs: Change references from the old repo URL to the new one MohamedBassem 9 -21/+20
feature: A new cleanups page to suggest ways to tidy up your bookmarks MohamedBassem 6 -0/+324
feature(web): Add ability to rename, merge and fast delete tags. Fixes #105…
* feature(web): Allow deleting tags from the all tags page
* feature(web): Add ability to rename, merge and fast delete tags. Fixes #105
Mohamed Bassem 14 -269/+835
ui(web): Show bookmark URL when maximizing a bookmark MohamedBassem 9 -23/+82
feature: Allow recrawling bookmarks without running inference jobs MohamedBassem 4 -9/+46
feature: Nested lists (#110). Fixes #62
* feature: Add support for nested lists
* prevent moving the parent to a subtree
Mohamed Bassem 25 -402/+2084
fix: Differentiate between pending in db and in redis in admin job stats MohamedBassem 3 -26/+64
feature: Recrawl failed links from admin UI (#95)
* feature: Retry failed crawling URLs
* fix: Enhancing visuals and some minor changes.
Ahmad Mujahid 8 -25/+1067
feature(web): Allow uploading directly into lists/tags. Fixes #69 MohamedBassem 19 -144/+258
feature: Extract hook logic into separate package and add a new action bar in… MohamedBassem 23 -330/+672
fix: Refresh the all tags page automatically when a tag is modified MohamedBassem 5 -83/+103
ui(web): Add a tooltip explaining what archived means MohamedBassem 4 -47/+60
feature: Change archived meaning to only mean removed from homepage MohamedBassem 7 -16/+5
fix: Minor fixes to small screens to render admin panel and settings in full… MohamedBassem 2 -8/+8
feature: Include server version in the admin UI. Fixes #66 MohamedBassem 8 -14/+92
fix(web): Fix the color of the info pill in the all tags page MohamedBassem 1 -2/+2
ui(web): Add a background to the all lists pane MohamedBassem 1 -1/+1
feature: Split the tags in AllTags page by who used them MohamedBassem 2 -40/+112
feature: Add support deleting tags MohamedBassem 4 -14/+94
fix(web): Consistent spacing in the content container in all pages. Fixes #40 MohamedBassem 19 -77/+60
feature(web): Add dark mode support MohamedBassem 31 -39/+138
fix(web): Remove the custom tile from the bookmarks page MohamedBassem 1 -5/+0
feature: A better looking bookmark preview page MohamedBassem 7 -69/+244
fix(web): Remove editor card from tags page MohamedBassem 1 -1/+0
feature(web): Add support for removing items from lists MohamedBassem 5 -16/+96
ui(web): Show an overlay when dragging is active MohamedBassem 3 -19/+41
fix(web): Greatly improve the search feeling by removing the flicker MohamedBassem 9 -79/+93
fix(web): Only show demo mode banner in demo mode MohamedBassem 1 -1/+3
feature(web): Add support for demo mode MohamedBassem 13 -19/+89
fix: Remove flicker from search bar MohamedBassem 2 -9/+4
Feature: Add support for uploading images and automatically inferring their…
* feature: Experimental support for asset uploads
* feature(web): Add new bookmark type asset
* feature: Add support for automatically tagging images
* fix: Add support for image assets in preview page
* use next Image for fetching the images
* Fix auth and error codes in the route handlers
* Add support for image uploads on mobile
* Fix typing of upload requests
* Remove the ugly dragging box
* Bump mobile version to 1.3
* Change the editor card placeholder to mention uploading images
* Fix a typo
* Change ios icon for photo library
* Silence typescript error
Mohamed Bassem 31 -79/+2736
feature(web): Add the ability to change passwords MohamedBassem 4 -9/+182
feature(web): A better tags editor using react select with auto complete and… MohamedBassem 5 -131/+348
feature: Implemente pagination support MohamedBassem 8 -70/+143
refactor: Prepare for pagination by dropping querying bookmarks by id MohamedBassem 16 -100/+155
ui(web): Add an editor card inline in the bookmark grid and remove the top nav… MohamedBassem 7 -150/+123
refactor: Move tag fetching to trpc to reuse in the mobile app MohamedBassem 3 -24/+113
lint: Lint and format the entire repo with the new configs MohamedBassem 122 -411/+424
structure: Create apps dir and copy tooling dir from t3-turbo repo MohamedBassem 396 -9511/+10350