relnote docs · CHANGELOG.md · Next version · Compare · Any CI
standard-version alternative: bump, CHANGELOG.md and tag without Node
standard-version is deprecated (its README says so and points to release-please or the commit-and-tag-version fork), but it still gets hundreds of thousands of npm downloads a week. If what you liked was one local command that bumps the version, writes the changelog and tags, relnote can do that without Node, without a config file, and without moving your release into a GitHub Actions bot.
What standard-version did, and what replaces each step
| Step | standard-version | relnote + release.sh |
|---|---|---|
| Next version | from conventional commits since the last tag | relnote --next-version: breaking → major, feat → minor, else patch (0.x breaking → minor) |
| Bump version files | package.json and bumpFiles updaters | --bump-file FILE (repeatable) sets the first "version" / version = line: package.json, pyproject.toml, Cargo.toml, composer.json |
| CHANGELOG.md | conventional-changelog presets | relnote --changelog CHANGELOG.md prepends a ## [vX.Y.Z] - DATE section; older entries untouched |
| Commit | chore(release): X.Y.Z | chore(release): vX.Y.Z (--skip-commit to stop before it) |
| Tag | annotated vX.Y.Z | annotated tag (--skip-tag to skip) |
| Push | prints git push --follow-tags | same: nothing is pushed for you |
| Runtime | Node + npm packages | bash, git, Python 3.11 stdlib |
Install
brew install loki-inu/tap/relnote
# or one file, no pip:
curl -fsSL -o ~/.local/bin/relnote https://github.com/loki-inu/relnote/releases/latest/download/relnote && chmod +x ~/.local/bin/relnote
# the release script
curl -fsSL -o release.sh https://raw.githubusercontent.com/loki-inu/relnote/main/examples/release.sh && chmod +x release.sh
Commit release.sh to your repo (e.g. scripts/release.sh) so everyone runs the same thing. It is plain bash; read it before you run it.
Use it
$ ./release.sh --dry-run --bump-file package.json
next: v1.4.0
changelog: CHANGELOG.md
bump: package.json -> 1.4.0
commit: chore(release): v1.4.0
tag: v1.4.0
--- notes ---
## What's changed
### Features
- add export command (`987ca88`) — Ada
### Fixes
- **cli:** handle empty ranges (`34e04b1`) — Ada
$ ./release.sh --bump-file package.json
committed: chore(release): v1.4.0
tagged: v1.4.0
next step: git push --follow-tags
The working tree must be clean. If HEAD is already tagged, or a tag with the next version exists, it stops with exit code 1 instead of guessing.
Flag mapping
| standard-version | release.sh / relnote |
|---|---|
npx standard-version | ./release.sh --bump-file package.json |
--dry-run | --dry-run |
--release-as 2.0.0 | --release-as v2.0.0 (full tag) |
--first-release | no tag yet → v0.1.0; or --release-as v1.0.0 |
--skip.commit / --skip.tag | --skip-commit / --skip-tag |
--infile HISTORY.md | --changelog HISTORY.md |
--tag-prefix api/v (monorepo) | --tag-prefix api/v -- --path packages/api |
--prerelease rc | not supported; use --release-as v2.0.0-rc.1 |
.versionrc, lifecycle scripts, presets | none; edit the script |
Then publish the GitHub Release
git push --follow-tags
gh extension install loki-inu/gh-relnote
gh relnote create v1.4.0 # Release body from the same commits
Or let CI do it on the tag push with the relnote GitHub Action, or in GitLab CI and other CI. relnote sees that HEAD is the new tag and uses the tag before it, so the notes cover this release.
When to pick something else
- commit-and-tag-version: the maintained drop-in fork. Keep it if you depend on
.versionrc, prerelease bumps, lifecycle scripts or custom presets. - release-please: the upstream recommendation for GitHub. It opens a release PR from a bot and does the bump, changelog and Release when you merge it.
- semantic-release: fully automated publish from CI, with plugins for npm and others.
- relnote + release.sh: you want the old one-command local release, in any language, with no Node and no config. See also git-cliff and gh --generate-notes.