🐞 Bug fixes
- Fixed voting on published work items that had no votes yet, which previously failed without registering the vote.
- Fixed archiving a cycle that has no end date.
- Fixed work item links being re-crawled on every update even when the URL had not changed.
- The REST API now returns a validation error when a work item is created or updated with assignees or labels that do not belong to the project, instead of silently dropping them.
- Fixed MinIO image pulls failing after the
minioorganization was removed from Docker Hub. Bundled object storage now uses thepgsty/siloimage, pinned to a release tag instead oflatest. - Fixed
install.shandswarm.shfailing to find the latest release now that the GitHub API returns compact JSON. Both scripts now stop with an error when the lookup fails instead of continuing with an empty version. - Hardened the airgapped restore script: it now maps backup folders to the volume paths the airgapped compose file expects, cleans stale extracted data before restoring, and rolls back to the old data if a directory swap fails or is interrupted.
🛡️ Security
This release fixes a set of access control issues. Self-hosted instances should upgrade.
Access control and tenant isolation
- Required project membership to publish a project. Previously any workspace member could publish a project they did not belong to, including a secret one, and expose its work items through the public board. Label creation, which runs through the same permission check, is closed by the same fix.
- Bound comments, reactions, votes, and intake submissions on published boards to the board's own project and workspace. Previously a caller could write onto work items in other projects or workspaces, or read public comments from another project. Votes are now also rejected when voting is disabled on the board.
- Scoped the sub-work-items endpoint to the project in the request URL, which previously let a project member read sub-work-items from other projects and re-parent work items across projects.
- Limited draft-to-work-item conversion to the draft's owner, so other workspace members can no longer convert another user's draft, take its attachments, or delete it.
- Accepting a project invitation now adds the user to the invited project with the invited role. Previously it could reactivate an old membership in a different project, with its old role.
Authentication and secrets
- Rate-limited email/password sign-in and sign-up on both the app and published boards, closing a brute-force and credential-stuffing path.
- Stopped returning the webhook signing secret on webhook list, retrieve, and update. The secret is now shown only when a webhook is created or its secret is regenerated.
Injection and denial of service
- Checked the
order_byparameter on the project pages list against an allowlist, closing unhandled 500 errors and ordering by related sensitive fields.
Dependencies and images
- Upgraded dependencies with known vulnerabilities:
sanitize-html2.17.7,djangorestframework3.17.2,sharp0.35.4,js-yaml4.3.2,fast-uri3.1.8,qs6.16.0,morgan1.12.0, andpostcss-selector-parser. - Rebuilt the Docker images against patched base packages to clear outstanding image scan findings: Alpine security upgrades in every image, the Python 3.12.12 base image for the API, patched Go modules in the proxy's Caddy build, and npm removed from the runtime images. The all-in-one image no longer overwrites the upgraded system libraries with older copies from the Node base image.