Releases
Releases are built by the Release workflow when a version tag is pushed. It makes unsigned installers for Windows, macOS and Linux and attaches them to a draft GitHub Release, which you check and publish.
Cut a release
Section titled “Cut a release”-
Bump the version with npm. It updates
package.jsonandpackage-lock.jsontogether, commits them and tags the commitv0.2.0:Terminal window npm version 0.2.0 -m "chore(release): %s"Don’t edit
versionby hand:package-lock.jsonwould fall behind. -
Push the commit and the tag:
Terminal window git push origin main v0.2.0 -
Wait for the Release workflow in the Actions tab. It:
- checks the tag matches
package.json(and stops if not), - runs the type check and unit tests,
- builds on Windows (
.exe), macOS (.dmgand.zipfor Apple silicon and Intel) and Linux (.AppImageand.deb), - checks each Mac build carries the right native module for its processor,
- uploads everything to a draft release for the tag.
- checks the tag matches
-
Open the draft on the Releases page, edit the notes and publish it.
Before a release, regenerate the docs screenshots if screens changed.
If something fails
Section titled “If something fails”- Tag does not match: delete the tag (
git tag -d v0.2.0 && git push origin :refs/tags/v0.2.0), then bump again withnpm version. - One OS failed: the others still upload to the draft. Fix the cause, then re-run the failed job from the Actions tab.
Signing and updates
Section titled “Signing and updates”Builds are not code-signed, so Windows and macOS warn on first open; Install explains how to get past it. The app does not update itself.
Build locally
Section titled “Build locally”npm run dist builds installers for your own platform into dist/. For an unpacked build to try quickly, run npx electron-vite build && npx electron-builder --dir.
The app icon
Section titled “The app icon”Installers take their icon from build/icon.png. See Docs and screenshots to recapture it.

