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:

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/.