Skip to content

Commit 62cbf4f

Browse files
committed
Merge tag 'v2.4.0'
[2.4.0] - 2026-07-19 Bug Fixes * *(a11y)* Make list view task links keyboard focusable and openable with Enter * *(a11y)* Show a visible focus ring on checkboxes and other focusable controls * *(a11y)* Make task title keyboard editable * *(a11y)* Pick label text color by actual WCAG contrast ratio * *(a11y)* Fix light theme contrast of success and danger text * *(a11y)* Make kanban cards reachable and openable by keyboard * *(a11y)* Show a keyboard-only focus ring on text inputs and editable titles * *(a11y)* Move focus to main content when the skip link is activated * *(a11y)* Add accessible names to all icon-only buttons * *(a11y)* Login tab order, announced errors, combobox pattern, named dialogs and selects (#3228) * *(a11y)* Expose expanded, sort, result-count and toggle states to assistive technology * *(a11y)* Contrast tokens, empty-title feedback, structure and landmarks (#3234) * *(a11y)* Render the kanban bucket footer as a list item * *(a11y)* Un-nest the attachment rows * *(a11y)* Keep the auth hero heading readable with a gradient scrim * *(a11y)* Label the bucket selector with its purpose and current bucket * *(a11y)* Announce comment and attachment counts on task cards and rows * *(a11y)* Make the editor toolbar a single tab stop with roving focus * *(admin)* Reload created user before returning in admin create handler * *(ai)* Correct snake_case in json instructions * *(api)* Uppercase project identifier before by-index lookup * *(api)* Close the user data export reader after download * *(api)* Export api-token permission groups in snake_case * *(api)* Return 200 instead of 500 when listing attachments on a task with none * *(api)* Derive API-token ownership from a verified user principal (GHSA-vvcv-vpph-h844) * *(api)* Reject link shares on reaction and task-read endpoints (consistency; GHSA-vvcv-vpph-h844) * *(api/docs)* Make redoc load docs.json from public URL * *(api/docs)* Use Base in redoc template * *(api/v2)* Publish OpenAPI Servers and make schemas publicly fetchable * *(api/v2)* Return generic 401 instead of leaking internal auth error * *(api/v2)* Don't leak internal error detail in 5xx responses * *(api/v2)* Dedupe BucketConfigurationMode enum tag * *(api/v2)* Guard against nil bucket configuration elements * *(api/v2)* Scope project view delete to its parent project * *(api/v2)* Apply rate limit before the admin gate * *(api/v2)* Accept real image content-types on avatar upload * *(api/v2)* Align avatar upload body limit with global overhead * *(api/v2)* Reject non-decodable images (e.g. SVG) on avatar upload with 400 * *(api/v2)* Keep include_public out of the team body schema * *(api/v2)* Omit project max_permission (null) when not expanded * *(api/v2)* Drop ETag/conditional read on project get * *(api/v2)* Map ValidationHTTPError to its HTTP status * *(api/v2)* Return 200 from notifications mark-all (creates nothing) * *(api/v2)* Group time-entries token routes under their own scope * *(api/v2)* Expose v2-only token route groups via the routes endpoint * *(api/v2)* Return ErrProjectDoesNotExist for unknown project identifiers * *(api/v2)* Gate /register at registration time, not per request * *(api/v2)* Close export reader when commit fails before streaming * *(assignees)* Resolve 500 error when reading task assignees * *(assignees)* Use db.ILIKE helper for assignee search count query * *(attachments)* Keep blob mime type so pdf previews open inline (#3157) * *(audit)* Handle reopen failure after a failed rotation * *(audit)* Only attribute the logout event to user tokens * *(auth)* Tolerate string booleans in oidc provider config (#2599) * *(auth)* Make refresh token path respect to public URL * *(auth)* Cleanup getRefreshTokenCookiePath implementation * *(auth)* Don't panic on /token/test with API token * *(auth)* Remove stale OIDC callback lock * *(auth)* Roll back on commit failure in DeleteSession * *(auth)* Return ErrAccountLocked for locked accounts on login * *(auth)* Build OIDC end-session URL with RP-Initiated Logout params (#2943) * *(auth)* Preserve desktop authorize URL when not signed in (#2944) * *(auth)* Link OIDC username fallback on preferred_username, not just sub (#2945) * *(auth)* Dedupe and retry token refresh to prevent spurious logouts (#2948) * *(auth)* Allow api tokens to access global v2 task list endpoint * *(auth)* Use binddn as group sync dn instead of userbind * *(auth)* Require verified email before OIDC email-fallback account linking (GHSA-xv7q-fvmc-jx96) * *(auth)* Reject API tokens at the OAuth authorize endpoint (GHSA-v3p6-34mc-hj7v) * *(caldav)* Return 404 when trying to access a project that cannot exist with CalDAV (#2796) * *(caldav)* Store markdown descriptions as HTML, skip spurious updates * *(caldav)* Compute VTODO DURATION components correctly (#3155) * *(caldav)* Parse ISO 8601 week durations in reminder triggers (#3183) * *(ci)* Skip interactive prompt in nixpkgs update workflow * *(ci)* Use working model * *(ci)* Don’t close issue directly * *(ci)* Add mage aliases for pacakge releases * *(ci)* Configure gpg loopback pinentry for reprepro signing * *(ci)* Sign APT Release files manually instead of via reprepro gpgme * *(ci)* Install makepkg for repo-add utility scripts * *(ci)* Rename .archlinux files to .pkg.tar.zst for repo-add * *(ci)* Add debug step to list incoming package files * *(ci)* Add deeper debug for archlinux/pacman package contents * *(ci)* Install libarchive-tools for repo-add bsdtar dependency * *(ci)* Set RELEASE_VERSION to avoid git dependency in containers * *(ci)* Add libc6-compat for Alpine, fix S3 upload glob, add debug * *(ci)* Inline APK repo generation to avoid glibc binary on Alpine * *(ci)* Skip desktop .apk in APK repo, not a valid Alpine package * *(ci)* Revert S3 glob to **/* and clean up directories before upload * *(ci)* Update s3-action to skip directories during upload * *(ci)* Pin s3-action to main branch * *(ci)* Exclude package files from repo metadata upload * *(ci)* Write GPG key directly to file instead of importing and exporting * *(ci)* Resolve symlinks before upload instead of deleting them * *(ci)* Commit newly added Crowdin translation files * *(ci)* Escape ${{ secrets.* }} mention in release-binaries description * *(ci)* Switch release composite actions to unstable on non-tag builds * *(ci)* Drop "./" from PACKAGE_OUTPUT_DIR so strip-path-prefix matches * *(ci)* Generate config.yml.sample in release-os-package for vikunja * *(ci)* Copy pnpm-workspace.yaml into Docker frontend build * *(cli)* Guard last admin on scheduled CLI deletion path * *(cli)* Drain the mail queue before user commands exit * *(comments)* Even padding around comment message * *(db)* Interpolate table identifiers in truncate instead of binding them * *(desktop)* Rebuild tray menu in place instead of recreating the Tray * *(desktop)* Support Ctrl and mouse-wheel zoom shortcuts * *(desktop)* Drop redundant zoom clamp * *(desktop)* Show tray icon in packaged builds * *(desktop)* Quit on SIGTERM and SIGINT * *(desktop)* Show hidden window when relaunched from tray * *(desktop)* Set the main window icon on Linux * *(desktop)* Register vikunja-desktop:// scheme handler for AppImage (#3203) * *(docker)* Make /tmp world-writable so exports work under any UID * *(editor)* Render floating popups inside the task dialog (Kanban popup) * *(editor)* Render link prompt inside the task dialog so it works in the Kanban popup (#2940) * *(editor)* Make link prompt a sub-modal — Escape cancels it without closing the task dialog * *(events)* Build event doers without re-fetching the user * *(events)* Handle nil auth when building event doers * *(export)* Treat a missing export meta row as no export in the status * *(files)* Never cache file downloads in v1 or v2 * *(filter)* Accept non-zero-padded dates in task filters * *(filters)* Resolve relative and absolute date filters in UTC (#3181) 🤖🤖🤖 (#3229) * *(frontend)* Render editor popups inside modal dialog top-layer * *(frontend)* Guard caldav and totp settings routes when disabled * *(frontend)* Guard Object.keys against null in refactored helpers * *(frontend)* Restore tablet pagination layout (space-between + flex order) * *(frontend)* Make sw.ts respect to frontend base URL * *(frontend)* Fix hard-coded API base in checkAndSetApiUrl.ts * *(frontend)* Use import.meta.env.MODE instead of DEV for testid directive * *(frontend)* Respect week_start setting when language is not explicitly set * *(frontend)* Add postcss-html as explicit devDependency * *(frontend)* Focus quick actions input after modal opens * *(frontend)* Respect user's 12h/24h time format in date pickers * *(frontend)* Extend checkbox hit target to 44x44 * *(frontend)* Skip task detail on label and checkbox clicks * *(frontend)* Scope checkbox hit-area pseudo to the task row * *(frontend)* Ensure text color inherits in filter autocomplete component * *(frontend)* Prevent avatar layout shift while loading * *(frontend)* Wrap notifications in Teleport to appear above modals for #2744 * *(frontend)* Fix buttons alignments in rtl direction * *(frontend)* Restore quick actions menu styling and height limit * *(frontend)* Auto-refresh relative dates as time passes * *(frontend)* Scroll tall default modals instead of clipping their top * *(frontend)* Zero seconds on api token custom expiry date * *(frontend/kanban)* Honor server bucket redirect on drag (#2618) * *(frontend/oidc)* Prefix frontend base to redirect URL * *(frontend/vite)* Configure vite dev proxy to handle frontend path * *(gantt)* Preserve horizontal scroll when focusing a task bar * *(kanban)* Prevent task taps from leaking through the sticky add-task footer on touch devices * *(kanban)* Count tasks in bucket, not filter total, for saved-filter bucket limits * *(kanban)* Upsert race condition in kanban task bucket sync (#2938) * *(kanban)* Authorize body task_id when moving a task into a bucket (GHSA-5pg6-m483-7vrg) * *(kanban)* Prevent cross-tenant bucket relocation via project_view_id mass-assignment (GHSA-569v-q83c-3j3g) * *(kanban)* Pin link-share task collection view to the share's project (GHSA-rj9j-8772-4h6c) * *(keyvalue)* Treat undecodable cached values as a cache miss * *(labels)* Report owner-level max_permission * *(labels)* Explain why link-share users can't create labels (#3233) * *(license)* Degrade to free when servers unreachable or key rejected * *(link-sharing)* Resolve share read permission via project id so by-id reads work * *(migration)* Reuse existing labels on re-import * *(migration)* Tolerate non-numeric values in TickTick CSV exports * *(migration)* Don't drop TickTick tasks sharing a malformed id * *(migration)* Fail loudly if a deduplicated position pair has no row * *(modal)* Open dialog reliably in electron desktop * *(modal)* Clear stale data-closing flag when re-opened mid-close * *(modal)* Skip showModal if enabled flipped false before mount * *(modal)* Print full content of modal dialogs * *(models)* Allow user-delete cascade to complete for disabled creators * *(models)* Make API tokens work on /api/v2 routes * *(models)* Validate API token permissions against v1+v2 route union * *(notifications)* Pass lang to overdue reminder translation * *(notifications)* Skip logo attachment for conversational mails * *(notifications)* Strip remote images from notification emails * *(notifications)* Refresh embedded users when reading notifications * *(notifications)* Log unexpected user refresh failures * *(notifications)* Use full user so notifications show display name * *(notifications)* Queue mails only after the notification row is committed (#3150) * *(notifications)* Render Markdown in plain-text emails (#3219) * *(oauth2server)* Accept all loopback redirect forms * *(postgres)* Resolve all statements against the configured schema (#3156) * *(print)* Hide bucket select icon * *(print)* Hide description editor when no description is present * *(print)* Hide reaction create button * *(project)* Replace CAST(... AS int) with CASE WHEN for MySQL 8 compat * *(projects)* Enforce write permission on target parent when duplicating a project (GHSA-f27p-pw2p-9pr4) * *(quick-add)* Don't abort task creation when a label can't be created (#3232) * *(relations)* Correctly position quick add magic hint (#2766) * *(routes)* Set Cache-Control: no-store on /api/v2 too * *(routes)* Apply rate-limit and metrics middleware to /api/v2 * *(routes)* Generate request IDs at the start of the middleware chain * *(search)* Mirror ParadeDB BM25 matching into the subtask parent search condition * *(security)* Clear plaintext user tokens for reset/confirm/deletion (GHSA-r6w9-259g-gwrv) * *(security)* Hash password-reset, email-confirm and deletion tokens at rest (GHSA-r6w9-259g-gwrv) * *(security)* Require Admin to detach a project from its parent (GHSA-44v6-7fxq-vgf4) * *(security)* Reject cross-project views in ProjectView Can{Delete,Update} (GHSA-gg93-x632-9ccv) * *(static)* Correct the API_URL value to replace in index.html * *(task)* Print styles * *(task)* Don't drop the list-view done save during the check animation * *(task)* Recurring tasks return to original bucket when no default is set (#2806) * *(task-comments)* Derive update event doer from authenticated user * *(tasks)* Let getCommentUrl handle frontendUrl including sub-path * *(tasks)* Disable task glance tooltip on touch devices * *(tasks)* Prevent duplicate task_positions rows and stale identifiers * *(tasks)* Add labels sequentially when the backend db serializes writes * *(tasks)* Reset description checklist when a recurring task recurs (#2941) * *(tasks)* Show filter-matched subtasks whose parent is filtered out (#2952) * *(tasks)* Prevent position race conditions with atomic upserts and locking (#3098) * *(tasks)* Bump project and task updated times when task sub-entities change * *(tasks)* Make subtask root condition NULL-safe and search-aware (#3197) * *(time-tracking)* Reject inverted time-entry intervals * *(time-tracking)* Cap smart-fill start at now so the range is never inverted * *(tooltip)* Show tooltips in top layer when inside modal dialog * *(ui)* Make code element background dark-mode aware and harden config store * *(user)* Skip last-admin guard when target is already unreachable * *(user)* Correct week_start validation range * *(user)* Stop double-encoding FrontendSettings on UpdateUser (#2793) * *(veans)* Preserve unsent task fields on update via PATCH (#2962) * *(views)* Persist list/table sort across sidebar navigation (#2778) * *(webhook)* Use same casing for basic auth fields (#2688) * Fatal with clear message when keyvalue type is redis but redis is not enabled ([85cfadc](85cfadc5b0ffb3e00a560489905b8a9840503664)) * Prevent package postinstall hang when generating jwt secret ([9456223](94562235564e69cb20fe6196f690d6763d4daee8)) * Respect allow_icon_changes config on web and desktop ([fb6f16a](fb6f16addecc3ee4012aeabdec253a35b454926a)) * Dispatch pending events after user creation commits ([b867109](b86710903b89548d0b7f8a739360a56706ea2784)) * Blur quick add input on escape ([5edc7b5](5edc7b5160fc573be25a2611754e324ad1291c0f)) * Don't re-login after logout when OIDC auto-redirect is enabled ([e25ca7a](e25ca7ab9af5f50243e59b35e3ae50828bbcc46b)) * Use correct type for permission error ([e1afa03](e1afa039cb08f35cd5c100b1a8872ffe4e471af8)) * Adapt to sentry-go v0.47 API changes ([c7413a1](c7413a1d868734dc8afbe59d0983021916718769)) * Resolve golangci-lint v2.12 findings ([93f8808](93f88084de7b4a74f5c74d19de728318b040959e)) * GCS signing issue (#2920) ([7ae80c0](7ae80c073b367724ed7b361051adcf9c94c33e05)) * Create saved filter positions before the fetch query (#3084) ([f11c90c](f11c90ca6b37692fff701657e7bad564055819b2)) * Assign bot-created projects to the bot's owner ([61d74ee](61d74ee2efec4fea6cda0036436f72f84d693e92)) * Embed frontend assets with names starting with _ or . ([568b367](568b36716426ef819fa830c556dd945a5c6e7668)) * Dispatch pending events in admin handlers ([39bbf8d](39bbf8d006953addb34d4a49a2d1c0dc46947f11)) * Only audit denied admin access for confirmed non-admins ([7217604](72176040106152e83e58c9212ce719b52d5f9015)) * Use correct label for imported tasks 'project' ([d8b4b49](d8b4b49016eefe6cde8b0e9e77a1d58311884d5b)) * Hide license-gated routes from api token scope list (#3216) ([e2c09d5](e2c09d593ca92ab582ce605f711ce4e8e7ac063a)) * Interpolate dynamic values into translated error toasts ([f388015](f388015ddaa82915197183fbed35d6a31d5bc381)) * Disable echo group 404 auto-registration to keep pre-5.3.0 routing behavior ([f76e405](f76e405b6cf3a3399487b59a9b180fd9da454fca)) Dependencies * *(deps)* Bump axios from 1.13.5 to 1.15.0 in /frontend * *(deps)* Update dependency wait-on to v9.0.5 * *(deps)* Update dependency stylelint to v17.7.0 * *(deps)* Update dev-dependencies * *(deps)* Patch follow-redirects and basic-ftp security vulnerabilities * *(deps)* Update dependency stylelint to v17.8.0 * *(deps)* Update dependency postcss to v8.5.10 * *(deps)* Update dependency electron to v40.9.1 * *(deps)* Bump dompurify from 3.3.2 to 3.4.0 in /frontend * *(deps)* Update dev-dependencies to v8.59.0 * *(deps)* Update dev-dependencies to v4.2.3 * *(deps)* Pin dependency otplib to 12.0.1 * *(deps)* Update dependency caniuse-lite to v1.0.30001790 * *(deps)* Bump github.com/Azure/go-ntlmssp * *(deps)* Bump go.opentelemetry.io/otel from 1.40.0 to 1.41.0 * *(deps)* Bump workbox-precaching to 7.4.1 to match workbox-cli * *(deps)* Bump axios from 1.15.0 to 1.15.2 in /frontend * *(deps)* Update dependency vite to v7.3.3 * *(deps)* Update dev-dependencies to v4.3.0 * *(deps)* Group node and pnpm updates across mise and version files * *(deps)* Update dependency caniuse-lite to v1.0.30001793 * *(deps)* Bump brace-expansion from 5.0.5 to 5.0.6 in /frontend * *(deps)* Update dependency vue-tsc to v3.3.0 * *(deps)* Update dev-dependencies to v8.59.4 * *(deps)* Bump @babel/plugin-transform-modules-systemjs to 7.29.4 * *(deps)* Bump fast-uri to 3.1.2 * *(deps)* Bump ip-address to 10.2.0 * *(deps)* Bump postcss to >=8.5.10 to fix XSS via unescaped </style> * *(deps)* Bump @xmldom/xmldom to 0.8.13 * *(deps)* Bump js-cookie from 3.0.5 to 3.0.7 in /frontend * *(deps)* Bump tmp to >=0.2.6 to fix path traversal vulnerability * *(deps)* Bump qs to 6.15.2 in desktop * *(deps)* Bump ip-address to >=10.1.1 in desktop workspace * *(deps)* Bump axios from 1.15.2 to 1.16.0 in /frontend * *(deps)* Update dependency vue-tsc to v3.3.3 * *(deps)* Add huma/v2 and align transitive deps * *(deps)* Update dev-dependencies to v8.60.1 * *(deps)* Update dev-dependencies to v10.9.2 * *(deps)* Update dev-dependencies to v26.14.0 * *(deps)* Update devenv * *(deps)* Update dev-dependencies to v8.61.0 * *(deps)* Update dev-dependencies to v40.10.3 * *(deps)* Update shell-quote to 1.8.4 * *(deps)* Bump tmp to >=0.2.7 to fix path traversal advisory * *(deps)* Force esbuild >=0.28.1 to fix transitive advisories * *(deps)* Bump dompurify to 3.4.9 to fix XSS advisories * *(deps)* Force form-data >=4.0.6 to fix unsafe boundary advisory * *(deps)* Tighten tar override to >=7.5.16 * *(deps)* Force markdown-it >=14.2.0 to fix ReDoS advisory * *(deps)* Force launch-editor >=2.14.1 * *(deps)* Force @babel/core >=7.29.6 * *(deps)* Bump js-yaml to >=4.2.0 where possible * *(deps)* Update dev-dependencies to v10.5.0 * *(deps)* Update dev-dependencies to v20.10.6 * *(deps)* Bump dompurify from 3.4.9 to 3.4.11 in /frontend * *(deps)* Update dev-dependencies to v4.62.1 * *(deps)* Update dev-dependencies to v4.62.2 * *(deps)* Bump desktop undici to patched versions * *(deps)* Pin dependencies * *(deps)* Update docker/dockerfile:1 docker digest to 87999aa * *(deps)* Update tiptap to v3.27.1 * *(deps)* Update actions/cache action to v6 * *(deps)* Update ghcr.io/techknowlogick/xgo:go-1.25.x docker digest to 57c6285 * *(deps)* Update postgres:18 docker digest to 4aabea7 * *(deps)* Update node.js to cd6fb7e * *(deps)* Update actions/checkout action to v7 * *(deps)* Update dependency @floating-ui/dom to v1.7.6 * *(deps)* Update dependency dayjs to v1.11.21 * *(deps)* Update dependency marked to v17.0.6 * *(deps)* Update dependency sortablejs to v1.15.7 * *(deps)* Update dependency nanoid to v5.1.16 * *(deps)* Update dependency ufo to v1.6.4 * *(deps)* Update module github.com/arran4/golang-ical to v0.3.5 * *(deps)* Update module github.com/coder/websocket to v1.8.15 * *(deps)* Update module github.com/go-ldap/ldap/v3 to v3.4.13 * *(deps)* Update actions/ai-inference action to v2.1.1 * *(deps)* Update module github.com/golang-jwt/jwt/v5 to v5.3.1 * *(deps)* Update module github.com/labstack/echo-jwt/v5 to v5.0.1 * *(deps)* Update module github.com/olekukonko/tablewriter to v1.1.4 * *(deps)* Update module github.com/sahilm/fuzzy to v0.1.3 * *(deps)* Update node.js to v24.18.0 * *(deps)* Update playwright to v1.61.1 * *(deps)* Update dependency @intlify/unplugin-vue-i18n to v11.2.4 * *(deps)* Update go to 1.26.4 in all places * *(deps)* Update dependency vue to v3.5.39 * *(deps)* Update module github.com/threedotslabs/watermill to v1.5.2 * *(deps)* Update module github.com/wneessen/go-mail to v0.7.3 * *(deps)* Update aws-sdk-go-v2 monorepo * *(deps)* Update dependency axios to v1.18.1 * *(deps)* Update pnpm to v10.34.4 * *(deps)* Update module github.com/mattn/go-sqlite3 to v1.14.47 * *(deps)* Update module github.com/aws/smithy-go to v1.27.3 * *(deps)* Update dependency @sentry/vue to v10.62.0 * *(deps)* Update dependency vue-i18n to v11.4.6 * *(deps)* Update golangci/golangci-lint-action action to v9.3.0 * *(deps)* Update font awesome * *(deps)* Update module github.com/bbrks/go-blurhash to v1.2.0 * *(deps)* Update module github.com/coreos/go-oidc/v3 to v3.19.0 * *(deps)* Update module github.com/fatih/color to v1.19.0 * *(deps)* Update module github.com/redis/go-redis/v9 to v9.21.0 * *(deps)* Update module github.com/labstack/echo/v5 to v5.2.1 * *(deps)* Update module golang.org/x/crypto to v0.53.0 * *(deps)* Update module github.com/magefile/mage to v1.17.2 * *(deps)* Update vueuse to v14.3.0 * *(deps)* Update module xorm.io/xorm to v1.4.1 * *(deps)* Update module github.com/danielgtaylor/huma/v2 to v2.38.0 * *(deps)* Update module github.com/go-sql-driver/mysql to v1.10.0 * *(deps)* Update module github.com/hashicorp/go-version to v1.9.0 * *(deps)* Update module golang.org/x/term to v0.44.0 * *(deps)* Update module github.com/lib/pq to v1.12.3 * *(deps)* Update module golang.org/x/image to v0.43.0 * *(deps)* Update ghcr.io/techknowlogick/xgo:go-1.26.x docker digest to 9887b39 * *(deps)* Update dependency undici@6 to v8 * *(deps)* Update actions/create-github-app-token action to v3 * *(deps)* Update dependency stylelint to v17.14.0 * *(deps)* Update module github.com/getsentry/sentry-go to v0.47.0 * *(deps)* Update module golang.org/x/net to v0.56.0 * *(deps)* Update dependency golangci/golangci-lint to v2.12.2 * *(deps)* Update module github.com/schollz/progressbar/v3 to v3.19.1 * *(deps)* Update dependency tar to v7.5.19 * *(deps)* Update eslint to v10 * *(deps)* Update github artifact actions * *(deps)* Update docker/setup-buildx-action action to v4 * *(deps)* Update magefile/mage-action action to v4 * *(deps)* Update docker/metadata-action action to v6 * *(deps)* Update docker/login-action action to v4 * *(deps)* Update docker/build-push-action action to v7 * *(deps)* Update low-risk dev-dependency majors * *(deps)* Update cachix/install-nix-action action to v31 * *(deps)* Update actions/stale action to v10 * *(deps)* Update dependency undici@7 to v8 * *(deps)* Update actions/github-script action to v9 * *(deps)* Update dependency postcss to v8.5.16 * *(deps)* Update dependency marked to v18 * *(deps)* Pin cachix/install-nix-action action to v31.10.6 * *(deps)* Update docker/login-action action to v4.3.0 * *(deps)* Update charmbracelet bubbletea and lipgloss to v2 * *(deps)* Update docker/metadata-action action to v6.2.0 * *(deps)* Update docker/setup-buildx-action action to v4.2.0 * *(deps)* Update softprops/action-gh-release action to v3 * *(deps)* Update pnpm/action-setup action to v6 * *(deps)* Update typescript to v6 * *(deps)* Update danielroe/provenance-action digest to 83ae780 * *(deps)* Update vite to v8 * *(deps)* Update module charm.land/bubbletea/v2 to v2.0.8 * *(deps)* Update module charm.land/lipgloss/v2 to v2.0.5 * *(deps)* Update dependency vue-router to v5 * *(deps)* Update dependency electron to v42 * *(deps)* Upgrade to pnpm 11 and migrate config to pnpm-workspace.yaml * *(deps)* Update pnpm to 11 in devenv * *(deps)* Lock file maintenance * *(deps)* Update dependency js-yaml to v5.2.1 * *(deps)* Update dependency picomatch to v4.0.5 * *(deps)* Update dependency js-yaml@4 to v5.2.1 * *(deps)* Update dependency markdown-it to v14.3.0 * *(deps)* Update dependency serialize-javascript to v7.0.7 * *(deps)* Update docker/login-action action to v4.4.0 * *(deps)* Migrate rollup override to pnpm catalog * *(deps)* Update dependency @sentry/vue to v10.63.0 * *(deps)* Update module github.com/wneessen/go-mail to v0.8.0 * *(deps)* Update dependency undici@6 to v8.6.0 * *(deps)* Update dependency undici@7 to v8.6.0 * *(deps)* Update dependency electron to v43 * *(deps)* Update module golang.org/x/text to v0.39.0 * *(deps)* Update module code.dny.dev/ssrf to v0.3.0 * *(deps)* Update pnpm to v11.10.0 * *(deps)* Update ghcr.io/techknowlogick/xgo:go-1.26.x docker digest to b00957d * *(deps)* Update danielroe/provenance-action digest to da28a90 * *(deps)* Update dependency go to v1.26.5 * *(deps)* Update postgres:18 docker digest to 3111367 * *(deps)* Update dependency undici@7 to v8.7.0 * *(deps)* Update module golang.org/x/sys to v0.47.0 * *(deps)* Update module golang.org/x/sync to v0.22.0 * *(deps)* Update postgres:18 docker digest to 22c89fe * *(deps)* Update module golang.org/x/image to v0.44.0 * *(deps)* Update dependency undici@6 to v8.7.0 * *(deps)* Update module golang.org/x/term to v0.45.0 * *(deps)* Update tiptap to v3.27.2 * *(deps)* Update module golang.org/x/net to v0.57.0 * *(deps)* Update module github.com/wneessen/go-mail to v0.8.1 * *(deps)* Update module github.com/coreos/go-oidc/v3 to v3.20.0 * *(deps)* Update cachix/install-nix-action action to v31.10.7 * *(deps)* Update actions/stale action to v10.4.0 * *(deps)* Update tiptap to v3.27.3 * *(deps)* Update dependency @sentry/vue to v10.64.0 * *(deps)* Update module github.com/yuin/goldmark to v1.8.4 * *(deps)* Update dependency @fortawesome/vue-fontawesome to v3.3.1 * *(deps)* Update dependency vite to v8.1.4 * *(deps)* Update danielroe/provenance-action digest to 97ee003 * *(deps)* Update softprops/action-gh-release action to v3.0.2 * *(deps)* Update module github.com/mattn/go-sqlite3 to v1.14.48 * *(deps)* Update postgres:18 docker digest to b913fd5 * *(deps)* Update dependency postcss to v8.5.17 * *(deps)* Update dependency dompurify to v3.4.12 * *(deps)* Update cachix/install-nix-action action to v31.11.0 * *(deps)* Update dependency @sentry/vue to v10.65.0 * *(deps)* Update dependency @floating-ui/dom to v1.8.0 * *(deps)* Update module github.com/getsentry/sentry-go to v0.48.0 * *(deps)* Update dependency tar to v7.5.20 * *(deps)* Update postgres:18 docker digest to 32ca0af * *(deps)* Update dependency postcss to v8.5.19 * *(deps)* Update pnpm to v11.11.0 * *(deps)* Update actions/setup-node action to v6.5.0 * *(deps)* Replace vendored humaecho5 with upstream humaecho adapter (#3205) * *(deps)* Update dependency @sentry/vue to v10.66.0 * *(deps)* Update actions/setup-go action to v7 * *(deps)* Update actions/setup-node action to v7 * *(deps)* Update dependency vue-router to v5.2.0 * *(deps)* Update pnpm to v11.13.1 * *(deps)* Update tiptap to v3.27.4 * *(deps)* Update module github.com/go-ldap/ldap/v3 to v3.4.14 * *(deps)* Update module github.com/aws/smithy-go to v1.27.4 * *(deps)* Update dependency @fortawesome/vue-fontawesome to v3.3.2 * *(deps)* Update module github.com/labstack/echo-jwt/v5 to v5.0.2 * *(deps)* Update dependency marked to v18.0.6 * *(deps)* Update module github.com/aws/aws-sdk-go-v2/service/s3 to v1.105.2 * *(deps)* Update dependency nanoid to v6 * *(deps)* Update dependency vue to v3.5.40 * *(deps)* Update crowdin/github-action action to v2.16.4 * *(deps)* Update dependency pinia to v4 * *(deps)* Update module github.com/labstack/echo/v5 to v5.3.0 * *(deps)* Update font awesome to v7.3.1 * *(deps)* Update tiptap to v3.28.0 * *(deps-dev)* Bump esbuild from 0.28.0 to 0.28.1 in /frontend Documentation * *(agents)* Reference crudable and migration skills in AGENTS.md * *(agents)* Add something about duplication [skip ci] * *(agents)* Comments should document the why, not the what * *(api/v2)* Add field and operation descriptions for labels * *(api/v2)* Mark server-controlled label and user fields read-only * *(api/v2)* Mark error code field read-only * *(api/v2)* Keep registrar godoc attached; clarify registry concurrency + ordering * *(api/v2)* Mark team external_id read-only * *(api/v2)* Tag LinkSharing fields for the v2 schema * *(api/v2)* Tag Webhook fields for the v2 schema * *(api/v2)* Add doc/readOnly tags to notification model fields * *(api/v2)* Tag project user share fields for the v2 schema * *(api/v2)* Tag SavedFilter fields for the v2 schema * *(api/v2)* Annotate TeamMember fields for the v2 schema * *(api/v2)* Tag project team share fields for the v2 schema * *(api/v2)* Tag bulk assignee fields for the v2 schema * *(api/v2)* Tag task bucket fields for the v2 schema * *(api/v2)* Tag project duplication fields for the v2 schema * *(api/v2)* Tag bulk task fields for the v2 schema * *(api/v2)* Tag task relation fields for the v2 schema * *(api/v2)* Tag reaction fields for the v2 schema * *(api/v2)* Tag task position fields for the v2 schema * *(api/v2)* Tag bulk label fields for the v2 schema * *(api/v2)* Tag task fields for the v2 schema * *(api/v2)* Tag task attachment fields for the v2 schema * *(api/v2)* Tag CalDAV token fields for the v2 schema * *(api/v2)* Tag TOTP fields for the v2 schema * *(audit)* Add package documentation * *(frontend)* Document styles architecture and token system * *(models)* Add doc and readOnly tags to Session fields for v2 * *(models)* Tag APIToken fields for v2 OpenAPI reflection * *(models)* Tag TaskAssignee fields for the v2 schema * *(search)* Describe the actual constant-score relevance semantics * *(skills)* Hint at readOnly tags for server-controlled v2 fields * *(skills)* Document v2 self-registration pattern * *(skills)* Note v2 query params must be direct fields on the handler input * *(task-comments)* Trim comments to the non-obvious why * *(veans)* Add README with quick-start guide * *(veans)* AGENTS.md cheat sheet for coding agents * *(webhooks)* Version-qualify the events endpoint link in the events field doc * Add api-v2-routes skill and freeze /api/v1 ([d2a3186](d2a3186b3ed40214b9c385284868d7f10e573811)) * Redirect translation requests to translation guide ([a35518a](a35518a099b3c5561a06e43af27608af5f93397b)) * Trim wordy comments to load-bearing whys ([fb4bca3](fb4bca34ddd9ce2ed55bc7c184255a6f418119d6)) * Trim wordy comments in v2 notifications ([604e585](604e5850bc32d95df22141083b44a83a53a290a5)) * Update contribution guidelines about AI generated code ([afbfda5](afbfda58d50ee8714dd920c2cdc504415f8ba256)) * Fix typo in autotls.enabled description ([123e480](123e4809f30433d71c986a3c8eab251af9dae894)) * Fix @Success 200 -> 201 on 5 PUT/Create endpoints ([44ed50d](44ed50d508d4da1c7bc46f73c8cd6ac01eafc7c4)) Features * *(a11y)* Add i18n keys for accessibility labels * *(a11y)* Add skip navigation link and main landmark on auth pages * *(a11y)* Add accessible names to icon-only buttons * *(a11y)* Add aria-live region to toast notifications * *(a11y)* Add accessible names to modal dialogs * *(a11y)* Use autocomplete='new-password' on register form * *(a11y)* Fix logo link accessible name to include 'Vikunja' * *(a11y)* Associate form errors with input fields * *(a11y)* Add labels to color picker and sort select * *(a11y)* Fix heading hierarchy across pages * *(a11y)* Add descriptive labels to task checkboxes * *(a11y)* Associate errors with inputs in FormInput and FormSelect * *(admin)* Add /admin route group and overview endpoint * *(admin)* Add users/projects list endpoints and is_admin patch * *(admin)* Add user status and delete endpoints with reassign owner * *(admin)* Add create-user endpoint * *(admin)* Add typed models for admin users and overview * *(admin)* Add frontend admin shell, views, services, and routes * *(admin)* Wire up /admin route group with all endpoints * *(agents)* Add crudable skill for CRUDable + permissions guidance * *(agents)* Add migration skill for DB migration safety * *(api)* Add GET /projects/:project/tasks/by-index/:index endpoint * *(api)* Bot token support via /tokens CRUD and bot_users_enabled flag * *(api)* Accept project identifier in by-index task route * *(api)* Lowercase project identifier before by-index lookup * *(api)* Add v2 markdown conversion helpers * *(api)* Exchange rich-text fields as markdown on v2 * *(api-v2)* Vendor scalar api docs bundle * *(api/v2)* Declare JWTKeyAuth security scheme * *(api/v2)* Enable AutoPatch for automatic JSON Merge Patch * *(api/v2)* Port Label to per-operation Huma handlers * *(api/v2)* Serve Scalar docs UI at /api/v2/docs * *(api/v2)* Preserve Vikunja numeric error code in problem+json * *(api/v2)* Add task duplicate action (#2815) * *(api/v2)* Add project view routes * *(api/v2)* Gate admin routes by feature + instance admin * *(api/v2)* Serve user avatars * *(api/v2)* Upload user avatar via multipart * *(api/v2)* Add team CRUD endpoints * *(api/v2)* Add nested task comment CRUD * *(api/v2)* Add shared conditional read helper and document list params * *(api/v2)* Report max_permission on label and project-view reads * *(api/v2)* Add Project CRUD on /api/v2 * *(api/v2)* Report max_permission on task comment reads * *(api/v2)* Report max_permission on team reads * *(api/v2)* Add session list/delete on /api/v2 * *(api/v2)* Add task labels (create/list/delete) on /api/v2 * *(api/v2)* Add API token list/create/delete on /api/v2 * *(api/v2)* Add bot user CRUD on /api/v2 * *(api/v2)* Add link sharing (create/read/list/delete) * *(api/v2)* Add task assignees (create/list/delete) on /api/v2 * *(api/v2)* Add project webhooks CRUD on /api/v2 * *(api/v2)* Enforce validation centrally in the Register wrapper * *(api/v2)* Return 422 with invalid_fields for validation errors * *(api/v2)* Add subscribe/unsubscribe on /api/v2 * *(api/v2)* Add notifications list/mark-read + mark-all on /api/v2 * *(api/v2)* Add project user shares CRUD on /api/v2 * *(api/v2)* Add saved filter CRUD on /api/v2 * *(api/v2)* Add team members (add/remove/admin-toggle) on /api/v2 * *(api/v2)* Add project team shares CRUD on /api/v2 * *(api/v2)* Add bulk assignee replacement on /api/v2 * *(api/v2)* Add task read-status marking on /api/v2 * *(api/v2)* Add kanban task-bucket moves on /api/v2 * *(api/v2)* Add project duplication on /api/v2 * *(api/v2)* Add bulk task updates on /api/v2 * *(api/v2)* Add task relations on /api/v2 * *(api/v2)* Add reactions on /api/v2 * *(api/v2)* Add task position updates on /api/v2 * *(api/v2)* Add bulk label replacement on /api/v2 * *(api/v2)* Add task CRUD on /api/v2 * *(api/v2)* Add task attachments on /api/v2 * *(api/v2)* Add CalDAV tokens on /api/v2 * *(api/v2)* Add TOTP 2FA on /api/v2 * *(api/v2)* Add user webhooks on /api/v2 * *(api/v2)* Add user account-deletion flow on /api/v2 * *(api/v2)* Add user account/settings on /api/v2 * *(api/v2)* Add task collection (task lists) on /api/v2 * *(api/v2)* Port OAuth migrators (Todoist, Trello, Microsoft To-Do) * *(api/v2)* Add admin actions on /api/v2 * *(api/v2)* Add project background endpoints * *(api/v2)* Add public instance info endpoint * *(api/v2)* Add available webhook events endpoint * *(api/v2)* Add user search endpoints * *(api/v2)* Add public auth routes (register, password, confirm, link-share) * *(api/v2)* Add OAuth 2.0 token and authorize endpoints * *(api/v2)* Add token-check, token-routes and link-share renew endpoints * *(api/v2)* Add project background upload on /api/v2 * *(api/v2)* Add file migrators (vikunja-file, ticktick, wekan) on /api/v2 * *(api/v2)* Add the generic CSV importer on /api/v2 * *(api/v2)* Add project background download and unsplash proxies * *(api/v2)* Add e2e testing-support endpoints on /api/v2 * *(api/v2)* Add totp qr code endpoint * *(api/v2)* Add user data export endpoints * *(api/v2)* Add login and logout on /api/v2 * *(api/v2)* Add OpenID Connect callback on /api/v2 * *(api/v2)* Port refresh-token endpoint to /api/v2 * *(api/v2)* Expose healthcheck as a documented endpoint * *(api/v2)* Expose notifications atom feed in the OpenAPI spec * *(api/v2)* Expose websocket endpoint under /api/v2 * *(api/v2)* Add kanban bucket CRUD endpoints * *(audit)* Add audit logging package * *(audit)* Wire request-meta middleware and writer initialization * *(audit)* Register the audited event surface * *(audit)* Attribute failed logins to the originating request * *(audit)* Emit the login event for the OAuth code exchange * *(auth)* Include is_admin in JWT claims * *(auth)* Reject password login for bot users * *(auth)* Add GetAuthFromContext for Huma handlers * *(auth)* Add OpenID provider availability monitoring and retry logic (#3145) * *(avatar)* Use distinct marble palette for bot users * *(build)* Add centralized release magefile module * *(caldav)* Reject basic auth for bot users * *(caldav)* Serialize task descriptions as markdown * *(caldav)* Emit STATUS:NEEDS-ACTION for incomplete todos * *(caldav)* Implement RFC 6578 sync-collection REPORT to sync task deletions * *(ci)* Add multi-architecture support for OS package builds (#2610) * *(ci)* Add publish-repos job for OS package repository metadata * *(ci)* Sign RPM packages with GPG via nfpm * *(ci)* Sign archlinux packages with GPG for pacman verification * *(ci)* Add release-binaries and release-os-package composite actions * *(cli)* Add user set-admin command (license-gated) * *(client)* Add parent_project_id and position to Project wire type * *(comments)* Treat quoted comment authors as implicit mentions * *(comments)* Reply action with prefilled quote and jump-to-original chevron * *(config)* Add license.key configuration option * *(config)* Add service.enablebotusers flag * *(config)* Add audit logging config keys * *(date)* Show the matching preset name on the date-range button * *(date)* Accept a null modelValue in DatepickerWithRange * *(db)* Add license_status table migration * *(db)* Add is_admin column to users * *(editor)* Add lazy emoji data loader and filter * *(editor)* Add EmojiList popup component * *(editor)* Add emoji suggestion handler * *(editor)* Add emoji TipTap extension * *(editor)* Register emoji autocomplete extension * *(editor)* Preserve comment-id on blockquotes * *(editor)* Add focus style around the whole editor * *(editor)* Allow setting image alt text (#3206) * *(editor)* Prompt for alt text when inserting an image * *(events)* Carry request metadata onto dispatched event messages * *(events)* Add auth boundary events * *(filters)* Add Tomorrow option to date range dropdown * *(filters)* Generate open task saved filter on user creation * *(filters)* Translate My Open Tasks title in frontend * *(frontend)* Add FormInput primitive component * *(frontend)* Add FormSelect primitive component * *(frontend)* Add FormCheckbox primitive component * *(frontend)* Expose isAdmin on current user and add config feature check * *(frontend)* Introduce TimeDisplay component * *(frontend)* Add bot user model support and badge * *(frontend)* Add bot settings page and services * *(frontend)* Apply quick add magic when creating related tasks * *(frontend)* Add Atom feed settings page and notifications discovery (#2760) * *(frontend)* Preload assignee list on click with current user first (#2704) * *(i18n)* Add strings for quick add default reminders * *(i18n)* Make Greek available in the language selector * *(i18n)* Add persian to list of selectable languages * *(init)* Integrate license validation into startup and shutdown * *(init)* Use the hierarchical fuzzy picker for project selection * *(input)* Add quick-select shortcuts to the Datepicker * *(keyvalue)* Add RememberFor for TTL-cached values * *(labels)* Let bot owners manage labels created by their bots * *(license)* Add license key validation package * *(license)* Expose enabled_pro_features on /info * *(license)* Add runtime state snapshot and reload helpers * *(logging)* Include user agent in HTTP access log * *(mage)* Support existing branches in dev:prepare-worktree * *(magefile)* Bidirectional translation key validation * *(magefile)* Detect indirect api translation key references * *(metrics)* Invalidate the user count cache on registration * *(middleware)* Add RequireFeature and RequireSiteAdmin 404 gates * *(middleware)* Normalize PHP-style array query params * *(migration)* Add bot_owner_id column to users * *(migration)* Import recurring tasks from todoist * *(migration/wekan)* Import attachments from board export * *(models)* Add BotUser CRUD wrapper * *(models)* Accept v2 PATCH as alias for PUT in API token matcher * *(models)* Let TaskCollection force a flat task list * *(oauth2server)* Accept loopback redirect URIs * *(packaging)* Add systemd security hardening to service * *(permissions)* Site admins bypass all Can* checks (license-gated) * *(picker)* Add hierarchical fuzzy project picker * *(pro)* Admin password reset for existing users (#3085) * *(project)* Add before-delete slot to ProjectSettingsDropdown * *(projects)* Always store identifiers as uppercase (#2775) * *(projects)* Make duplicating shares opt-in (#2932) * *(projects)* Make gantt chart zoom in if there are space available * *(reminders)* Add allowAbsolute prop to ReminderDetail * *(richtext)* Add HTML to Markdown conversion * *(richtext)* Add Markdown to HTML conversion with mention rebuild * *(richtext)* Add markdown-domain change detection * *(routes)* Scaffold /api/v2 Echo group * *(search)* Rank ParadeDB search results by relevance * *(search)* Add explicit relevance sort field * *(search)* Boost title matches 1.5x over description matches * *(settings)* Add quickAddDefaultReminders field to frontend settings * *(settings)* Surface quick add default reminders in user settings * *(sharing)* Sort team members by display name in UI and by ID in API (#2784) * *(task)* Move new comment form to match sort order (#2789) * *(tasks)* Add GetTaskByProjectAndIndex resolver * *(tasks)* Enforce unique (project_id, index) via migration * *(tasks)* Apply default reminders to quick-add tasks with due date * *(tasks)* Soft-delete tasks with permanent deletion after 30 days (#3119) * *(time-tracking)* Add the time_entries table migration * *(time-tracking)* Add the time_entries model * *(time-tracking)* Filter time entries with the task DSL * *(time-tracking)* Expose time entries on the v2 API * *(time-tracking)* Dispatch time-entry events * *(time-tracking)* Count tracked time entries per task * *(time-tracking)* Broadcast timer changes over websocket * *(time-tracking)* Let clients subscribe to timer events * *(time-tracking)* Add the v2 time-entry service * *(time-tracking)* Add the time-tracking store * *(time-tracking)* Extract the smart-fill start computation * *(time-tracking)* Add the time-entry form * *(time-tracking)* Add the time-entry list * *(time-tracking)* Add the timer badge * *(time-tracking)* Show a running-elsewhere badge in the header * *(time-tracking)* Add the sidebar navigation entry * *(time-tracking)* Add the task-detail time-tracking section * *(time-tracking)* Add the time-tracking view * *(time-tracking)* Configure the smart-fill start time in settings * *(time-tracking)* Add favicon indicator for active time tracking sessions (#2937) * *(user)* Add IsAdmin field to User struct * *(user)* Extract last-admin guard and close invariant gaps * *(user)* Support all weekdays as week start * *(user)* Add BotOwnerID field and IsBot helper * *(user)* Add bot-related error types * *(user)* Reserve bot- username prefix for regular signup * *(user)* Add CreateBotUser * *(user)* Always include own bots in user search * *(veans)* Scaffold Go module * *(veans)* Add stable error envelope and code constants * *(veans)* Add JSON HTTP client and wire types * *(veans)* Add cobra root and version subcommand * *(veans)* Add credential store with keychain, env, and file backends * *(veans)* Add transient human auth flow * *(veans)* Add .veans.yml schema and config helpers * *(veans)* Add canonical status to bucket-title mapping * *(veans)* Require APIToken.ExpiresAt with FarFuture sentinel * *(veans)* Discover /routes for permission-group negotiation * *(veans)* Orchestrate init bootstrap from probe to config write * *(veans)* Wire init cobra command * *(veans)* Add shared command runtime and git branch helper * *(veans)* Add list command with filters and JSON output * *(veans)* Add show command with PROJ-NN/#NN ID resolver * *(veans)* Add label get-or-create helper * *(veans)* Add create command with labels and relations * *(veans)* Add update command with description and status transitions * *(veans)* Add claim command for assigning and bucket transition * *(veans)* Add prime command for agent prompt injection * *(veans)* Add api passthrough command * *(veans)* Add login command for token rotation * *(veans)* Use OAuth 2.0 Authorization Code + PKCE as default auth * *(veans)* Add browser launcher helpers for OAuth flow * *(veans)* Switch OAuth handshake to a loopback HTTP server * *(veans)* Reuse owned bot or prompt for fresh name on collision * *(veans)* Match existing bucket titles via case-insensitive alias table * *(veans)* Install agent hooks during init instead of just printing * *(veans)* URL discovery on init, port of the frontend's heuristic * *(veans)* Offer "create a new project" from init's picker * *(veans)* Make the HTTP client timeout configurable via .veans.yml * *(veans)* Warn when Chain.Set falls back past a failed backend * *(veans)* Build and publish veans alongside vikunja * Add Mage targets for OS package repository metadata ([8cc1a0b](8cc1a0b30f126268952dde1d1c0aaf477e8c2b1c)) * Add license comments for agents and humans ([35f1839](35f183979c00580bb0f0ed5606587e4cb8723249)) * Support filter_include_nulls in project view configuration ([e97b629](e97b629d6c35319bf46a8f1c8779a11a43e5d57d)) * Always enable bot users ([d9a5958](d9a5958bb872f03af378b0acad5774f039ec5440)) * Add Atom feed for user notifications with API token auth (#2758) ([70393f3](70393f38d21d6f2004cbf468c02e6fcf35c13ad2)) * Vendor humaecho adapter for echo/v5 ([5fa6d66](5fa6d66c41d29b8b47a97a184b33de9827a55d4e)) * Auto-redirect to OIDC provider on login when it's the only option ([18ee92f](18ee92f22782be62e914131bf76a577a4567215f)) * Audit admin user and project mutations ([6f21c57](6f21c57c78a5ce1058a93e73e3019d8979acdf16)) * Audit admin reads and denied admin access ([3a666da](3a666da860aa85f0bf954fd14d3aa2ede5c816a5)) Miscellaneous Tasks * *(a11y)* Add lint rule flagging icon-only buttons without accessible name * *(agents)* Remove CRUSH.md * *(ci)* Remove stale label from PR when there is activity * *(ci)* Don't report duplicate dependencies * *(ci)* Update ci service containers at most once a week * *(config)* Disable icon changes by default * *(dev)* Move devcontainer config to .devcontainer/ directory * *(dev)* Remove leftover .envrc * *(frontend)* Enable vue/multi-word-component-names with legacy allowlist * *(i18n)* Update translations via Crowdin * *(i18n)* Remove unused backend translation keys * *(i18n)* Remove unused frontend translation keys * *(lint)* Suppress contextcheck on OIDC provider init call sites * *(mage)* Silence gosec on worktree branch-exists helpers * *(search)* Consolidate scoring comments and deduplicate test helpers * *(veans)* Add magefile build and lint targets * *(veans)* Gitignore built binary * *(veans)* Add veans-local golangci config * *(veans)* Apply veans golangci pass across sources * Update stale workflow ([12f0752](12f07529e567dc15ee660fb827f8fbd4e6bd283b)) * Add mise.toml to pin tool versions ([2b38c2a](2b38c2a19693bf514fd5ffcb4babb004cd366161)) Other * *(other)* Add AI-powered auto-labeling for new issues and PRs * *(other)* Add tests using mysql-8 * *(other)* [skip ci] Updated swagger docs * *(other)* Run frontend translation check as a hard failure * *(other)* Improve modal responsive sizing with inline-size constraints (#2716) * *(other)* Register custom actionlint runner labels * *(other)* Prebuild static build/mage for repo metadata containers * *(other)* Move build-mage prep job out of test.yml into release.yml * *(other)* Reduce Preview docker build cache to mode=min to fit GHA cache budget * *(other)* Stop Preview docker build from using GHA cache (fixes "failed to reserve cache") * *(other)* Let stale bot close PRs waiting for reply * *(other)* Extract golangci-lint setup into reusable action (#3142) * *(time-tracking)* Add the time-tracking UI strings * *(veans)* Add veans-e2e workflow * *(veans)* Add veans-lint job to Test workflow * *(veans)* Add fast veans-test job for unit tests Performance * *(tasks)* Batch task position existence check into one query Refactor * *(admin)* Extract shared admin overview, user-create and user-view helpers * *(admin)* Share user-mutation logic between v1 and v2 * *(api/v2)* Register upload route as RegisterAvatarUploadRoutes * *(api/v2)* Self-register resource routes via init() registry * *(api/v2)* Align project max_permission to the shared embed pattern * *(api/v2)* Dedup task collection query params via exported embed * *(api/v2)* Dedup the admin user-mutation handlers * *(api_tokens)* Preserve pre-set OwnerID in Create * *(audit)* Move package docs into entry.go * *(auth)* Extract shared auth/token business logic for v2 reuse * *(auth)* Extract transport-agnostic login, logout and OIDC cores * *(avatar)* Share avatar resolution between v1 and v2 handlers * *(avatar)* Share avatar-upload logic between v1 and v2 handlers * *(background)* Share upload validation between v1 and v2 handlers * *(background)* Extract download + unsplash-proxy logic for reuse * *(ci)* Split publish-repos into matrix with native containers * *(ci)* Call release composite actions from release.yml * *(ci)* Derive composite-action inputs from project name * *(config)* Add PRO_FEATURE constants for licensed features * *(events)* Pass context to DispatchPending directly * *(events)* Use a concrete doer on project and team events * *(feeds)* Extract atom feed builder + basic-auth validator for reuse * *(files)* Extract WriteFileDownload shared by attachment download * *(frontend)* Inline modal-card-head-padding in Card footer * *(frontend)* Inline modal-content-spacing-tablet in PDF preview * *(frontend)* Drop unused Bulma modal partial import * *(frontend)* Drop unused Bulma form/file partial import * *(frontend)* Replace for...in usages and forbid via lint rule * *(frontend)* Replace reverse-index splice loops with findIndex/filter * *(frontend)* Port is-pulled-right locally and drop Bulma float helper * *(frontend)* Drop Bulma components/media import * *(frontend)* Drop Bulma components/card import (#2639) * *(frontend)* Migrate .box to Card and drop Bulma elements/box (#2640) * *(frontend)* Drop Bulma components/navbar import * *(frontend)* Support two-col layout on FormField * *(frontend)* Use form primitives in user settings General view * *(frontend)* Use form primitives in WebhookManager * *(frontend)* Use FormCheckbox for remember-me on Login * *(frontend)* Port pagination rules into BasePagination and drop Bulma import * *(frontend)* Extract PaginationItem to own pagination-link styling * *(frontend)* Extract SideNavShell for admin and user settings * *(frontend)* Port checkbox-radio rules into FormCheckbox and drop Bulma import * *(handler)* Extract DoCreate from CreateWeb * *(handler)* Extract DoReadOne from ReadOneWeb * *(handler)* Extract DoReadAll from ReadAllWeb * *(handler)* Extract DoUpdate from UpdateWeb * *(handler)* Extract DoDelete from DeleteWeb * *(handler)* Return domain error for forbidden instead of echo.HTTPError * *(license)* Return typed feature slice for JSON encoding * *(magefile)* Consolidate api+frontend translation checks into one task * *(metrics)* Count entities on demand with a TTL cache * *(metrics)* Drop the user count listener * *(metrics)* Drop the project/task/team/attachment count listeners * *(metrics)* Drop inline file count tracking * *(migration)* Extract file/CSV migrate orchestration into shared funcs * *(models)* Remove *Arr helper fields now handled by normalizer * *(notifications)* Refresh users via an explicit type switch * *(projects)* Use getAllProjectsForUser in getProjectsToDelete (#2616) * *(register)* Use models.RegisterUser helper * *(reminders)* Make Reminders.vue take ITaskReminder[] directly * *(task-attachment)* Share upload+download via pkg/web/files for v1+v2 * *(tasks)* Drop in-memory task dedup, rely on unique index * *(testing)* Extract e2e fixture reset/truncate into shared package * *(time-tracking)* Drop the now-redundant duration clamp in the entry list * *(user)* Remove the now-empty listeners file * *(user)* Extract shared account orchestration into models/user/shared for v1+v2 * *(user)* Share user-search logic between v1 and v2 * *(veans)* Migrate API client from v1 to v2 * *(webhooks)* Mask write-only credentials in the model so create/update never echo them * Update reprepro-dist-conf for multi-arch with stable and unstable suites ([540beef](540beefabcc74f00b69bd23d455d765e390509fb)) * Drop Release.* from project magefiles and point Dockerfile at build/ ([304fe55](304fe55da70e1dfbae4f800b93e0307df390fa4a)) * Extract preprocessFilterString from task filter parsing ([26c067c](26c067cc3899ac77ea4bc3ba2250b71d4a5cb864)) Testing * *(admin)* Add webtests for /admin/* endpoints and share bypass * *(admin)* Add e2e tests for admin panel * *(api)* Cover positive project-identifier resolution * *(api/v2)* Label round-trip, ETag, PATCH, error shapes * *(api/v2)* Defer session close in admin webtest * *(api/v2)* Defer license reset in admin webtest * *(api/v2)* Assert admin project id via structured json * *(api/v2)* Cover include_public team surfacing and its config gate * *(api/v2)* Port full v1 team coverage (permission matrix, public discovery, exact cardinality, DB persistence) * *(api/v2)* Port full v1 label coverage * *(api/v2)* Port full v1 project view coverage * *(api/v2)* Port full v1 admin projects coverage * *(api/v2)* Prove author-only comment restriction with a writer non-author * *(api/v2)* Port full v1 task comment coverage (permission matrix, IDOR, search) * *(api/v2)* Port full v1 avatar coverage to TestAvatar * *(api/v2)* Port full v1 TaskDuplicate coverage * *(api/v2)* Port full v1 project coverage (permission matrix, archived) * *(api/v2)* Isolate project tests per-handler, not via shared harness * *(api/v2)* Strengthen project max_permission assertions * *(api/v2)* Assert task comment max_permission and per-caller ETag * *(api/v2)* Assert team max_permission + etag reflects permission * *(api/v2)* Assert both ETags non-empty in team permission test * *(api/v2)* Webhook CRUD permission matrix and config gate * *(api/v2)* Cover central validation (422, invalid_fields, full-body webhook updates) * *(api/v2)* Split the B1 webtests into per-route files * *(api/v2)* Cover ported auth/token endpoints * *(api/v2)* Cover the v2 file and CSV migrator endpoints * *(api/v2)* Cover background download and unsplash proxy routes * *(api/v2)* Use cross-engine datetime literals in testing webtest * *(api/v2)* Cover v2 login, logout and OIDC gating * *(audit)* Cover listener pipeline, license gating and rotation * *(auth)* Cover env-var string booleans for oidc providers (#2599) * *(e2e)* Mirror task id to index in TaskFactory * *(e2e)* Cover quick add auto-attaching default reminders * *(e2e)* Add user settings nav helper * *(e2e)* Add SessionFactory with sha256 token hashing * *(e2e)* Add WebhookFactory * *(e2e)* Add TotpFactory with fixed seed * *(e2e)* Add otplib dev dep for TOTP tests * *(e2e)* Cover TOTP enrollment flow * *(e2e)* Cover TOTP disable flow * *(e2e)* Assert wrong TOTP passcode is rejected * *(e2e)* Cover caldav token creation end-to-end * *(e2e)* Cover caldav token deletion * *(e2e)* Assert wrong password blocks email change * *(e2e)* Cover sessions list with current marker * *(e2e)* Assert session delete breaks refresh * *(e2e)* Assert current session has no delete control * *(e2e)* Cover account deletion request flow * *(e2e)* Cover scheduled deletion cancel flow * *(e2e)* Cover data export request flow * *(e2e)* Validate webhook target url * *(e2e)* Require at least one webhook event * *(e2e)* Create and delete a webhook * *(e2e)* Drop unused authenticatedPage from webhooks beforeEach * *(e2e)* Cover attachment deletion * *(e2e)* Assert readers cannot delete attachments * *(e2e)* Cover recurrence preset buttons * *(e2e)* Assert recurring task regenerates on complete * *(e2e)* Cover monthly repeat mode UI * *(e2e)* Drop unused authenticatedPage from recurrence beforeEach * *(e2e)* Add TeamProjectFactory * *(e2e)* Cover team READ permission boundary * *(e2e)* Cover team READ_WRITE permission * *(e2e)* Cover team share revocation * *(e2e)* Cover link share password protection * *(e2e)* Cover link share permission tiers * *(e2e)* Widen recurrence due-date tolerance to 5s * *(e2e)* Await DELETE in session revoke test to avoid race * *(e2e)* Await DELETE in caldav token revoke test to avoid race * *(e2e)* Use ISOString for date seeding to prevent timezone parsing errors * *(e2e)* Cover comment replies end-to-end * *(e2e)* Seed hashed user tokens in TokenFactory (GHSA-r6w9-259g-gwrv) * *(e2e/kanban)* Cover recurring task drag to done bucket (#2618) * *(e2e/kanban)* Seed the view only once with done_bucket_id * *(editor)* Add e2e for emoji autocomplete * *(frontend)* Update form primitive tests for admin input usage * *(kanban)* Cover moveTaskToBucket * *(keyvalue)* Cover RememberFor TTL caching * *(metrics)* Verify counts are read from the right table * *(middleware)* Lock in array-param order preservation * *(modal)* Cover open race for #2590 * *(project)* Pin archived propagation aggregation in ReadAll CTE * *(search)* Pin ParadeDB matching contract with a behavioral test suite * *(tasks)* Pin subtask root placement for fuzzy search and multi-parent scopes * *(time-tracking)* Cover the time_entries model * *(time-tracking)* Cover the v2 time-entry routes * *(time-tracking)* Add end-to-end coverage * *(trello)* Serve testimage from local server instead of vikunja.io * *(trello)* Drop redundant BackgroundImage assignment in getTestBoard * *(user)* Add tests for updating week start day and verifying date picker behavior * *(veans)* Add e2e suite covering init, tasks, claim, prime flows * *(veans)* Pin runUpdate's call-order invariants * *(veans)* Cover credential-store hardening invariants * *(veans)* Cover the stable error-envelope contract * *(veans)* Cover client error mapping, pagination, and 404→BOT_USERS_UNAVAILABLE * *(veans)* Cover OAuth callback handler error paths * *(veans)* Cover bootstrap validators and prompt UX * Assert I18nParams keys against en.json translation placeholders ([c34972a](c34972a6baa86cb1f611436bbb66c5ea35ab31d0)) * Cover getErrorText interpolation of i18n_params ([f405fc5](f405fc5a7812f938eecf25728671ea8d9b69a2d4)) # -----BEGIN SSH SIGNATURE----- # U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgAK0Z2e05yM7/bFYXmybwyuBJmn # Hi4ErahslfXT/zdbIAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5 # AAAAQMCCrIfzAhQrBtNxMzYoR1SuSCuItcmFjVwd2sfrLKrsNzRKfL0nS550yIi+6tbL3y # YqWG/fcGPSIoG1QYLB3Qs= # -----END SSH SIGNATURE----- # gpg verification failed.
2 parents 46c696e + 907850f commit 62cbf4f

522 files changed

Lines changed: 33210 additions & 10085 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/skills/api-v2-routes/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ user-invocable: true
66

77
# Adding /api/v2 routes for a CRUDable resource
88

9-
`/api/v2` is served by [Huma v2](https://github.com/danielgtaylor/huma) mounted on an Echo group via the vendored `pkg/modules/humaecho5` adapter. Unlike v1's generic `WebHandler`, each operation is a typed Huma handler registered explicitly. The handlers are thin: they pull auth off the context, call the same `pkg/web/handler.Do*` functions v1 uses, and translate domain errors into RFC 9457 responses.
9+
`/api/v2` is served by [Huma v2](https://github.com/danielgtaylor/huma) mounted on an Echo group via Huma's upstream `humaecho` adapter plus the `pkg/modules/humabridge` glue (echo-context stashing, group-prefix rewriting for AutoPatch). Unlike v1's generic `WebHandler`, each operation is a typed Huma handler registered explicitly. The handlers are thin: they pull auth off the context, call the same `pkg/web/handler.Do*` functions v1 uses, and translate domain errors into RFC 9457 responses.
1010

1111
**Reference implementation:** `pkg/routes/api/v2/labels.go` is the canonical example — copy its shape. Shared envelopes live in `pkg/routes/api/v2/types.go`; the auth/error bridge in `pkg/routes/api/v2/errors.go`; config in `pkg/routes/api/v2/huma.go`.
1212

.envrc

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: golangci-lint
2+
description: |
3+
Set up Go and run golangci-lint on a Go module.
4+
Caches the analysis dir explicitly instead of using the lint action's
5+
built-in cache: that cache's key omits the Go version, so with
6+
go-version: stable a toolchain bump restores facts cached under the
7+
previous Go release, which yields staticcheck false positives
8+
(e.g. SA5011 on t.Fatal nil-guards) on every PR until the key rotates.
9+
inputs:
10+
version:
11+
description: 'golangci-lint version to run'
12+
required: false
13+
default: 'v2.12.2'
14+
working-directory:
15+
description: 'Module directory to lint, relative to the repo root'
16+
required: false
17+
default: '.'
18+
runs:
19+
using: "composite"
20+
steps:
21+
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
22+
id: go
23+
with:
24+
go-version: stable
25+
cache-dependency-path: ${{ inputs.working-directory }}/go.sum
26+
- name: Cache golangci-lint analysis
27+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
28+
with:
29+
path: ~/.cache/golangci-lint
30+
key: golangci-lint-${{ inputs.working-directory }}-${{ inputs.version }}-${{ steps.go.outputs.go-version }}-${{ hashFiles(format('{0}/go.sum', inputs.working-directory)) }}
31+
restore-keys: |
32+
golangci-lint-${{ inputs.working-directory }}-${{ inputs.version }}-${{ steps.go.outputs.go-version }}-
33+
- uses: golangci/golangci-lint-action@ba0d7d2ec06a0ea1cb5fa41b2e4a3ab91d21278a # v9.3.0
34+
with:
35+
version: ${{ inputs.version }}
36+
working-directory: ${{ inputs.working-directory }}
37+
skip-cache: true

.github/actions/release-binaries/action.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ runs:
7979
} >> "$GITHUB_ENV"
8080
8181
- name: Download Mage binary
82-
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
82+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
8383
with:
8484
name: mage_bin
8585

@@ -89,7 +89,7 @@ runs:
8989

9090
- name: Download frontend dist (vikunja only)
9191
if: inputs.project == 'vikunja'
92-
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
92+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
9393
with:
9494
name: frontend_dist
9595
path: frontend/dist
@@ -110,7 +110,7 @@ runs:
110110
sudo mv upx-5.0.0-amd64_linux/upx /usr/local/bin
111111
112112
- name: Setup xgo cache
113-
uses: useblacksmith/cache@71c7c918062ba3861252d84b07fe5ab2a6b467a6 # v5
113+
uses: useblacksmith/cache@c5fe29eb0efdf1cf4186b9f7fcbbcbc0cf025662 # v5.1.0
114114
with:
115115
path: /home/runner/.xgo-cache
116116
key: xgo-${{ inputs.project }}-${{ hashFiles('**/go.sum') }}
@@ -133,7 +133,7 @@ runs:
133133
cd build && mage release:build "$PROJECT"
134134
135135
- name: GPG setup
136-
uses: kolaente/action-gpg@main
136+
uses: kolaente/action-gpg@eb0fd8f16fe9b499f060f659092c470cb9f76eb7 # main
137137
with:
138138
gpg-passphrase: ${{ inputs.gpg-passphrase }}
139139
gpg-sign-key: ${{ inputs.gpg-sign-key }}
@@ -164,7 +164,7 @@ runs:
164164
done
165165
166166
- name: Upload zips to S3
167-
uses: kolaente/s3-action@main
167+
uses: kolaente/s3-action@7f58dddd682b2f93a6c6799c9f68e7a38f2da558 # main
168168
with:
169169
s3-access-key-id: ${{ inputs.s3-access-key-id }}
170170
s3-secret-access-key: ${{ inputs.s3-secret-access-key }}
@@ -176,14 +176,14 @@ runs:
176176
strip-path-prefix: ${{ env.DIST_PREFIX }}/zip/
177177

178178
- name: Store binaries
179-
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
179+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
180180
with:
181181
name: ${{ env.ARTIFACT_BINARIES_NAME }}
182182
path: ./${{ env.DIST_PREFIX }}/binaries/*
183183

184184
- name: Store binary packages
185185
if: github.ref_type == 'tag'
186-
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
186+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
187187
with:
188188
name: ${{ env.ARTIFACT_ZIPS_NAME }}
189189
path: ./${{ env.DIST_PREFIX }}/zip/*

.github/actions/release-os-package/action.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,12 @@ runs:
9191
echo "S3_TARGET_PATH=/${PROJECT}/${VERSION_OR_UNSTABLE}" >> "$GITHUB_ENV"
9292
9393
- name: Download project binaries
94-
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
94+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
9595
with:
9696
name: ${{ env.BINARIES_ARTIFACT_NAME }}
9797
path: ${{ env.BINARIES_DOWNLOAD_PATH }}
9898

99-
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6
99+
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
100100
with:
101101
go-version: stable
102102

@@ -123,7 +123,7 @@ runs:
123123

124124
- name: GPG setup for archlinux signing
125125
if: inputs.packager == 'archlinux'
126-
uses: kolaente/action-gpg@main
126+
uses: kolaente/action-gpg@eb0fd8f16fe9b499f060f659092c470cb9f76eb7 # main
127127
with:
128128
gpg-passphrase: ${{ inputs.gpg-passphrase }}
129129
gpg-sign-key: ${{ inputs.gpg-sign-key }}
@@ -163,7 +163,7 @@ runs:
163163
run: mkdir -p "$PACKAGE_OUTPUT_DIR"
164164

165165
- name: Create package
166-
uses: kolaente/action-gh-nfpm@master
166+
uses: kolaente/action-gh-nfpm@08460c16ce3baaa48eaf94d51eea0e653b15d955 # master
167167
with:
168168
packager: ${{ inputs.packager }}
169169
target: ${{ env.PACKAGE_OUTPUT_DIR }}/${{ env.PACKAGE_FILENAME }}
@@ -186,7 +186,7 @@ runs:
186186
"$PACKAGE_OUTPUT_DIR/$PACKAGE_FILENAME"
187187
188188
- name: Upload to S3
189-
uses: kolaente/s3-action@main
189+
uses: kolaente/s3-action@7f58dddd682b2f93a6c6799c9f68e7a38f2da558 # main
190190
with:
191191
s3-access-key-id: ${{ inputs.s3-access-key-id }}
192192
s3-secret-access-key: ${{ inputs.s3-secret-access-key }}
@@ -198,7 +198,7 @@ runs:
198198
strip-path-prefix: ${{ env.PACKAGE_OUTPUT_DIR }}/
199199

200200
- name: Store OS package
201-
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
201+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
202202
with:
203203
name: ${{ env.ARTIFACT_NAME }}
204204
path: ${{ env.PACKAGE_OUTPUT_DIR }}/*

.github/actions/setup-frontend/action.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ runs:
1616
echo "CYPRESS_INSTALL_BINARY=0" >> $GITHUB_ENV
1717
echo "PUPPETEER_SKIP_DOWNLOAD=true" >> $GITHUB_ENV
1818
echo "PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1" >> $GITHUB_ENV
19-
- uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
19+
- uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
2020
with:
2121
run_install: false
2222
package_json_file: frontend/package.json
23-
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
23+
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
2424
with:
2525
node-version-file: frontend/.nvmrc
2626
cache: 'pnpm'

.github/workflows/auto-label.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ jobs:
2121
runs-on: ubuntu-latest
2222
steps:
2323
- name: Checkout (for prompt template)
24-
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
24+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
2525
with:
2626
sparse-checkout: |
2727
.github/workflows/auto-label.prompt.md
2828
sparse-checkout-cone-mode: false
2929

3030
- name: Render system prompt from live labels
3131
id: render
32-
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
32+
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
3333
env:
3434
PROMPT_TEMPLATE_PATH: .github/workflows/auto-label.prompt.md
3535
with:
@@ -122,7 +122,7 @@ jobs:
122122
123123
- name: Classify with AI
124124
id: classify
125-
uses: actions/ai-inference@e09e65981758de8b2fdab13c2bfb7c7d5493b0b6 # v2.0.7
125+
uses: actions/ai-inference@a7805884c80886efc241e94a5351df715968a0ad # v2.1.1
126126
with:
127127
model: openai/gpt-4.1-mini
128128
# GPT-5 is a reasoning model: output tokens include reasoning, so budget generously.
@@ -132,7 +132,7 @@ jobs:
132132
prompt-file: ${{ steps.prep.outputs.prompt_path }}
133133

134134
- name: Apply labels
135-
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
135+
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
136136
env:
137137
AI_RESPONSE: ${{ steps.classify.outputs.response }}
138138
with:

.github/workflows/crowdin.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,27 @@ jobs:
99
runs-on: ubuntu-latest
1010
steps:
1111
- name: Checkout
12-
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
12+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
1313
with:
1414
ssh-key: ${{ secrets.SSH_PRIVATE_KEY }}
1515
persist-credentials: true
1616
- name: push source files
17-
uses: crowdin/github-action@b4b468cffefb50bdd99dd83e5d2eaeb63c880380 # v2
17+
uses: crowdin/github-action@e0c8f73cdc0fafde9396e056c5038217000a32d1 # v2.16.4
1818
with:
1919
command: 'push'
2020
env:
2121
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
2222
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
2323
- name: pull translations
24-
uses: crowdin/github-action@b4b468cffefb50bdd99dd83e5d2eaeb63c880380 # v2
24+
uses: crowdin/github-action@e0c8f73cdc0fafde9396e056c5038217000a32d1 # v2.16.4
2525
with:
2626
command: 'download'
2727
command_args: '--export-only-approved --skip-untranslated-strings'
2828
env:
2929
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
3030
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
3131
- name: Setup Node.js
32-
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
32+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
3333
with:
3434
node-version-file: frontend/.nvmrc
3535
- name: Ensure file permissions
@@ -55,7 +55,7 @@ jobs:
5555
git commit -m "chore(i18n): update translations via Crowdin"
5656
- name: Push changes
5757
if: steps.check_changes.outputs.changes_exist != '0'
58-
uses: ad-m/github-push-action@master
58+
uses: ad-m/github-push-action@881a6320fdb16eb5318c5054f31c218aec2b324c # master
5959
with:
6060
ssh: true
6161
branch: ${{ github.ref }}

.github/workflows/dependency-diff.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ jobs:
1818
directory: [frontend, desktop]
1919
steps:
2020
- name: Checkout repository
21-
uses: actions/checkout@v4
21+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
2222
with:
2323
fetch-depth: 0
2424
- name: Create Diff
25-
uses: e18e/action-dependency-diff@v1
25+
uses: e18e/action-dependency-diff@8e9b8c1957ab066d36235a43f4c1ff1522e1bdbc # v1.6.1
2626
with:
2727
working-directory: ${{ matrix.directory }}
28+
duplicate-threshold: 9999
2829

2930
check-provenance:
3031
runs-on: ubuntu-latest
@@ -33,11 +34,11 @@ jobs:
3334
directory: [frontend, desktop]
3435
steps:
3536
- name: Checkout repository
36-
uses: actions/checkout@v4
37+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
3738
with:
3839
fetch-depth: 0
3940
- name: Check provenance downgrades
40-
uses: danielroe/provenance-action@main
41+
uses: danielroe/provenance-action@97ee003d615492a894bc672aefd5cc149fde798d # main
4142
with:
4243
workspace-path: ${{ matrix.directory }}
4344
fail-on-provenance-change: true

0 commit comments

Comments
 (0)