relnote
Turn a git range into clean GitHub release notes.
A stdlib Python changelog CLI and GitHub Action for offline conventional-commit release notes. No config file, no GitHub API, no third-party packages.
Install
curl -fsSL -o ~/.local/bin/relnote https://github.com/loki-inu/relnote/releases/latest/download/relnote
chmod +x ~/.local/bin/relnote
relnote --help
Python 3.11+, git on PATH, no third-party packages. That one file is a Python zipapp attached to each release (with SHA256SUMS and a relnote.pyz for Windows); it is also the way to run relnote in GitLab CI, Jenkins, or any other CI. Or pip install git+https://github.com/loki-inu/relnote.git, or run from a checkout: python3 -m relnote.
Homebrew (macOS or Linux): brew install loki-inu/tap/relnote. The formula lives in loki-inu/homebrew-tap.
Using the GitHub CLI? gh extension install loki-inu/gh-relnote, then gh relnote create v1.3.0 --draft. See gh relnote.
Keeping a CHANGELOG.md? relnote --changelog CHANGELOG.md --changelog-title v1.3.0 prepends the new release above the last one. Need the next tag too? relnote --next-version prints it, and --path / --tag-prefix scope everything to one package in a monorepo (details). See CHANGELOG.md from conventional commits.
What it does
relnote is an offline conventional-commits release notes tool in Python. It reads the current repository, from the latest tag (or --since) to HEAD, and prints a GitHub Release body grouped from conventional commits:
- Features —
feat - Fixes —
fix - Breaking —
type!or aBREAKING CHANGE:footer - Other — docs, chore, refactor, and everything else
Merge commits are omitted by default. Bot authors can be dropped with --no-bots. Subjects that look like tokens are never printed. For CI, write a file and stay quiet: relnote --output notes.md --quiet.
GitHub Action for conventional-commit release notes
- uses: actions/checkout@v4
with:
fetch-depth: 0
- id: relnote
uses: loki-inu/relnote@v0.3.1
Pin loki-inu/relnote@v0.3.1. The notes output is the Release body. A draft-release workflow is in the repo under examples/.
Compared to the usual tools
Short version below. See also offline GitHub release notes. The full comparison covers a git-cliff alternative, a gh release create --generate-notes alternative, and another stdlib Python CLI (swapnanil/relnotes).
| Tool | Use it when |
|---|---|
| relnote | You want offline, stdlib-only notes grouped by conventional commits, plus a GitHub Action and zero-config CI. |
gh release create --generate-notes |
You want GitHub's official, PR-linked notes and you are already online with gh. |
| git-cliff | You want a full changelog file, Tera templates, and a config. Heavier, more control. |
| swapnanil/relnotes | Another stdlib Python conventional-commit notes CLI. Pick it for optional .relnotes.toml or semver bump inference. Pick relnote for the Action and --quiet / --output. |
Common questions
Is relnote a git-cliff alternative?
Yes, when you want a GitHub Release body from conventional commits and do not need Tera templates or a fully regenerated CHANGELOG.md. Keep git-cliff when you want templated changelogs rebuilt from full history. relnote 0.3.1 can prepend each release to CHANGELOG.md with --changelog.
Is relnote a gh release create --generate-notes alternative?
Yes, when you want offline notes grouped by commit type. Keep gh release create --generate-notes when you want official PR-linked notes and the Release created for you.
Can I generate conventional-commit release notes offline in Python?
Yes. relnote is a stdlib Python changelog CLI. It reads local git history only — no GitHub API and no network. Python 3.11+ and git on PATH.
How do I generate conventional-commit release notes in a GitHub Action?
Use loki-inu/relnote@v0.3.1 after actions/checkout with fetch-depth: 0. The action writes grouped notes to an output. A draft-release workflow is in the repo under examples/.