Concise pre- and post-release checklist for release managers. For deeper detail on CI, signing, notarization, and post-release verification, see the /release-process skill in skills/release-process/.
-
mainis green on CI. -
just doctorpasses with no warnings on your machine. -
scripts/preflight.shpasses (Apple cert, Tauri signing key, notarization creds available). -
just testpasses locally (all tests: unit + integration + cross-compile + bench + Docker install e2e). -
CHANGELOG.md[Unreleased]section is populated and reads well. -
CITATION.cffdate-releasedis current (just _stamp-versionhandles this alongside the other version files). - Docs site has a release page at
docs/src/content/docs/releases/<major>-<minor>.mdif this is a minor bump.
Preferred -- fully automated:
just cut-releaseThis runs just test, bumps the version in Cargo.toml / crates/capsem-app/tauri.conf.json / pyproject.toml, stamps CHANGELOG.md, commits, tags, and pushes. CI takes over from the tag push.
Manual path (if cut-release fails partway through): see /release-process -- it documents the precise steps.
The tag push triggers the release pipeline (~18 min):
preflight ──> build-assets (arm64 + x86_64) ──> build-app-macos ──┐
└──> test ──────────────────────────────────────────────├──> create-release
└──> build-app-linux (arm64 + x86_64) ──────────────────┘
Watch CI. A failure in any job aborts the release. If create-release fails partway:
- The tag is pushed -- don't delete it. Instead, fix the issue and cut a new patch release.
- Re-tagging loses updater continuity (Tauri updater reads
latest.json).
- GitHub release page has signed artifacts:
.dmg(macOS arm64),.deb(linux arm64 + x86_64), manifest, checksums. -
latest.jsonfor macOS (Tauri updater) is present and signed. -
curl -fsSL https://capsem.org/install.sh | shon a clean VM installs the new version. - The existing installed client auto-updates (or prompts) on next launch.
- Docs site rebuilds and the release page shows on
capsem.org. - Close out
[Unreleased]follow-ups inCHANGELOG.mdas new unreleased items for the next cycle.
- Codesigning fails --
scripts/preflight.shshould have caught it. If it did not, read/release-processand run the p12 conversion fallback. - Notarization hangs -- CI uses
--skip-stapling; first-time notarization is async and can take hours. Don't block the release on it. - Tag pushed but CI aborted -- never force-push over a tag. Increment the patch version and cut again.
- Self-updater regression -- users on the prior version can always download the new release manually from GitHub.