Skip to content

Introduction

standard-changelog is conventional-changelog with the Angular commit convention preset built in. It reads your git history and turns it into a CHANGELOG.md, grouping commits into sections like Features and Bug Fixes.

The only difference from conventional-changelog is that there is no preset to install or choosestandard-changelog always uses the Angular preset. You just write commit messages that follow the convention, and the tool assembles the release notes for you.

  1. Install standard-changelog:

    pnpm add -D standard-changelog
  2. Make commits following the Angular commit convention as you work:

    feat(api): add async write() generator
    fix(cli): resolve config path relative to cwd
    perf(parser): cache compiled header regex
  3. Run standard-changelog:

    pnpm standard-changelog

    Add --stdout to print the result to the terminal instead of writing the file.

  4. Get your changelog. A new section is prepended to CHANGELOG.md (existing entries are kept), using the version from your package.json:

    CHANGELOG.md
    # [1.1.0](https://github.com/acme/app/compare/v1.0.0...v1.1.0) (2026-07-01)
    ### Features
    * **api:** add async write() generator ([0f7e2c1](https://github.com/acme/app/commit/0f7e2c1a9d3e4b5c6f7089abcdef0123456789ab))
    ### Bug Fixes
    * **cli:** resolve config path relative to cwd ([a3b9d84](https://github.com/acme/app/commit/a3b9d8472e1f0c9b8a7d6e5f4c3b2a1908f7e6d5))
    ### Performance Improvements
    * **parser:** cache compiled header regex ([c1d2e3f](https://github.com/acme/app/commit/c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0))

By default the version comes from the closest package.json, only commits made since the last semver tag are included, and the result is written to CHANGELOG.md. When package.json has a repository field, versions and commit hashes link to your git host (as above); without it, they are plain text.

The first time you adopt the tool, generate notes for every release at once. --release-count 0 (or -r 0) rebuilds the full history and overwrites the output file:

pnpm standard-changelog -r 0

Limit generation to a commit range with --from and --to (each accepts a tag or SHA):

pnpm standard-changelog --from v1.0.0 --to HEAD

Prefer to generate changelogs in code? The same result is available through the JS API:

import { StandardChangelog } from 'standard-changelog'
const generator = new StandardChangelog(process.cwd())
.readPackage()
for await (const chunk of generator.write()) {
process.stdout.write(chunk)
}