How we build and release
We use GitHub Actions workflows to automate the entire release process.
Main idea: code is the source of truth. We bump packages/desktop/package.json with npm version, which creates a desktop-vX.Y.Z tag. CI triggers on that tag and validates the tag equals the code version before building.
We release in three steps:
- Create a draft release on Github
- Build and upload those builds to the draft release (automatic)
- Publish the draft as the latest release
Create a draft
- Trigger: push a tag
desktop-vX.Y.Z - Workflow: "release-1-draft"
- Result: a draft GitHub Release with autogenerated notes (no binaries yet)
- Validates that the tag version matches
packages/desktop/package.jsonversion - Automatically triggers the build and upload workflow
Build and upload builds (All platforms on CI)
- Trigger: automatically triggered by "release-1-draft" workflow
- Workflow: "release-2-build-upload"
- Builds and uploads macOS (signed + notarized), Windows, and Linux artifacts to the same draft release
- Uses Git LFS for asset handling (provider images, icons, etc.)
Publish the draft
- Workflow: "release-3-finalize" (manual, input the tag)
- Sets
draft=falseso users and auto-updaters see the new version
Github actions
See .github/workflows/ in the root
Use gh cli tool to inspect workflows if needed
Notes
- All platforms are built on CI. macOS artifacts are code-signed and notarized automatically.
- We produce a single universal macOS DMG (Intel + Apple Silicon).
- The latest public release is available on the download page: silain.com/download.
Updates in the app (auto-update)
We ship updates via GitHub Releases in two forms:
- Electron app update (the executable): handled by
electron-updater(GitHub provider viapackages/desktop/package.json→build.publish). - Desktop build update (web assets): a
desktop-v{version}.zipasset that the app can download + extract at runtime.
Update strategy (see packages/desktop/src-electron/updates/updater.js):
- If the available update is a patch bump and a matching
desktop-v{version}.zipexists, prefer the desktop build update. - Otherwise (minor/major, or no matching zip), download the full Electron app update.