Skip to main content

Glossary

What is the Keep a Changelog format?

Keep a Changelog is a widely used convention for writing a CHANGELOG.md file. Each version gets its own heading with a release date, newest first, plus an Unreleased section at the top. Entries are grouped under six fixed types: Added, Changed, Deprecated, Removed, Fixed, and Security.

Updated 2026-09-15

What does the Keep a Changelog format look like?

Keep a Changelog is a community convention, not a tool. It started as a short guide published at keepachangelog.com and spread through open source projects because it is easy to follow. The guide describes one Markdown file, usually named CHANGELOG.md, that lives at the root of a repository.

The file has a strict shape. A short intro says the project follows the convention. An Unreleased section sits at the top and collects changes that have merged but not yet shipped. Below it, every released version has a heading in the form [1.4.0] - 2026-03-02, with the newest version first. Dates use the ISO format so they read the same in every country.

Inside each version, entries are grouped under six headings, and only those six:

  • Added for new features
  • Changed for changes to existing behavior
  • Deprecated for features that will be removed soon
  • Removed for features that are now gone
  • Fixed for bug fixes
  • Security for vulnerability fixes

Version numbers follow semantic versioning, and each version heading links to a diff between it and the previous tag. The guide also states its core principle plainly: a changelog is written for humans, not machines, and a raw git log is not a changelog.

Why does the Keep a Changelog format matter?

The format solves a reading problem. When every project structures its history the same way, a developer evaluating an upgrade can scan for the one section that matters. Someone worried about a breaking change jumps to Changed and Removed. Someone patching a vulnerability jumps to Security.

It also solves a writing problem. Six fixed categories remove the daily debate about how to phrase an entry. The Unreleased section gives engineers a place to log a change in the same pull request that makes it, so the record is never rebuilt from memory at release time.

For product and customer success teams, the value is trust. A customer who finds a consistent, dated, versioned record of every change tends to believe the rest of what the company says. A deprecation notice that appears in the Deprecated section one version before removal gives customers a fair warning and gives support a page to point to.

The format has limits. It assumes numbered releases, which many continuously deployed SaaS products no longer have. It is written in a developer's voice and lives in a code repository, so non-technical customers rarely see it. Those limits shape how the format is used outside open source, as covered below.

Examples of the Keep a Changelog format

The clearest example is the convention's own CHANGELOG.md, which documents changes to the guide using the exact structure it prescribes.

Many open source libraries on GitHub adopt the format and say so in the first line of their changelog. A typical entry reads like this:

[2.3.0] - 2026-01-15

  • Added: Export reports as CSV from the dashboard
  • Fixed: Date filter ignored the selected timezone

A SaaS API team often keeps a CHANGELOG.md in the format for its SDK or client library, while publishing a plain-language product update for end users. The two documents describe the same release at different altitudes.

Internal platform teams use the format for shared services other engineers consume. Here the Deprecated and Removed sections do the heaviest work, because downstream teams plan their migrations from them. Our changelog template guide walks through more variations.

How to write a changelog in the Keep a Changelog format

  1. Create CHANGELOG.md at the repository root. State in the intro that the file follows Keep a Changelog and semantic versioning.
  2. Keep an Unreleased section at the top. Ask every pull request that changes behavior to add one line under it. This is the habit that makes the format work.
  3. Write entries for people, not machines. Describe the effect on the user, not the commit. "Fixed date filter ignoring the timezone" beats "refactored DateFilter."
  4. Use only the six categories. If an entry does not fit, it probably needs to be split or rewritten. Do not invent new headings.
  5. On release, rename Unreleased to the version and date. Use ISO dates such as 2026-09-15 and start a fresh Unreleased section above it.
  6. Link each version heading to a diff. Comparison links let reviewers see the actual code behind a line.
  7. Call out breaking changes and deprecations early. A change that lands in Deprecated should reappear in Removed in a later version, never as a surprise.
  8. Never rewrite published history. If a release was wrong, note it in a later entry rather than editing the old one.

If your team ships continuously, keep the categories and the human voice but key entries by date instead of version. Our post on changelog versioning covers how to choose between the two.

Keep a Changelog vs. release notes and other neighbors

The most common mistake is treating the format as a customer-facing channel. It is a developer record. Release notes are the narrative layer on top: they explain why a change matters, show a screenshot, and are written for the people who buy and use the product. Most SaaS teams need both, and the difference between a changelog and release notes is worth settling early.

A second mistake is pasting the git log into the file. Commit messages are written for reviewers, in the order code landed, and full of noise. The guide explicitly rejects this practice. Auto-generating a draft from commits is fine; publishing it unedited is not. See changelog automation for where tooling helps and where a human still edits.

Other frequent errors include mixing date formats, skipping the Unreleased section and reconstructing the list at release time, and silently removing a feature without a prior Deprecated entry. Semantic versioning is a related but separate convention: it governs the version number, while Keep a Changelog governs the text under it. Read the full Keep a Changelog walkthrough for a deeper comparison.

How AnnounceKit handles keep a Changelog format

AnnounceKit is the customer-facing layer that sits above a CHANGELOG.md. Teams keep the developer record in the repository and publish the human version on a changelog page on their own domain. The same post can appear in 10+ in-app widget display modes, go out as an email digest, and post to Slack.

AI post generation turns a raw list of changes into a draft your product marketer can edit, and the official MCP server lets AI agents create and publish posts as part of a release pipeline. Segmentation targets the right customers with each update, while feature requests with voting and Jira sync, plus NPS surveys, close the loop after a release. Pricing is flat per project from $79/month with a 15-day free trial.

Keep a Changelog format: frequently asked questions

Is Keep a Changelog a tool or a standard?

It is neither software nor a formal standard. It is a written convention describing how a CHANGELOG.md file should be structured. Any editor and any repository can follow it, and many tools generate or validate files in its shape.

What are the six change types in Keep a Changelog?

Added, Changed, Deprecated, Removed, Fixed, and Security. Every entry belongs under exactly one of these headings inside a version section. The convention defines only these six, so teams should avoid inventing categories of their own.

Does Keep a Changelog require semantic versioning?

The guide recommends semantic versioning but the two are separate conventions. Semantic versioning governs the version number. Keep a Changelog governs the text under each version heading. Teams that ship continuously can key sections by date instead of version and still follow the rest of the format.

Can I use the Keep a Changelog format for a SaaS product update page?

You can, but it is written in a developer's voice and lives in a code repository. Most SaaS teams keep it for engineers and publish separate release notes for customers. The category discipline and the human-readable entries transfer well to that customer-facing page.

What is the Unreleased section for?

It collects changes that have merged but have not shipped yet. Engineers add a line there in the same pull request that makes the change. At release time the section is renamed to the version and date, and a fresh Unreleased section starts above it.

Related terms and reading

Changelog

A changelog is a chronological record of the notable changes made to a software product, listed by version or date. Each entry states wha…

Definition →

Semantic versioning

Semantic versioning (SemVer) is a numbering scheme for software releases that uses three numbers, MAJOR.MINOR.PATCH, such as 2.4.1. The m…

Definition →

Release notes

Release notes are the document a software team publishes alongside a release to tell users what changed and why it matters. They usually …

Definition →

Breaking change

A breaking change is a product, API, or software update that stops existing integrations, workflows, or code from working the way they di…

Definition →

Deprecation notice

A deprecation notice is a formal announcement that a feature, API, product version, or integration is being phased out. It tells users wh…

Definition →

Changelog automation

Changelog automation uses software to generate, format, and publish changelog entries from sources such as commits, pull requests, issue …

Definition →

How to Keep a Changelog: Format, Best Practices, and Examples Written for Humans

Read the article →

Changelog Template Examples: 5 Types You Can Copy Today

Read the article →

Changelog Versioning: How Semantic Version Numbers Work (With 5 SaaS Examples)

Read the article →

Changelog vs. Release Notes: Understanding the Differences and When to Use Each

Read the article →

How to write a changelog

See how AnnounceKit does it →

Changelog software

See how AnnounceKit does it →

What is a changelog

See how AnnounceKit does it →

Put Keep a Changelog format into practice with AnnounceKit

Changelog, in-app widgets, feature requests and NPS in one platform. 15-day free trial, no credit card.

Or book a demo to see AnnounceKit in action.