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

Stepstandard-versionrelnote + release.sh
Next versionfrom conventional commits since the last tagrelnote --next-version: breaking → major, feat → minor, else patch (0.x breaking → minor)
Bump version filespackage.json and bumpFiles updaters--bump-file FILE (repeatable) sets the first "version" / version = line: package.json, pyproject.toml, Cargo.toml, composer.json
CHANGELOG.mdconventional-changelog presetsrelnote --changelog CHANGELOG.md prepends a ## [vX.Y.Z] - DATE section; older entries untouched
Commitchore(release): X.Y.Zchore(release): vX.Y.Z (--skip-commit to stop before it)
Tagannotated vX.Y.Zannotated tag (--skip-tag to skip)
Pushprints git push --follow-tagssame: nothing is pushed for you
RuntimeNode + npm packagesbash, 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-versionrelease.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-releaseno 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 rcnot supported; use --release-as v2.0.0-rc.1
.versionrc, lifecycle scripts, presetsnone; 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