Canonical release process documentation for OK Code.
Last updated: 2026-04-05
The next stable train ships one semver across all blocking surfaces:
- macOS arm64 desktop DMG plus updater metadata
- Windows x64 signed NSIS installer
- Linux x64 AppImage
- iOS TestFlight build from the same tag
okcodesnpm package from the same tag
docs/release.md is the source of truth for release policy, release gates, and the platform matrix. Treat docs/releases/README.md and README release references as pointers only.
- iOS is TestFlight-only for this release train.
- Intel mac is non-blocking and runs in the separate
Desktop Intel Compatibilityworkflow. - Android is non-blocking.
- Windows stable support requires signing. Do not ship unsigned Windows artifacts as stable.
- Prereleases like
vX.Y.Z-rc.1are optional. Use them when we want soak time or extra validation, not as a mandatory gate. - Stable releases may ship directly as
vX.Y.Zwhen the change set is understood and approved. - Publish prereleases to npm with the
nextdist-tag. - Publish stable releases to npm with the
latestdist-tag.
Official releases are cut through release.yml.
Job order:
preflightdesktop_buildios_testflightpublish_clireleasefinalize
The GitHub release must not publish until every blocking surface succeeds.
Every RC and stable release must pass:
bun run fmt:check
bun run lint
bun run typecheck
bun run test
bun run --cwd apps/web test:browser
bun run test:desktop-smoke
bun run release:smokebun run lint is a zero-warning gate.
Run the comprehensive pre-release validator before cutting any RC or promoting to stable:
bun run release:validate <version>This checks documentation completeness, version alignment, git state, iOS project version, and optionally runs all quality gates. Use --skip-quality for a docs-only pass or --ci for CI pipelines.
Blocking stable matrix:
| Surface | Runner | Artifact | Blocking |
|---|---|---|---|
| macOS arm64 | macos-14 |
signed/notarized DMG + updater metadata | yes |
| Windows x64 | windows-2022 |
signed NSIS installer | yes |
| Linux x64 | ubuntu-24.04 |
AppImage | yes |
| iOS | macos-14 |
TestFlight upload | yes |
| CLI | ubuntu-24.04 |
npm publish | yes |
Non-blocking compatibility lane:
| Surface | Workflow | Artifact |
|---|---|---|
| macOS x64 | release-intel-compat.yml |
Intel DMG |
- Build artifacts with
bun run dist:desktop:artifact. - Refuse macOS stable release builds unless signing and notarization secrets are present.
- Refuse Windows stable release builds unless Azure Trusted Signing secrets are present.
- Validate packaged outputs before upload:
- macOS: DMG exists and updater manifest exists
- Windows: installer exists
- Linux: AppImage exists
- Keep
bun run test:desktop-smokeandbun run release:smokegreen before tagging.
- Reuse the same release version as desktop and CLI.
- Build the mobile web bundle and sync Capacitor before archiving.
- Run a simulator build in CI before archive/upload.
- Upload the archive to TestFlight from the coordinated release workflow.
- During RC soak, manually verify on:
- one current supported iPhone/iOS
- one older supported iPhone/iOS
Manual RC device checks:
- Pair the mobile companion with a desktop/server.
- Restore a saved pairing.
- Open a thread and send a follow-up.
- Approve an action and answer a user-input request.
- Background and foreground the app.
- Return to the thread from a notification tap.
- Build the CLI package from
apps/server. - Verify
npm pack. - Verify local
okcode --version,okcode --help, andokcode doctor --help. - Publish only after desktop and iOS blockers pass.
- Verify the published package with
npx okcodes@<version> --version.
Before tagging:
- Ensure the main branch is green on the full gate set.
- Prepare:
CHANGELOG.mddocs/releases/vX.Y.Z.mddocs/releases/vX.Y.Z/assets.mddocs/releases/vX.Y.Z/rollout-checklist.md(version-specific rollout playbook)docs/releases/vX.Y.Z/soak-test-plan.md(version-specific soak test cases)
- Run
bun run release:validate <version>and fix any failures. - Confirm Apple signing/notarization secrets.
- Confirm Windows signing secrets.
- Confirm
NODE_AUTH_TOKEN,RELEASE_APP_ID, andRELEASE_APP_PRIVATE_KEY.
The 48-hour RC soak must finish with:
- no Sev-1 or Sev-2 issues
- no crash-on-launch on blocking desktop platforms
- updater verification from the previous stable desktop build
- successful TestFlight install
- successful
npx okcodes@<rc-version> --version
If any blocker fails, cut a new RC and repeat the soak.
- The GitHub release includes desktop artifacts plus release notes and asset manifest.
- iOS is distributed through TestFlight, not attached to the GitHub release.
finalizeupdates version strings and pushes the post-release bump tomain.
- If
preflightfails, reproduce locally with the exact failing command before retriggering the workflow. - If
desktop_buildfails, inspect the target-specific signing secrets first. - If
ios_testflightfails, re-check provisioning, App Store Connect API key setup, and archive export logs. - If
publish_clifails, do not continue the train. Fix the publish issue so the app and CLI do not drift.