Release Notes Generator: Conventional Commits & CHANGELOG Guide
Writing release notes manually is time-consuming and inconsistently done under release pressure. Conventional Commits combined with automation tools like semantic-release and release-please turn your git history into structured release notes automatically — so your changelogs are always accurate, up to date, and require no extra effort on release day.
Related Products
on GumroadDeveloper Productivity Bundle
Stop rebuilding the same setup every project. 51 VSCode snippets, 40 Git aliases, 5 Docker Compose stacks, 5 GitHub Actions workflows, 5 README templates, and a dotfiles kit. Set up a professional dev environment in under an hour.
Buy on Gumroad →AI Prompt Engineering Toolkit
58 structured prompt templates for Claude, ChatGPT, and Gemini — organized by use case. Code Review, Debugging, Documentation, Architecture, and 10 model-specific tips. Stop writing prompts from scratch.
Buy on Gumroad →Developer Cheat Sheet Bundle
10 print-ready cheat sheets for the tools developers use every day: Git, Docker, Linux CLI, SQL, Regex, HTTP Status codes, VS Code shortcuts, Bash scripting, jq/JSON, and Markdown.
Buy on Gumroad →You Might Also Need
JSON Formatter & Validator
Format, beautify, and validate JSON online. Paste your JSON to instantly pretty-print it with 2-space, 4-space, or tab indentation. Minify JSON too. Free, runs in your browser.
Open free tool →
Regex Tester
Free regex tester. Test regular expressions against multiple strings with expected match/no-match assertions — see instant pass/fail results. Built-in presets for email, URL, IPv4, and phone. Pro: unl
Open free tool →
Base64 Encoder & Decoder
Free Base64 Encoder & Decoder. Convert text, images, and any file to Base64 and back. Supports URL-safe Base64, image data URIs, and file download from Base64. Runs 100% in your browser — no data sent
Open free tool →
More Free Tools
Related Articles
curl 深度使用手冊:API 測試從入門到進階
curl 是每位開發者必備的 CLI 工具。本文涵蓋 GET/POST/PUT/DELETE 請求、認證、header 設定、檔案上傳、除錯技巧,以及 REST API 測試的完整實戰範例。
Best AI Code Review Tools 2026: CodeRabbit, Sourcery, DeepCode & Bito Compared
Compare top AI code review tools for 2026: CodeRabbit, Sourcery, DeepCode, and Bito. Features, pricing, GitHub/GitLab integration, and choosing the right tool for your team.
AI Code Review Tools 2026: GitHub Copilot, CodeRabbit, Qodo Merge Ranked
Compare AI code review tools for 2026: GitHub Copilot code review, CodeRabbit, Qodo Merge, Sourcery, and PR-Agent. Pricing, accuracy, and GitHub integration.
AI Coding Tools Comparison 2026: GitHub Copilot vs Cursor vs Windsurf vs Cline
Comprehensive comparison of the best AI coding tools in 2026: GitHub Copilot, Cursor, Windsurf, and Cline. Pricing, features, model support, and real-world benchmarks.
AI Pair Programming in 2026: GitHub Copilot vs Cursor vs Claude Code
Master AI pair programming in 2026. Compare GitHub Copilot, Cursor, and Claude Code for autocomplete, chat, and agentic workflows. Includes setup guides and productivity tips.
Enjoying this tool? Get more like it.
Weekly developer tool guides, productivity playbooks & AI tricks. Free. No spam.
Unlock AI-Powered Dev Tools
- ⚡ AI Code Review, Doc Generator & SQL Builder
- ⚡ All premium templates & early access
- ⚡ Member discounts on Gumroad products
$9/mo after trial · Cancel anytime
Want the full toolkit?
Get DevPlaybook Pro
Every template, guide, boilerplate, and automation script in one bundle. 13 premium products — grab them all at once and save big.
MIT licensed · Instant download · No subscription
See what's included → Browse all deals →Conventional Commits → Release Notes Mapping
Conventional Commits encode intent in the commit message. Release tools read these types and map them to version bumps and changelog sections automatically.
# Commit format: type(scope): short description
#
# BREAKING CHANGE → MAJOR bump → "Breaking Changes" section
feat!: migrate authentication to OAuth 2.0
# or with footer:
feat(auth): add OAuth 2.0 support
BREAKING CHANGE: Basic auth is no longer supported. Migrate to OAuth tokens.
# feat → MINOR bump → "Features" section
feat(api): add bulk user import endpoint
feat: support dark mode in dashboard
# fix → PATCH bump → "Bug Fixes" section
fix(auth): prevent session timeout on active use
fix: correct timezone handling in date picker
# perf → PATCH bump → "Performance Improvements" section
perf(db): add index on users.email column
# These types produce PATCH but often appear in notes:
refactor: extract validation logic to separate module
docs: add API authentication examples
# These types are typically excluded from release notes:
test: add edge case coverage for date parsing
chore: upgrade dev dependencies
ci: cache npm dependencies in GitHub Actions semantic-release GitHub Actions Setup
semantic-release is fully automated — it runs on every merge to main, determines if a release is needed, bumps the version, updates CHANGELOG.md, creates a GitHub Release, and optionally publishes to npm. Zero manual steps after setup.
# .github/workflows/release.yml
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # full history required for semantic-release
persist-credentials: false
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npx semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} # omit if not publishing to npm
# release.config.js
module.exports = {
branches: ['main'],
plugins: [
'@semantic-release/commit-analyzer',
'@semantic-release/release-notes-generator',
['@semantic-release/changelog', { changelogFile: 'CHANGELOG.md' }],
'@semantic-release/npm',
['@semantic-release/git', {
assets: ['CHANGELOG.md', 'package.json'],
message: 'chore(release): ${nextRelease.version} [skip ci]'
}],
'@semantic-release/github',
],
}; release-please: PR-Based Release Workflow
release-please creates a Release PR that accumulates all pending changes. You decide when to release by merging the PR — giving you control over timing while keeping the preparation work automated.
# .github/workflows/release-please.yml
name: Release Please
on:
push:
branches: [main]
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: googleapis/release-please-action@v4
id: release
with:
release-type: node
token: ${{ secrets.GITHUB_TOKEN }}
# Steps below only run when the Release PR is merged (a release happens)
- uses: actions/checkout@v4
if: ${{ steps.release.outputs.release_created }}
- uses: actions/setup-node@v4
if: ${{ steps.release.outputs.release_created }}
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- run: npm ci && npm publish
if: ${{ steps.release.outputs.release_created }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} semantic-release vs release-please Comparison
| Dimension | semantic-release | release-please |
|---|---|---|
| Release trigger | Fully automatic on merge to main | Manual: merge the Release PR |
| Release PR | No — releases immediately | Yes — accumulates in a PR |
| Monorepo support | Via plugins (multi-semantic-release) | Native (release-please-config.json) |
| Plugin ecosystem | Rich (npm, GitHub, GitLab, Slack...) | Focused (GitHub Releases) |
| Setup complexity | Medium (release.config.js) | Low (one action, minimal config) |
| Best for | npm libraries, continuous delivery | Apps, monorepos, controlled cadence |
Frequently Asked Questions
What makes good release notes?▼
Good release notes answer three questions a user cares about: What is new (new features)? What is fixed (bugs resolved)? Does anything break (breaking changes)? Structure matters: group changes by type (Features, Bug Fixes, Breaking Changes), include a short summary at the top, link to relevant issues or PRs for context, and provide a migration path for breaking changes. Avoid developer jargon — write for the person upgrading, not the person who wrote the code.
What is Conventional Commits and why does it enable automation?▼
Conventional Commits is a specification for structuring commit messages: type(scope): description. The type encodes intent — feat for new features, fix for bug fixes, docs for documentation. Release tools parse these types to determine version bumps and categorize changes automatically. Without a consistent commit format, every release requires manual curation. With Conventional Commits, releasing becomes a single command that reads git log, determines the version, and generates formatted notes.
How do I set up semantic-release in a GitHub Actions workflow?▼
Install semantic-release: npm install --save-dev semantic-release @semantic-release/git @semantic-release/changelog. Create a release.config.js or add a 'release' key in package.json. In your GitHub Actions workflow, add a release job that runs on main with: npx semantic-release. semantic-release needs a GITHUB_TOKEN with write access to create releases. It automatically reads commits since the last tag, determines the version bump, publishes to npm (if configured), creates a GitHub Release, and updates CHANGELOG.md.
What is the difference between semantic-release and release-please?▼
Both automate releases from Conventional Commits, but with different philosophies. semantic-release runs on every merge to main and releases immediately if there are releasable commits. release-please creates a Release PR that accumulates all pending changes — you control when the release actually happens by merging the PR. Use semantic-release for fully automated, continuous release pipelines (npm libraries). Use release-please when you want a human to approve the release timing (apps, teams with release windows, Google-style projects).
How do I maintain a CHANGELOG.md manually?▼
Follow the Keep a Changelog format: each release gets a section with version and date header. Organize entries under Added, Changed, Deprecated, Removed, Fixed, Security subsections. Keep an [Unreleased] section at the top that accumulates changes since the last release. When you cut a release, rename [Unreleased] to the version and date, and create a new empty [Unreleased] section. Link version headers to git comparison URLs (e.g., github.com/owner/repo/compare/v1.0.0...v1.1.0) for diff visibility.
Can I use these tools in a monorepo with multiple packages?▼
Yes. release-please has first-class monorepo support — configure it to release each package independently with separate changelogs and version numbers using release-type per directory in release-please-config.json. semantic-release supports monorepos via the @semantic-release/exec plugin or multi-semantic-release. Nx and Turborepo both have release tooling built in. For simple monorepos, Changesets (by the Remix/Preconstruct team) is purpose-built for independently versioning multiple packages with human-authored change descriptions.