Studio ships as a native binary per OS, cut from main via a tag. Releases are
pre-1.0 (0.x) while Zig, the Native SDK, and the toolkit conformance reference
are all pre-1.0 — see the ROADMAP versioning note.
A push of a vX.Y.Z tag triggers .github/workflows/release.yml,
which builds and publishes a GitHub release with two artifacts:
| Platform | Artifact | Notes |
|---|---|---|
| macOS | studio-X.Y.Z-macos-ReleaseFast.dmg |
A .app bundle, ad-hoc signed |
| Linux | studio-X.Y.Z-linux-ReleaseFast.tar.gz |
The studio binary + resources |
| both | SHA256SUMS |
Checksums of both packages; the installer verifies against it |
macOS install: users install with the one-line installer
(scripts/install-macos.sh; see the README), which
downloads the latest DMG, verifies its SHA-256 against SHA256SUMS, installs the
app, and clears the download quarantine. The build is ad-hoc signed, not notarized
(a deliberate tradeoff) — installing via curl sidesteps the browser-download
quarantine, so the first launch is clean.
- Green
main. CI must be green on the commit you are releasing. - Bump the version in
app.zon(.version = "X.Y.Z"). - Finalize the changelog — move the
Unreleasedsection ofCHANGELOG.mdunder a datedX.Y.Zheading. - Update the living docs —
CURRENT_STATE.md/ROADMAP.mdas needed. - Land 2–4 through a normal PR and merge to
main. - Tag and push from the merged commit:
git tag vX.Y.Z git push origin vX.Y.Z
- The release workflow builds both packages and publishes the GitHub release
(
--generate-notesfor the auto notes; swap to--notes-filefrom the changelog section if you prefer curated notes).
The tag and the published release are outward-facing and hard to reverse — push the tag only when the release commit is final.
Build a package without cutting a release (macOS):
native build
scripts/package-macos.sh 0.5.1
# → zig-out/package/OCPP DebugKit Studio.app and zig-out/package/studio-0.5.1-macos-ReleaseFast.dmg
open "zig-out/package/OCPP DebugKit Studio.app" # smoke-launch itscripts/package-macos.sh signs studio.app, renames
it to the display name, and builds the .dmg — see the script header for why the
rename can't go through native package --output directly. native doctor --strict gates the manifest; the release workflow runs it too.