This document covers the steps to cut a signed, notarized, auto-updatable release for all three platforms. Follow it exactly for public release builds.
- Update
versioninpackage.json. - Commit on
mainwith messagechore: release vX.Y.Z. - Tag:
git tag vX.Y.Z && git push --tags.
Required environment variables when building a signed Windows installer:
| Variable | Purpose |
|---|---|
CSC_LINK |
Path or base64-encoded .pfx / .p12 certificate file. |
CSC_KEY_PASSWORD |
Password for the certificate. |
Without these, electron-builder still produces an .exe, but it is unsigned —
SmartScreen will warn users on first download and users must click "More info"
to run it. Unsigned Windows builds are not acceptable for public release.
Buy a cert from DigiCert, Sectigo, or SSL.com. EV certs get an immediate reputation boost in SmartScreen.
Required environment variables when building a signed macOS DMG:
| Variable | Purpose |
|---|---|
APPLE_ID |
Apple ID email for the developer account. |
APPLE_APP_SPECIFIC_PASSWORD |
App-specific password from appleid.apple.com. |
APPLE_TEAM_ID |
10-char team ID from Apple Developer portal. |
CSC_LINK |
Path to .p12 containing Developer ID Application certificate. |
CSC_KEY_PASSWORD |
Password for the .p12. |
The build pipeline will:
- Sign
Termpolis.appwith the Developer ID cert (hardened runtime on). - Submit the
.dmgto Apple's notary service vianotarytool. - Staple the notarization ticket to the
.dmg.
Apple Silicon (arm64) and Intel (x64) are both produced — we ship a single
universal DMG that works on both architectures.
An unsigned or unnotarized .dmg shows the "unidentified developer" Gatekeeper
warning and a majority of Mac users will abandon. Unnotarized macOS builds
are not acceptable for public release.
No signing required. AppImage is produced as-is.
# Full release build (all platforms)
npm ci
npm run build
npm run package
# Platform-specific
npx electron-builder --win
npx electron-builder --mac
npx electron-builder --linuxOutput lands in dist-electron-builder/.
Binaries and the latest-*.yml metadata files are published to GitHub
Releases. electron-updater in the app points at the same repo and
auto-downloads updates in the background.
After uploading release assets, verify:
- An existing v(N-1) install correctly detects vN and prompts to update.
- The update installs without a UAC / Gatekeeper challenge.
- Sentry shows no increase in error rate for the first 24 hours of the rollout.
Before tagging a release:
npm ci # lockfile-only install
npm run lint # must exit 0
npm test -- --run # unit suite must pass
npx playwright test # full e2e suite must passBad release? Delete the release (keep the tag for history) and publish an
older latest-*.yml so auto-update points users back to the prior version.
Then cut a patch release that actually fixes the bug.