Appearance
Release
Pre-release checklist
Run these locally before tagging anything — the CI pipeline (.github/workflows/ci.yml) currently only enforces the lockfile, so tests/lint/build are on you to verify:
bash
npx vitest run
npm run lint
npm run buildThen confirm the lockfile is actually in sync (see the rule below):
bash
npm ciIf npm ci fails, package-lock.json is out of sync with package.json — fix that before tagging, not after (see why below).
The lockfile rule (non-negotiable)
package-lock.jsonis regenerated only vianpm install— never hand-edited. Release tags (v*) must point at a commit whose lockfile is in sync withpackage.json.
This is enforced by .github/workflows/ci.yml, which runs npm ci (Node 22) on every push/PR to main. It exists because the v0.1.2 release once failed: the tag pointed at a commit with a hand-edited, out-of-sync lockfile, npm ci requires exact sync, and the fix landed on main after the tag had already been cut — so the tag never saw it. Only tag a commit that's already on main and already green on this check.
Cutting a release
- Bump the version in both places (they should match):
src-tauri/tauri.conf.json→"version"package.json→"version"(if you version it there too)
- Commit the version bump:bash
git add src-tauri/tauri.conf.json package.json package-lock.json git commit -m "chore: bump version to v0.1.x" git push - Wait for
main's CI (lockfile check) to pass on that commit. - Tag and push the tag:bash
git tag v0.1.x git push --tags .github/workflows/release.ymlpicks up thev*tag: runs on a Windows runner with Node 22,npm ci, thentauri-action, which builds a signed NSIS installer pluslatest.jsonand publishes a GitHub Release titled "Kairo<tag>". Signing uses theTAURI_SIGNING_PRIVATE_KEYsecret, matched against the public key embedded insrc-tauri/tauri.conf.json.- The in-app updater (
src/features/settings/lib/updater.ts) picks up the new release automatically — it pollshttps://github.com/SeiynJie/Kairo/releases/latest/download/latest.json, which the release workflow just published to.
After a release
- Sanity-check the GitHub Release page: installer asset +
latest.jsonboth present. - Optionally install the new version locally and use Settings -> Updates -> Check for updates (Settings & Updates) on the previous version to confirm the update prompt actually appears and installs cleanly.