changelogen vs conventional-changelog vs auto-changelog: Changelog Generation in Node.js (2026)
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
| Feature | changelogen | conventional-changelog | auto-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 →