This is the manual procedure for cutting a Controller release. There is no
release CI yet — builds and the GitHub release are produced from a developer
machine. macOS artifacts must be built on macOS (Apple Silicon); Linux
artifacts are produced from the same electron-builder invocation.
Replace X.Y.Z with the target version (e.g. 0.2.0) throughout.
git checkout main && git pull
git checkout -b release/X.Y.Znpm version X.Y.Z --no-git-tag-versionThis updates package.json and package-lock.json. The --no-git-tag-version
flag is important: we tag manually after the release commit so the tag points
at the changelog too. The docs site (docs/package.json) versions
independently and is not touched here.
Edit CHANGELOG.md:
-
Rename the working
## [Unreleased]section to## [X.Y.Z] - YYYY-MM-DDand add a fresh empty## [Unreleased]placeholder above it. -
Consolidate entries under a single
### Added/### Changed/### Fixed(and### Docs, if relevant) heading each. -
Fold in any notable commits landed since the last tag that were never recorded in
[Unreleased]. Find them with:git log vPREV..HEAD --no-merges --pretty='%s' -
Keep the macOS Gatekeeper note (ad-hoc-signed, not notarized → Open Anyway) and call out any breaking changes / required manual migration steps prominently at the top of the section.
npm test
npm run buildBoth must pass before tagging.
git add package.json package-lock.json CHANGELOG.md
git commit -m "Release X.Y.Z"
git push -u origin release/X.Y.ZOpen a PR, get it reviewed, and merge to main. Tag the merge commit:
git checkout main && git pull
git tag vX.Y.Z
git push origin vX.Y.Znpm run package:electron:distThis runs npm run build, then electron-builder --mac --linux, then
electron/resign-mac.mjs. The resign step codesign --force --deep --sign -
the macOS bundle so it carries a well-formed ad-hoc signature (without it the
shipped .zip/.dmg fail to launch). Artifacts land in release/:
- macOS —
Controller-X.Y.Z-arm64-mac.zip,Controller-X.Y.Z-arm64.dmg - Linux —
Controller-X.Y.Z-arm64.AppImage
The macOS build is ad-hoc-signed and not notarized. There is no Developer ID signing or auto-update channel yet. Intel macOS and x86_64 Linux builds are not produced by default — note that in the release if they're missing.
gh release create vX.Y.Z \
--title "Controller X.Y.Z" \
--notes-file <(sed -n '/## \[X.Y.Z\]/,/## \[/p' CHANGELOG.md) \
release/Controller-X.Y.Z-arm64-mac.zip \
release/Controller-X.Y.Z-arm64.dmg \
release/Controller-X.Y.Z-arm64.AppImageReview the rendered notes and the attached binaries on the release page. Always include the macOS Gatekeeper "Open Anyway" instructions in the release body, since the build is un-notarized.
- Verify a fresh download launches on macOS (first launch needs the System Settings → Privacy & Security → Open Anyway approval).
- Open follow-up issues for anything deferred (signing/notarization, auto-update, additional architectures).