Skip to main content

changelogen vs conventional-changelog vs auto-changelog: Changelog Generation in Node.js (2026)

·PkgPulse Team

TL;DR

changelogen is the UnJS changelog generator — generates changelogs from conventional commits, creates GitHub releases, bumps versions, and supports monorepos. conventional-changelog is the Angular-style changelog generator — parses commit messages following the Conventional Commits spec, powers semantic-release, highly configurable. auto-changelog generates changelogs from git history — no commit convention required, groups by version tags, simple and opinionated. In 2026: changelogen for modern projects with conventional commits, conventional-changelog for semantic-release pipelines, auto-changelog for simple projects without commit conventions.

Key Takeaways

  • changelogen: ~500K weekly downloads — UnJS, GitHub releases, version bumping, monorepo
  • conventional-changelog: ~5M weekly downloads — Angular convention, powers semantic-release
  • auto-changelog: ~200K weekly downloads — no convention needed, tag-based, simple
  • changelogen and conventional-changelog require Conventional Commits format
  • auto-changelog works with any commit style
  • changelogen has the best DX for modern release workflows

changelogen

changelogen — modern changelog generation:

CLI usage

# Generate changelog:
npx changelogen

# Generate and bump version:
npx changelogen --bump

# Generate, bump, and create GitHub release:
npx changelogen --release

# Full release workflow:
npx changelogen --release --push
# 1. Parses commits since last tag
# 2. Generates CHANGELOG.md
# 3. Bumps version in package.json
# 4. Creates git commit and tag
# 5. Creates GitHub release
# 6. Pushes to remote

Output format

## v1.2.0

### 🚀 Enhancements

- Add dark mode support (#123)
- Implement package search API (#125)

### 🩹 Fixes

- Fix memory leak in WebSocket handler (#124)
- Correct pagination offset calculation (#126)

### 📖 Documentation

- Update API reference (#127)

### 🏡 Chore

- Upgrade TypeScript to 5.6 (#128)

Configuration

// changelog.config.ts
export default {
  // Commit types:
  types: {
    feat: { title: "🚀 Enhancements" },
    fix: { title: "🩹 Fixes" },
    perf: { title: "🔥 Performance" },
    docs: { title: "📖 Documentation" },
    chore: { title: "🏡 Chore" },
    refactor: { title: "💅 Refactors" },
    test: { title: "✅ Tests" },
    build: { title: "📦 Build" },
    ci: { title: "🤖 CI" },
  },

  // Scopes to exclude:
  excludeAuthors: ["dependabot[bot]"],

  // GitHub config:
  repo: {
    owner: "pkgpulse",
    repo: "pkgpulse",
  },

  // Output:
  output: "CHANGELOG.md",
}

Programmatic API

import {
  generateMarkDown,
  parseCommits,
  getGitDiff,
  loadChangelogConfig,
} from "changelogen"

const config = await loadChangelogConfig(process.cwd())
const rawCommits = await getGitDiff("v1.1.0")  // Since last tag
const commits = parseCommits(rawCommits, config)
const markdown = await generateMarkDown(commits, config)

console.log(markdown)

conventional-changelog

conventional-changelog — Angular convention:

CLI usage

# Generate changelog (append to CHANGELOG.md):
npx conventional-changelog -p angular -i CHANGELOG.md -s

# First release (full history):
npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0

# Presets: angular, atom, codemirror, conventionalcommits, ember, eslint, jquery, jshint
npx conventional-changelog -p conventionalcommits -i CHANGELOG.md -s

Output format (Angular preset)

## [1.2.0](https://github.com/org/repo/compare/v1.1.0...v1.2.0) (2026-03-09)

### Features

* **search:** add package search API ([#125](https://github.com/org/repo/issues/125)) ([abc1234](https://github.com/org/repo/commit/abc1234))
* **ui:** add dark mode support ([#123](https://github.com/org/repo/issues/123)) ([def5678](https://github.com/org/repo/commit/def5678))

### Bug Fixes

* **api:** fix memory leak in WebSocket handler ([#124](https://github.com/org/repo/issues/124)) ([ghi9012](https://github.com/org/repo/commit/ghi9012))
* **pagination:** correct offset calculation ([#126](https://github.com/org/repo/issues/126)) ([jkl3456](https://github.com/org/repo/commit/jkl3456))

### BREAKING CHANGES

* **api:** removed deprecated `/v1/search` endpoint

Programmatic API

import conventionalChangelog from "conventional-changelog"

// Stream-based:
conventionalChangelog({
  preset: "angular",
  releaseCount: 1,  // Only latest release
}).pipe(process.stdout)

// With custom options:
conventionalChangelog({
  preset: {
    name: "conventionalcommits",
    types: [
      { type: "feat", section: "Features" },
      { type: "fix", section: "Bug Fixes" },
      { type: "perf", section: "Performance" },
      { type: "docs", section: "Documentation", hidden: true },
    ],
  },
})

With semantic-release

// .releaserc.json
{
  "branches": ["main"],
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/changelog",
    "@semantic-release/npm",
    "@semantic-release/github",
    "@semantic-release/git"
  ]
}
// semantic-release uses conventional-changelog internally:
// 1. @semantic-release/commit-analyzer — determines version bump
// 2. @semantic-release/release-notes-generator — generates release notes
// 3. @semantic-release/changelog — updates CHANGELOG.md
// All powered by conventional-changelog parsers

Conventional Commits format

feat(scope): add new feature          → minor bump
fix(scope): fix a bug                 → patch bump
perf(scope): improve performance      → patch bump
docs(scope): update documentation     → no bump
chore(scope): maintenance task        → no bump

BREAKING CHANGE: description          → major bump
feat!: breaking feature               → major bump

auto-changelog

auto-changelog — no convention needed:

CLI usage

# Generate changelog from git tags:
npx auto-changelog

# With options:
npx auto-changelog \
  --output CHANGELOG.md \
  --template keepachangelog \
  --unreleased \
  --commit-limit 50

# Prepend unreleased changes:
npx auto-changelog --unreleased

Output format

# Changelog

## [Unreleased]

- Add dark mode support [`abc1234`](https://github.com/org/repo/commit/abc1234)
- Fix memory leak [`def5678`](https://github.com/org/repo/commit/def5678)

## [v1.1.0] - 2026-03-01

- Add package search API [`ghi9012`](https://github.com/org/repo/commit/ghi9012)
- Implement WebSocket connections [`jkl3456`](https://github.com/org/repo/commit/jkl3456)
- Fix pagination bug [`mno7890`](https://github.com/org/repo/commit/mno7890)

## [v1.0.0] - 2026-02-01

- Initial release

Configuration

// .auto-changelog (or package.json "auto-changelog" field)
{
  "output": "CHANGELOG.md",
  "template": "keepachangelog",
  "unreleased": true,
  "commitLimit": false,
  "backfillLimit": false,
  "hideCredit": false,
  "sortCommits": "date",
  "startingVersion": "v1.0.0",
  "ignoreCommitPattern": "^(chore|docs|ci):",
  "tagPattern": "v[\\d+\\.]+",
  "breakingPattern": "BREAKING CHANGE:"
}

Templates

# Built-in templates:
npx auto-changelog --template compact
npx auto-changelog --template keepachangelog
npx auto-changelog --template json

# Custom Handlebars template:
npx auto-changelog --template ./my-template.hbs

No commit convention required

auto-changelog works with ANY commit style:

  "Fixed the login page"          ✅ Works
  "feat: add dark mode"           ✅ Works
  "WIP: stuff"                    ✅ Works
  "Merge pull request #123"       ✅ Works (shows PR)

Groups commits by git tag (version):
  v1.2.0 → all commits since v1.1.0
  v1.1.0 → all commits since v1.0.0

No parsing of commit types — just chronological grouping.

Feature Comparison

Featurechangelogenconventional-changelogauto-changelog
Commit convention required
Version bumping❌ (use standard-version)
GitHub releases❌ (use semantic-release)
Monorepo support⚠️ (with plugins)
Custom templates✅ (Handlebars)
Presets✅ (angular, etc.)✅ (compact, keepachangelog)
Programmatic API
TypeScript
Emoji categories
semantic-release✅ (powers it)
Weekly downloads~500K~5M~200K

When to Use Each

Use changelogen if:

  • Want a modern all-in-one release tool (changelog + bump + GitHub release)
  • Use conventional commits and want emoji-categorized output
  • Working with monorepos (UnJS ecosystem)
  • Want the simplest release workflow

Use conventional-changelog if:

  • Using semantic-release for automated releases
  • Need Angular/conventional commit parsing
  • Want customizable presets and templates
  • Building CI/CD pipelines with automated versioning

Use auto-changelog if:

  • Don't follow a commit convention
  • Want changelogs grouped by git tags
  • Need the simplest possible setup (just run it)
  • Prefer keep-a-changelog format

Methodology

Download data from npm registry (weekly average, February 2026). Feature comparison based on changelogen v0.5.x, conventional-changelog-cli v5.x, and auto-changelog v2.x.

Compare release tooling and developer utilities on PkgPulse →

Comments

Stay Updated

Get the latest package insights, npm trends, and tooling tips delivered to your inbox.