Releasing
Viltrum uses semantic-release on main.
You do not hand-edit version tags for routine ships. Merge conventional commits → CI runs semantic-release → version, CHANGELOG.md, v.mod, GitHub Release, and tag vX.Y.Z are produced automatically when commits warrant a release.
Conventional commits
| Prefix | Release |
|---|---|
feat: | minor (0.5.0 → 0.6.0) |
fix: | patch (0.5.0 → 0.5.1) |
perf: | patch |
refactor: | patch (behavior-preserving; use feat/fix if user-visible) |
docs:, chore:, test:, ci:, build:, style: | no release |
BREAKING CHANGE: footer or feat!: / fix!: | major |
Examples:
feat: add idle timeout option for WebSocket sockets
fix: reject unmasked frames before payload alloc
docs: clarify proxy Upgrade headers
chore: ignore local bench dumps
Breaking:
feat!: rename App.options to App.server_options
BREAKING CHANGE: App.options no longer sets ServerOptions; use server_options().
What the pipeline updates
- Analyzes commits since the last tag
- Bumps version (
scripts/bump-version.sh→v.mod+package.json) - Prepends notes to
CHANGELOG.md - Commits
chore(release): X.Y.Z [skip ci] - Tags
vX.Y.Zand creates the GitHub Release
Config: .releaserc.yml · workflow: .github/workflows/release.yml
Local dry-run
npm ci
npx semantic-release --dry-run
Requires a clean git history and network only if plugins need it; dry-run does not publish.
Manual hotfix (rare)
If automation is blocked:
- Fix on
mainwith afix:commit - Prefer letting the next push to
maincut the patch - Only hand-tag if CI is down — then mirror the usual
CHANGELOG/v.modedits so the next semantic-release run stays consistent
First-time setup notes
package.json/package-lock.jsonexist only for release tooling (not a Node library).- Repo needs
contents: writeon the defaultGITHUB_TOKEN(set in the workflow). - Protect
mainif you want; release commits use[skip ci]so unit CI is not doubled on the bump commit (optional; remove from the message if you prefer full re-test).