Keep a Changelog vs GitHub Releases
They aren't rivals. A CHANGELOG.md is the history that lives with your code; GitHub Releases are announcements attached to tags. Keep a Changelog 2.0.0 settles which one leads: keep the changelog as the record and draw each release from it, so you write once and publish twice.
Updated Last checked 7 min readOpen-source libraries and packages
The short answer
- Keep a Changelog is a format for a CHANGELOG.md file: one section per version, latest first, changes grouped under six types. Its current version, 2.0.0, is dated 7 June 2026.
- GitHub Releases belong to git tags, can carry binaries, and notify people who watch the repository's releases.
- Keep a Changelog 2.0.0 makes CHANGELOG.md the canonical record: copy each version's section into the GitHub release rather than maintaining two.
- GitHub's generated release notes list merged pull requests. Group them with
.github/release.ymland treat them as a draft for the changelog entry.
CHANGELOG.md skeleton (Keep a Changelog 2.0.0)
The preamble comes from Keep a Changelog 2.0.0, which suggests pinning its link to the version you follow. Start every new project with this file and an Unreleased section.
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/2.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [1.0.0] - YYYY-MM-DD
### Added
- First stable release.
[Unreleased]: https://github.com/OWNER/REPO/compare/v1.0.0...HEAD
[1.0.0]: https://github.com/OWNER/REPO/releases/tag/v1.0.0Free tool · no sign-up
Can a coding agent read your changelog?
Paste your repository, a GitHub release or a CHANGELOG.md link. The free converter shows every version, breaking change, migration step and deprecation it can extract, as JSON plus an llms.txt summary.
No AI and nothing stored. Or paste a CHANGELOG.md instead
01What each one is
Keep a Changelog is a convention, not a tool: a human-readable CHANGELOG.md with an entry for every version, the latest first, dates as YYYY-MM-DD, and changes grouped as Added, Changed, Deprecated, Removed, Fixed and Security.
GitHub Releases are a GitHub feature: one page per git tag with Markdown notes, optional binary attachments, and flags for pre-release and latest release. GitHub can generate the notes from merged pull requests. For the general difference between the two kinds of document, see changelog vs release notes.
02What changed in Keep a Changelog 2.0.0
Version 2.0.0, dated 7 June 2026, is the first major revision. Its own changelog says it “breaks the guidance, not the format”: the six types of change, YYYY-MM-DD dates, Unreleased and [YANKED] are unchanged, so a changelog written to 1.1.0 stays valid. The changes that matter here:
- Release notes come from the changelog. The old “What about GitHub Releases?” answer became “Is a changelog the same as release notes?”, and covers any code host. A changelog is “the complete, ongoing record”; release notes are “an announcement for a single release”.
- Generated notes are a starting point. Release notes a host generates are “stored in the host's database, not your repository”, so Keep a Changelog says to keep CHANGELOG.md as the canonical record and generate release posts from it.
- Breaking changes are marked in place. A short
**Breaking:**marker on the entry, usually under Changed or Removed, instead of a separate section. - Every version links to its diff. Version headings resolve at the bottom of the file to a compare view against the previous version, and
[Unreleased]compares the latest tag toHEAD. - A pinned preamble. Link the exact version you follow, such as
https://keepachangelog.com/en/2.0.0/, “so it stays accurate as this page changes.”
Checked on 12 November 2026: keepachangelog.com's front page still opens 1.1.0 by default, and 2.0.0 lives at keepachangelog.com/en/2.0.0. The 1.1.0 tagline, “Don't let your friends dump git logs into changelogs”, was retired for “Clearly document the evolution of your projects.” The CHANGELOG.md format guide walks through the whole 2.0.0 format.
03Side by side
| CHANGELOG.md (Keep a Changelog) | GitHub Releases | |
|---|---|---|
| Lives in | Your repository, next to the code | GitHub, attached to a git tag |
| Role in Keep a Changelog 2.0.0 | The canonical record of every version | Where a version's notes are announced |
| How changes are reviewed | In pull requests, like code | Edited on GitHub by people with write access |
| Available off GitHub | Yes: in clones, mirrors and other forges | Only on GitHub and through its API |
| Notifies people | No | Yes: people can watch a repository's releases |
| Binaries and assets | No | Yes |
| Generated for you | With tools such as release-please or git-cliff | “Generate release notes” from merged pull requests |
| Machine-readable | Predictable headings that tools can parse | Free-form Markdown, plus API metadata (tag, date, pre-release) |
04When to use which
- A library or package published to a registry: both. CHANGELOG.md is the record, the release is the announcement.
- An app or CLI that ships binaries: GitHub Releases are where downloads live. Keep a CHANGELOG.md too if people skip several versions at once.
- A project without tags or releases: a CHANGELOG.md alone is fine.
- Product updates for non-developers: neither is ideal. Use a hosted changelog page people can find without a GitHub account.
05Keeping both in sync without double work
Pick one source of truth and generate the other. Keep a Changelog 2.0.0 recommends the changelog: “Keep the changelog as the record, and write the release notes from it rather than maintaining two.”
- CHANGELOG.md first: write the entry in your release pull request, then publish that section as the GitHub release. In Keep a Changelog's words, “a small script can extract that section and create the release without anyone retyping it”; the one below does.
- Tool-driven: release-please opens a release pull request that updates CHANGELOG.md and creates the GitHub release when you merge it. semantic-release publishes the GitHub release and, with its changelog plugin, writes CHANGELOG.md. Both read Conventional Commits; see release notes from commits, and semantic-release vs release-please vs Changesets to choose a tool.
- GitHub first: set up categories in
.github/release.yml, click Generate release notes, add highlights above the list, then copy the result into CHANGELOG.md, which stays the record. No labels yet? Generate a draft from git instead.
# The 1.4.0 section of CHANGELOG.md, without its heading
awk '/^## \[1\.4\.0\]/{found=1; next} found && /^(## |\[[^]]+\]: )/{exit} found' CHANGELOG.md > notes.md
# Create the release for the pushed tag v1.4.0 with those notes
gh release create v1.4.0 --title "1.4.0" --notes-file notes.md --verify-tagReplace 1.4.0 with your version. The awk line stops at the next version heading or at the link references at the bottom of the file. With --verify-tag, the GitHub CLI stops instead of creating a tag that hasn't been pushed. To run this on every tag without maintaining a script, the free LogPulse GitHub Action does the same in a workflow: it finds the section for the tag, puts breaking changes first, and falls back to the commits since the last tag when there's no section. It's one workflow step, uses: kalmwerk/release-notes-action@v1 (on GitHub).
changelog:
exclude:
labels:
- ignore-for-release
categories:
- title: Breaking changes
labels:
- breaking-change
- title: New features
labels:
- enhancement
- title: Bug fixes
labels:
- bug
- title: Other changes
labels:
- "*""*" is a catch-all for pull requests that didn't match any of the earlier categories. Categories only work if your team labels pull requests consistently. A Breaking changes heading is fine in a release, which is an announcement; in CHANGELOG.md, mark each breaking entry in place.
06Making either one readable by coding agents
Keep a Changelog 2.0.0 rules out a special format for machines: “There is no separate machine format, and there will not be one: this page is the format.” A consistent changelog is what tools and agents parse well: version headings, the six types and a **Breaking:** marker on every breaking entry. Paste your CHANGELOG.md or a GitHub releases URL into the free changelog-to-JSON converter to see what an agent can extract: versions, dates, breaking changes, migration steps and deprecations.
Before and after
Too vague
Release v1.4.0. See commits.
Specific and actionable
1.4.0. Added: a --json flag for my-cli status. Deprecated: --format=raw, use --json. Fixed: init no longer overwrites an existing config file. The same text is in CHANGELOG.md and on the GitHub release.
Fictional example: use your own verified names, versions and behavior.
LogPulse
Generate release notes with LogPulse
LogPulse is a hosted changelog that people and coding agents can both read. Here's exactly what it can do for the steps above, and what it can't.
Check your changelog, free
Paste a CHANGELOG.md or a GitHub releases link. A deterministic parser (no AI, nothing stored) shows the versions, breaking changes, migration steps and deprecations an agent can extract.
Draft notes from GitHub
Connect a repository: merged pull requests, commits to your default branch and published GitHub releases collect in an inbox. AI drafts a note in the tone you pick, listing breaking changes and deprecations only when the changes clearly show them. Nothing is published until you approve it. 3 AI drafts on Free; unlimited on Open source and Pro. Pro opens soon: .
Publish once, read everywhere
Approved notes go to a hosted changelog and an in-app widget, to email subscribers on Open source and Pro (Pro opens soon), and to a JSON feed and MCP server coding agents can query. CI and agents can publish with an API key.
What it doesn't do: LogPulse doesn't tag releases, bump versions, publish to npm or PyPI, or write CHANGELOG.md back to your repository; keep your release tooling for those. AI drafts can miss context, so review them like a pull request.
Before you publish
- One source of truth chosen, ideally CHANGELOG.md
- The preamble links the Keep a Changelog version you follow
- The tag, release title and changelog heading use the same version
- Pre-releases are marked as pre-releases on GitHub
- Versions link to compare views, and Unreleased compares to HEAD
- Highlights sit above any generated pull request list
- Your README tells people they can watch the repository's releases
Common questions
Is Keep a Changelog a standard?
Not a formal one; Keep a Changelog 2.0.0 says so itself. It's a widely used convention published at keepachangelog.com, and its value is that readers and tools recognise the structure. The current version is 2.0.0, dated 7 June 2026, although the site's front page still opened 1.1.0 by default when we last checked.
What changed in Keep a Changelog 2.0.0?
The guidance, not the format. The six types of change, YYYY-MM-DD dates, Unreleased and [YANKED] are unchanged, so 1.1.0 changelogs stay valid. New guidance covers in-place **Breaking:** markers, a pinned preamble, compare links for every version, CVE identifiers first in Security entries, release notes drawn from the changelog, LLM-drafted changelogs and monorepos. Keep a Changelog's own changelog lists every change.
Does GitHub generate a CHANGELOG.md for me?
No. ‘Generate release notes’ writes the notes for a release on GitHub. To maintain a CHANGELOG.md file, write it yourself or use a tool such as release-please, semantic-release with its changelog plugin, git-cliff or Changesets.
Should the GitHub release text match CHANGELOG.md exactly?
For the list of changes, yes. Keep a Changelog 2.0.0 calls the version's section of the changelog “already the draft”: copy it into the release, and expand it only if the announcement needs more, such as highlights or download instructions.
Can GitHub Releases replace a changelog for a package on npm or PyPI?
They can, if people can find them from the package page: on PyPI, add a Changelog URL under [project.urls]; on npm, link the releases page from your README. Keep a Changelog 2.0.0 advises keeping a CHANGELOG.md anyway, because releases stored by GitHub don't travel with your repository. See the npm and PyPI guides.
Sources
Facts last checked against these sources on .
Read next
How to write release notes from commits (Conventional Commits)
Turn commits into release notes: the Conventional Commits format, how feat, fix and ! map to versions and sections, tools that automate it, what to edit.
Read the guide Open-source libraries and packagesHow to write release notes for open-source libraries
How to write release notes: a copy-paste template, 3 examples (library, CLI, breaking change), a 7-point checklist and how Django and Node.js do it.
Read the guide Open-source libraries and packagesRelease notes templates in Markdown
Free Markdown release notes templates for a CHANGELOG.md entry, a GitHub release, a major version with migration steps, a security fix and a monorepo.
Read the guide Breaking changes, deprecations and versioningChangelogs for AI coding agents
Help coding agents upgrade your library correctly: real versions, explicit breaking changes and deprecations, and a machine-readable JSON feed or MCP server.
Read the guide Open-source libraries and packagesChangelog vs release notes: what's the difference?
A changelog is the full, versioned history of notable changes; release notes tell the story of one release. Definitions, real examples and when to keep both.
Read the guideMore guides: open-source libraries and packages
- CHANGELOG.md format, explained line by line
- How to generate a changelog from git commits
- semantic-release vs release-please vs Changesets (and git-cliff)
- How to keep a changelog for an npm package
- How to keep a changelog for a Python package on PyPI
Tools and resources
- Open-source changelog template, annotated
- CHANGELOG.md format, explained line by line
- semantic-release vs release-please vs Changesets (and git-cliff)
- Free tool: convert a CHANGELOG.md or GitHub release to JSON
- Free GitHub Action: release notes from your CHANGELOG.md on every tag
- kalmwerk/release-notes-action on GitHub: the Action's code and releases
- LogPulse developer docs: feed, API and MCP server
LogPulse
Changelogs coding agents can upgrade from.
Publish versions, breaking changes, migration steps and deprecations once. People get a widget and hosted changelog; agents get a JSON feed and MCP server. Free for open source.