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:

  1. Create a draft release on Github
  2. Build and upload those builds to the draft release (automatic)
  3. 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.json version
  • 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=false so 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 via packages/desktop/package.jsonbuild.publish).
  • Desktop build update (web assets): a desktop-v{version}.zip asset 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}.zip exists, prefer the desktop build update.
  • Otherwise (minor/major, or no matching zip), download the full Electron app update.