Skip to main content

One-command packaging

The script runs dependency install → build the sidecar → build the frontend → emit installers.

Building in stages

Where artifacts land

Windows produces no MSI. The WiX toolchain is unreliable with CJK product names, while NSIS is not — so NSIS is the only path kept.

Packaging is not releasing

These get conflated constantly, but the responsibilities are different: release.mjs only syncs the version, tags, and pushes to the remote — it does not attach installers to a GitHub Release. To mirror to GitHub (including tag and history cleanup), run ./scripts/sync-github.sh. See docs/release.md in the repository.

Mobile is a separate pipeline

Mobile runs on its own release-mobile.yml workflow:
  • Manual trigger only — it does not follow main releases;
  • Produces unsigned IPA / APK, kept as workflow artifacts;
  • Not attached to Releases.
It is split out because mobile does not yet have a real distribution and signing flow; automating it would only produce artifacts nobody can obtain.

Version numbers

The version is a single source of truth, synced across package.json, the Tauri config, and the individual workspace packages. bun run release syncs it before tagging. Do not hand-edit one package.json.

Pre-release checklist

1

Preflight the environment

./scripts/build-release.sh --check
2

Run the tests

3

Confirm plugin artifacts are present

Panel HTML and zips are not committed, and a missing one only surfaces after installation.
4

Package and verify the installer

Install from the bundle directory in a clean environment and run the smoke test — especially keychain reads/writes and sidecar startup.
5

Release

bun run release to tag and push; ./scripts/sync-github.sh if you want the GitHub mirror.

Back to reference

See what comes next.