Releasing
Releases are automated with release-please. You never tag by hand — you write Conventional Commits and merge a Release PR.
The version flows like this: Conventional Commit messages (feat:, fix:,
feat!: for breaking) tell release-please how to bump the version. release-please
keeps an open "Release PR" that bumps version.txt + CHANGELOG.md. Merging that
Release PR creates the vMAJOR.MINOR.PATCH tag and a GitHub Release;
MinVer reads that tag at build time and
stamps it into the binaries, which the workflow attaches to the release.
Day-to-day
- Open a PR for your change. Give it a
Conventional Commit title (e.g.
feat: add sync command,fix: handle missing config). - Squash-merge it into
main. The squash commit takes the PR title, so the title is what release-please reads — keep it conventional. - release-please opens or updates a Release PR ("chore: release X.Y.Z"). Review it.
- Merge the Release PR when you want to ship. That tags
main, creates the GitHub Release, and therelease-pleaseworkflow builds and attaches thewin-x64,win-arm64,linux-x64, andosx-arm64binaries.
Tags are created by release-please on main, so they are always reachable
through history — this is what makes MinVer reliable regardless of squash/rebase
merges. Do not tag manually.
Two channels
protostar ships on two tracks (see Channels for how to install each):
- stable — the release-please flow above. Tagged
vX.Y.Z, published as a normal GitHub Release (so it is thereleases/latestthe default installer pulls). - edge — a rolling prerelease. The
edgeworkflow rebuilds on every code change tomainand replaces a single prerelease under the movingedgetag, versioned by MinVer (0.X.Y-alpha.0.N). Because theedgetag does not start withv, MinVer ignores it, so the two channels never collide.
While we are pre-1.0, stable releases stay in the 0.x range
(bump-minor-pre-major keeps a breaking change from jumping to 1.0.0); cutting
1.0.0 will be a deliberate choice.