You ship a release. You mean to write the changelog "later." Three weeks pass, someone asks "what actually changed in 1.2?", and now you're scrolling git log trying to reconstruct it from memory.
Here's the thing: if your commits look anything like feat: ... / fix: ... (Conventional Commits), the changelog already exists — it's sitting in your git history. It just needs extracting.
The tools that do this each ask for something first:
-
git-cliff is genuinely great — but it's a Rust binary you install via cargo or a release download, plus a
cliff.tomlto configure. - standard-version — deprecated.
- release-please — powerful, but it wants GitHub Actions and a release-PR workflow.
I wanted one command, no setup. So I built changelg:
npx changelg --release v1.2.0
## v1.2.0 (2026-06-15)
### ⚠ BREAKING CHANGES
- **auth:** existing tokens are invalidated on deploy. (6667b72)
### Features
- **api:** add cursor pagination (a1b2c3d)
### Bug Fixes
- handle an empty response body (e4f5a6b)
That's commits since your latest tag, grouped, scopes bolded, hashes linked to your remote. Redirect it into a file, prepend it to CHANGELOG.md, done.
How it works
-
Range:
changelg(since the latest tag),changelg v1.1.0(since a ref), orchangelg v1.1.0..v1.2.0(explicit). -
Grouping:
feat→ Features,fix→ Bug Fixes,perf→ Performance. A!or aBREAKING CHANGE:footer surfaces a dedicated ⚠ BREAKING CHANGES section — showing the breaking note, not just the subject. -
Noise control:
docs/chore/refactor/ etc. are hidden by default;--allbrings them in. -
Links: commit hashes auto-link to your
originremote, or--no-linksfor plain short hashes.
Zero dependencies, both ecosystems
It's pure standard library — git log plus a parser. No Rust toolchain, no config file, no token, no Actions. The Node and Python ports are behavior-identical (same flags, byte-identical output):
npx changelg # Node >= 18
pip install changelg # Python >= 3.8
- npm: https://www.npmjs.com/package/changelg
- PyPI: https://pypi.org/project/changelg
- GitHub: https://github.com/jjdoor/changelg
How do you handle changelogs today — a tool, by hand, or "the git log is the changelog"? And if you don't use Conventional Commits, would a tool like this nudge you toward them, or is that a non-starter?
Top comments (0)