Runbook: cutting a release

Before you start

Signing material

The updater signing key exists in exactly two places: the CI secret store, and an offline backup held by whoever administers the project. Not on a developer machine, not in the repository, and not passed to any third-party action that could log it.

Secret What it is
TAURI_SIGNING_PRIVATE_KEY The updater private key, as a string
TAURI_SIGNING_PRIVATE_KEY_PASSWORD Its password, if it has one

To generate a fresh keypair — which invalidates every installed client's ability to accept updates, so do it only once or on compromise:

npm run tauri signer generate -- -w ./sheetforge.key

Put the public half in tauri.conf.json under plugins.updater.pubkey. Put the private half in the secret store and the backup, then delete your local copy.

If the private key is lost, no existing installation can be updated again. They have to reinstall by hand. Treat the backup accordingly.

Cutting it

git switch -c release/vX.Y.Z
# bump the three version numbers, update CHANGELOG.md and docs/status.md
git commit -am "Release vX.Y.Z"
git push -u origin release/vX.Y.Z
# open a PR, get it reviewed and merged
git switch main && git pull
git tag -a vX.Y.Z -m "vX.Y.Z"
git push origin vX.Y.Z

The tag triggers .github/workflows/release.yml, which builds on Windows, macOS (Apple silicon and Intel) and Linux, signs the update payloads, and opens a draft release.

Before publishing the draft

Then publish.

If a tag was pushed too early

A tag that points at the wrong commit is not a release — nothing was built from it and nobody has downloaded it — so moving it is safe until a draft exists. After that, do not: publish a higher version instead, as below.

git tag -f vX.Y.Z && git push --force origin vX.Y.Z

Check what it currently points at first (git log --oneline -1 vX.Y.Z), because a tag pushed weeks ago may predate a schema change — in which case building from it produces something that cannot open the projects the current build writes.

Rolling back

Do not delete or rewrite a published release. Anyone mid-download gets a signature mismatch and a broken install.

Publish a higher version containing the older code:

git revert <the bad commit>
# bump to X.Y.Z+1, note the revert in CHANGELOG.md
git tag -a vX.Y.Z+1 -m "vX.Y.Z+1 — reverts vX.Y.Z"

If the bad release corrupts data, say so at the top of the release notes and in a pinned issue, with instructions. People's drawings matter more than the project's appearance.

Still outstanding