Releases are automated with release-please. You never tag by hand: you merge feature/fix PRs written as Conventional Commits, and release-please maintains a release PR that bumps the version and updates the changelog.
- Open a PR whose commits follow Conventional Commits:
feat: ...→ minor bumpfix: ...→ patch bumpfeat!:/BREAKING CHANGE:→ major bump
- Merge it to
main. Therelease-pleaseworkflow runs and opens (or updates) a release PR titledchore(main): release X.Y.Z. - Merge the release PR. release-please then:
- tags
vX.Y.Zand cuts a GitHub Release with generated notes, - bumps
.versioninapp.zonand theasciiBytes(...)literals insrc/core.ts(via thex-release-please-versionannotations), - updates
CHANGELOG.md, - and the workflow builds + packages the macOS
.app, uploads it pluslatest.jsonto the release, and bumpslatest.txtonmain.
- tags
release-please keeps these in sync automatically:
| File | How |
|---|---|
.release-please-manifest.json |
source of truth for the current version |
app.zon, src/core.ts |
x-release-please-version annotations |
CHANGELOG.md |
generated from commits |
latest.txt |
bumped by the workflow after the release is cut |
The app checks latest.txt on boot and every 20 seconds and surfaces "update
available" when it differs from the built-in version — so once the release PR
merges and latest.txt bumps, a running app flips to "update available"
within ~20s. See AUTO_UPDATE.md for the download-verify-
relaunch apply path and signing notes.