// Guide

How to Write a Changelog

A CHANGELOG.md is more than a git log. Done well it's a trust signal, a migration guide, and a historical record. Here's how to write one that developers actually use.

Try Free — No Account Needed →

What is a changelog?

A changelog is a file that records all notable changes to a project, organized by version and date. It lives in the root of your repository as CHANGELOG.md and is one of the first files developers look for when evaluating or adopting a library.

A good changelog answers three questions for any given version: What's new? What broke? What do I need to change?

The Keep a Changelog format

Keep a Changelog is the de facto standard, used by thousands of open source projects. It defines a consistent structure that developers recognize immediately:

CHANGELOG.md — full example
# Changelog All notable changes to this project are documented in this file. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versioning follows [Semantic Versioning](https://semver.org/). ## [Unreleased] ### Added - Draft feature not yet released ## [2.4.0] — 2026-06-02 ### Added - Two-factor authentication via TOTP - Dashboard 30-day retention chart ### Fixed - Password reset emails not sending for pre-2024 accounts - Safari: session cookie not cleared on logout ### Changed - Auth token validation refactored — 60% faster ### Breaking - /auth/token now requires client_id in request body ## [2.3.1] — 2026-05-14 ### Fixed - Crash when uploading files larger than 50MB on mobile ## [2.3.0] — 2026-05-01 ### Added - Dark mode for all screens

The six change categories

Keep a Changelog defines six categories. Use only the ones that apply to each release:

What to include and what to skip

IncludeSkip
New user-facing featuresInternal refactors with no behaviour change
Bug fixes that affected usersTest-only changes
Breaking changes — alwaysCI/build changes (unless they affect consumers)
Performance improvements (with numbers)Dependency version bumps (unless they affect the public API)
Security fixesTypo fixes in code or comments
DeprecationsWIP or stale commits that didn't ship

Breaking changes: how to communicate them

Breaking changes deserve special treatment. They're not just another list item — they're the reason a user's CI might fail after updating. Communicate them:

The [Unreleased] section

Keep a Changelog recommends maintaining an [Unreleased] section at the top of the file. As you merge features and fixes, add them here. When you release, rename the section to the version number and date, and create a new empty [Unreleased]. This keeps the changelog always up to date and makes release day trivial.

Changelog vs CHANGELOG.md vs release notes

These terms get conflated. To be precise: CHANGELOG.md is the file in your repository — the technical record. A changelog page (like a hosted public changelog at yourapp.com/changelog) is the user-facing version. Release notes are what you publish with each release on the App Store, GitHub, or via email. They're all related but serve different audiences. See our full comparison.

Never delete old entries. A changelog is a historical record. Deleting old versions removes useful context for users on older versions. If something was wrong in an old entry, add a correction note — don't delete.

How to generate a changelog automatically

Maintaining a changelog manually is the main reason teams let it go stale. ChangelogAI generates the Keep a Changelog format from your commits — paste your git log, get a properly formatted CHANGELOG.md entry in seconds. Copy and prepend to your existing file.

Frequently Asked Questions

Should I use CHANGELOG.md or changelog.md?

CHANGELOG.md (all caps) is the convention used by most open source projects. Some tools (like GitHub) look for it specifically. Use all caps.

How do I handle a project with no changelog?

Start now. Create a CHANGELOG.md with the current version, date, and the most important changes. You don't need to retroactively document every past version — just start from today and go forward.

What's the difference between a changelog and release notes?

A changelog is the persistent historical record in your repository. Release notes are the per-release communication you publish to users. See our full guide: /changelog-vs-release-notes/

Should I include every commit in the changelog?

No. Only user-facing changes belong in the changelog. Skip internal refactors, test changes, CI updates, and dependency bumps unless they affect users.

How do I automate changelog generation?

Paste your git log into ChangelogAI and select the Keep a Changelog format. You get a properly formatted entry in seconds to prepend to your CHANGELOG.md. API access for full automation is on the roadmap.

Related Tools & Guides

Stop writing release notes by hand

Paste your commits. Get polished, publish-ready release notes in seconds. Completely free, no account needed.

Try ChangelogAI Free →