* adding font size
* removing trash
* moving font menu
* chore: revert port change in compose
---------
Co-authored-by: Henry <henry_ball@hotmail.co.uk>
* feat: workspace start of week column
* feat(l10n): add workspace setting for the first day of the week
Fixes#361
* feat: add Saturday as option
* chore: fix migration order
* chore: fix merge
---------
Co-authored-by: Henry <henry_ball@hotmail.co.uk>
* feat(api): add webhook CRUD API router and tests
Add tRPC router for managing workspace webhooks:
- list, create, update, delete endpoints (admin role required)
- test endpoint to send a synthetic payload to a webhook URL
- URL validation, event subscription filtering
- Unit tests for all router procedures
- Integration tests with PGlite test database
- Add vitest config and test infrastructure for API package
Depends on #391 (DB schema & repository).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor(api): use assertPermission instead of assertUserInWorkspace
Replace assertUserInWorkspace with assertPermission("workspace:manage")
per project conventions. The permissions system is the preferred
authorization approach for new code.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(api): use @kan/db alias instead of relative imports in tests
Replace relative path imports (../../db/src/...) with the @kan/db
alias configured in vitest.config.ts for consistency and robustness.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor(api): use webhookUrlSchema in router input validation
Cherry-pick router-related changes from b2cc9ac:
- Use extracted webhookUrlSchema zod validator in create/update
input schemas for consistent SSRF checks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor(api): replace dynamic import with static import for webhook utility
Add packages/api/src/utils/webhook.ts with sendWebhookToUrl,
createCardWebhookPayload, and webhookUrlSchema. Replace the dynamic
import() in the test endpoint with a static import at the top of the
file for better tree-shaking, type-checking, and readability.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(api): align sendWebhooksForWorkspace tests with merged PR #392
The merged delivery utility uses client-side event filtering
(getActiveByWorkspaceId takes 2 args, not 3). Update test assertions
to match the actual implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(web): add webhook management UI
Add settings page for managing workspace webhooks:
- Add webhooks page route and settings navigation link
- Add webhook list view with status toggles and action menus
- Add create/edit modal with URL validation and event selection
- Add delete confirmation dialog
- Add WEBHOOKS_ENABLED env flag for feature gating
Depends on #393 (CRUD API router).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(web): remove dead env vars, extract TableRow, import webhookEvents
- Remove unused WEBHOOK_URL and WEBHOOK_SECRET env vars (leftovers
from earlier env-var-based design)
- Move TableRow component outside WebhookList to avoid re-creation
on every render
- Import webhookEvents from @kan/db/schema instead of hardcoding
- Simplify formatDate to only handle Date objects (strings are not
returned by tRPC/Superjson)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(web): gate webhooks settings tab to admin role
The webhook API requires admin role, but the settings tab was visible
to all users (condition: true). Now matches the API's authorization
requirement, addressing reviewer feedback on PR #394.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor(web): use webhookEvents constant for form defaults
Replace hardcoded event arrays with [...webhookEvents] in
NewWebhookModal so default values stay in sync if new events
are added to the schema.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(web): use date-fns with locale for webhook date formatting
Replace hardcoded toLocaleDateString('en-US') with date-fns format()
using the useLocalisation() hook's dateLocale, matching the pattern
used throughout the codebase (ActivityList, DateSelector, etc.).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* added an icon of 512x512 for the manifest
* added a web app manifest
* added a screenshot for richer install on mobile
* added a screenshot for richer install ui on desktop
* added a document to include the manifest
* fixed the command to generate a better auth secret
* moved the link tag directly into the PageHead component
Move Link extension before Markdown in the TipTap extensions array
to ensure URL detection happens before markdown processing. Also
explicitly enable linkOnPaste for paste detection.
Fixes#376
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add notifications schema
* chore: gen migration
* feat: add mention email template
* feat: add sendMentionEmail func
* feat: add repo funcs
* feat: update card router to send emails on mention
* fix: update the editor suggestion to show all members
* feat: skip pending members in sendMentionEmails
* feat: update comments to use tiptap editor
* refactor: replace presigned URL uploads with backend upload endpoints
* feat: update avatar upload to use new endpoint
* refactor: use createS3Client in auth hooks
* feat: generate presigned URLs for avatars
* fix: show avatar image in user menu
* fix: hide tooltip if content is empty
* fix: support external avatar URLs in generateAvatarUrl
* fix: remove content type restriction on attachments
* fix: prevent workspace.byId validation errors when publicId is empty
* fix: add keys to shortcut elements
* fix: prevent card.byId validation errors when cardPublicId is empty
* chore: remove invalid config option from next.config.js
* feat: setup schema for workspace roles
* chore: regen migration
* feat: add publicId to workspace roles
* feat: setup default permissions
* feat: add repo funcs
* feat: setup basic router interactions
* feat: add card permissions
* feat: assert permissions for lists
* feat: assert board permissions
* feat: assert permission for remaining routes
* feat: add permissions page to settings
* feat: enable updating member roles
* feat: order members by role and createdAt
* feat: allow editing individual permissions
* feat: reset role defaults
* feat: clear all permission overrides
* feat: allow users to delete entities they have created
* feat: set roleId when inviting new members
* feat: disable UI elements if user does not have permissions
* feat: allow admins to assign the admin role to other users
* feat: allow delete:list as default
* refactor: centre permissions modal
* chore: translations
* feat: add YouTube video embed support for TipTap editor
- Paste YouTube URLs to auto-embed videos with metadata
- Edit video title and URL through dropdown menu
- Convert embed back to plain URL link
- Fetch video titles automatically via YouTube oEmbed API
* fix:
- reverted NewCardForm CSS properties back to max-h-48.
- Added boolean prop to TipTap Edtior for YouTube embed.
- Disabled YouTube embed feature for NewCardForm Editor
* chore: lint
* chore: translations
* chore: update translations
---------
Co-authored-by: Henry <henry_ball@hotmail.co.uk>
* feat: add card due dates to schema
* feat: update repo funcs
* feat: update card router to support due dates
* chore: update migration journal
* feat: add date selector
* feat: display date icon and label on cards
* feat: add due date filters
* feat: add due date to new card form
* feat: light mode tweaks
* feat: improve text eligibility on light mode
* feat: reduce selector font size
* feat: display date updates in card activity
* chore: gen translations
* fix(web): logic of disabling credential login
If credentials are disabled, then don't show the email login form at all. If credentials are disabled and no social providers are present, show message saying none are available.
* chore: update lang
---------
Co-authored-by: Henry <henry_ball@hotmail.co.uk>
* feat(cloud): add free trial
* fix: center workspace name icon when collapsed
* feat: add 14 day free trial notice to pricing page
* feat: hide upgrade button when on active subscription
* chore: translations
* fix: disabled email functionality unless email sending enabled
* feat: missing locale only russian complete
* chore: add ENABLE_EMAIL to docker compose
* chore: add translations
* fix: removed new env variable, and used SMTP_HOST instead for checking
* Revert "fix: removed new env variable, and used SMTP_HOST instead for checking"
This reverts commit 5f75237e06ac07bcbb073c25cdc9d6a9071e4011.
* feat: allow inviting members via link
* refactor: update env to disable email
* chore: update translations
---------
Co-authored-by: Henry <henry_ball@hotmail.co.uk>
* refactor: reorganize settings page with tabbed interface
* feat: revamp API key management with new list view and confirmation modals
* refactor: update tab styling
* refactor: tweak UI/UX for managing API keys
* refactor: only show update button when change has been made
* refactor: only show update button when content of display name has been updated
* feat: store tab state in params
* refactor: remove focus state from tabs
* refactor: tweak styling on mobile select
* refactor: simplify settings pages
* feat: open upgrade modal if upgrade=pro is in params
* feat: add scroll to api key list on mobile
* chore: add translations
---------
Co-authored-by: Henry <henry_ball@hotmail.co.uk>
* feat: add migration to remove not null constraint from referenceId on subscriptions
* feat(cloud): write worspace slug availability checks to db
* feat: add migration to add cascade set null to referenceId on subscription
* feat: update workspace and subscripton schema
* feat: add createWorkspaceSlugCheck repo func
* feat: set workspace url on creation
* chore: update translations
* refactor: various tweaks and fixes
* feat: add pro bolt to pricing notice
* feat: toggle pro subscription
* fix: hide pro subscription notice for self hosters
* feat: add pro upgrade message on members page
* feat: hide pro upgrade notice on small viewports
* feat: update workspace url placeholder
* fix: ensure workspace slug is updated on activation
* feat: open upgrade modal if upgrade=pro is in URL params
* fix: show correct skeleton loader for workspace menu when collapsed
* fix: reenable scroll when navigating back to marketing page
* feat: add launch offer notice
* fix: closing the modal on the public board page clears the content before the modal fade out animation finishes
* refactor: enhance CheckboxDropdown component to handle empty states and improve item rendering
* Update apps/web/src/views/public/board/CardModal.tsx
Co-authored-by: Henry <30578846+hjball@users.noreply.github.com>
---------
Co-authored-by: Henry <30578846+hjball@users.noreply.github.com>