Cut a release
This is the standard operating procedure for cutting a SupaCloud release.
SupaCloud follows Semantic Versioning and the
Keep a Changelog format. CHANGELOG.md at the
repository root is the single source of truth for the public, human-readable
changelog rendered on the marketing site’s /changelog
page (en + de) — it is synced into the site at build time (ADR 0045).
When to add a changelog entry
Section titled “When to add a changelog entry”Add an entry whenever a change is user-visible: a new feature, a behaviour change, a fix users would notice, or a security-relevant change. Internal refactors, test-only changes and CI plumbing do not need an entry.
The changelog-gate CI workflow enforces this: a pull request that touches
web/, marketing/src/ or docs/{user,admin}/ must also touch
CHANGELOG.md.
-
Add your change under
## [Unreleased](or the pending version section) inCHANGELOG.md, in the right category —Added,Changed,Deprecated,Removed,Fixed, orSecurity. Write it for users, not for the commit log. -
Re-sync the marketing homepage. The
/changelogpage renders a generated module synced fromCHANGELOG.md, fingerprinted by a committed drift lock:Terminal window cd marketingnpm run sync:changelog # regenerate the module + refresh changelog.locknpm run changelog:check # confirm the drift hash matches (CI runs this)Commit the refreshed
marketing/src/lib/generated/changelog.lock(the full generated module is gitignored — the lock is the drift contract). -
At release time, bump the version. Promote
## [Unreleased]to## [X.Y.Z] - YYYY-MM-DD(keep an empty## [Unreleased]above it for the next cycle) and update the compare links at the foot of the file. Pick the bump per SemVer: breaking → MAJOR, additive → MINOR, fix-only → PATCH. Then re-run the sync from step 2 so the lock reflects the dated section. -
Verify locally before tagging:
Terminal window cd marketing && npm run check && npm run buildnpx --yes markdownlint-cli2 --config .markdownlint.jsonc CHANGELOG.md -
Open the release PR with the version bump + the lock change. CI runs
changelog-gate(section present, drift check, markdownlint) plus the normalbuild-pushgates. -
Tag after merge. Once the PR is on
main:Terminal window git tag -a vX.Y.Z -m "vX.Y.Z"git push origin vX.Y.ZThe
build-pushpipeline builds and signs the server / web / marketing images for that commit; the marketing image bakes in the freshly-synced/changelog.
See also
Section titled “See also”- OSS release readiness — the release-hardening checklist.
- Add an i18n key — both
enanddeare required for marketing chrome.