Changelog & Release Notes
Audit your CHANGELOG.md and format release notes — Keep-a-Changelog ready
Lint a CHANGELOG.md against semver and Keep-a-Changelog conventions, or normalize a messy release draft into the canonical Added / Changed / Fixed sections. Includes a starter template, runs entirely in your browser.
Hints (1)
How to use the changelog and release notes helper
Audit a CHANGELOG.md
- Open your existing
CHANGELOG.mdor paste its contents. - The hints panel reports missing-but-recommended structure: a
# Changelogtitle, an## [Unreleased]working section, semver-shaped version headers like## [1.2.0], and at least one##section. - Need a clean slate? Click Insert Keep-a-Changelog starter to drop in a battle-tested template you can edit.
Normalize release notes
- Switch to Release notes formatter.
- Paste a draft — often written in mixed case, with headings like
## what's newand### added. - The tool rewrites your H2 / H3 headings to the canonical Keep-a-Changelog sections (Added, Changed, Deprecated, Removed, Fixed, Security). Code blocks and prose are untouched.
- Copy the normalized output into your GitHub release, Slack channel, or roadmap doc.
The six Keep-a-Changelog sections (and when to use them)
| Section | Use for |
|---|---|
| Added | New features visible to users. |
| Changed | Behavior changes to existing features. |
| Deprecated | Features that still work but are scheduled for removal. |
| Removed | Features that have been removed in this release. |
| Fixed | Bug fixes. |
| Security | Security fixes — both CVEs and silent hardening. |
Sticking to these six buckets makes a changelog easy to scan, easy to diff between versions, and easy for downstream consumers (release notes bots, package managers, support teams) to parse mechanically.
Anatomy of a great release entry
A solid release entry looks like:
## [1.4.0] — 2026-04-21
### Added
- Real-time collaboration cursors in the editor.
### Changed
- Default theme is now light. Use the toggle in the toolbar to switch.
### Fixed
- Crash when exporting PDFs with embedded math (#812).
### Security
- Bumped `marked` to 12.1.2 (CVE-2024-XXXXX).
Notes that pay off later:
- Include a date. Knowing exactly when a release shipped helps support and bisection.
- Link to issues / PRs. Future readers don't have to spelunk git for context.
- One line per item. Helps changelog parsers and humans scan quickly.
- Highlight breaking changes. Either a dedicated subsection or bold "(breaking)" suffixes.
Where this helper fits in a release workflow
- During the release branch: keep an
## [Unreleased]section growing. The audit tab catches when you forget it. - At release time: rename
Unreleasedto the version + date, run the formatter to normalize sections, and copy into your GitHub release body. - After release: run a Markdown diff of the two changelog versions to confirm nothing important got cut.
Companion tools
- Markdown Diff — review what changed in CHANGELOG.md between branches.
- Markdown Heading Audit — make sure your changelog outline is consistent.
- Markdown Emoji Picker — pick safe Unicode for ✨ Added / 🐛 Fixed flair.
Privacy & data
Both tabs run client-side. Your changelog, release notes, and any embedded code never leave the browser tab.
Frequently asked questions
- Keep a Changelog is a widely adopted convention for project changelogs. It recommends a single Markdown file at the repo root with one section per release, dated, in newest-first order, broken down by Added / Changed / Deprecated / Removed / Fixed / Security. This tool checks your file against those conventions.
- It looks for a top-level `# Changelog` heading, an `## [Unreleased]` section, semver-shaped release headers (`## [1.2.0]`), and at least one `##` section. Each missing or non-standard pattern surfaces as a hint with severity (info or warning). Nothing is mutated — you make the edits.
- Paste a draft of release notes (often pasted from internal docs or generated by an LLM). The formatter rewrites any `## what's new`, `### added`, or `### fixed` style headings to the canonical Keep-a-Changelog casing (Added, Changed, Deprecated, Removed, Fixed, Security). Fenced code blocks are preserved untouched.
- No — by design. Commit-based generators (like `conventional-changelog` or `git-cliff`) are great when you control commit messages, but they don't fit teams that write release notes by hand. This tool is for hand-curated changelogs and the post-AI workflow where a teammate drafts notes and you normalize them.
- No. The normalizer detects ``` fences and leaves their contents untouched. That keeps embedded shell commands, JSON snippets, or migration code intact while only the headings around them are normalized.
- No. Both the audit and the formatter run entirely in your browser. We don't upload, log, or train on the file contents — safe for proprietary product roadmaps.
What is Keep a Changelog?
What does the 'Changelog hints' tab check?
How does the release notes formatter work?
Does it generate a changelog from git commits?
Will it touch fenced code blocks?
Is my changelog uploaded anywhere?
Related tools
More free browser tools in the same workflow.
Use the API
Ship Markdown features in your product with our REST API — render, convert, audit, and transform documents at scale.
New to the platform? Start with the API quickstart, then try a live request in the API playground.
Explore the API platform