Keep a Changelog Documentation
repository·main·Indexed 27 days ago
https://github.com/olivierlacan/keep-a-changelogGuidelines for generating and maintaining human-readable changelogs. The standard promotes organized change histories using six canonical categories: Added, Changed, Deprecated, Removed, Fixed, and Security, moving away from automated git log dumps to ensure documentation is written for humans.
What's inside Keep a Changelog
- Keep a Changelog is a tool/repository designed to generate content following the standards defined at https://keepachangelog.com/. Its purpose is to prevent developers from dumping raw git logs into changelogs, instead promoting human-readable, organized change histories.
Review sector adoption of Keep a Changelog
mainThe
docs/2.0.0-adoption-sectors.mdfile provides a verifiable list of organizations and projects that either use the Keep a Changelog (KAC) format in theirCHANGELOGfiles or explicitly recommend it in their documentation (e.g.,CONTRIBUTINGguides or engineering handbooks).Adoption is categorized into four sectors:
- Governments / public sector: Includes entities like The National Archives (UK) which mandates KAC in their engineering handbook, and CMS (U.S.) which recommends it in
CONTRIBUTING.md. - Non-profits / foundations: Includes the Wikimedia Foundation (which recommends KAC conventions in
CONTRIBUTING.md) and the CNCF. - Major open-source projects: Includes high-star projects like
Textualize/Rich,Textualize/Textual, andencode/HTTPX. - Large companies: Includes Microsoft (with significant org-wide footprint), Google, GitHub, Cloudflare, Shopify, and HashiCorp.
Note on signals:
- USE: The organization's
CHANGELOGfile carries the KAC format/header. - RECOMMEND: The organization's documentation (handbooks, style guides) instructs contributors to follow the KAC standard.
- Governments / public sector: Includes entities like The National Archives (UK) which mandates KAC in their engineering handbook, and CMS (U.S.) which recommends it in
Project History and Version Milestones
mainKey historical milestones for the Keep a Changelog project:
- 2014-05-31: Repository created by Olivier Lacan.
- 2015-02-16: First notable press coverage in WP Tavern.
- 2017-06-20: Release of v1.0.0, which introduced the Guiding Principles (including the 'for humans' principle) and the six standard change types.
- 2019-02-15: Release of v1.1.0.
- 2023-03-05: Release of v1.1.1.
The project is currently translated into 28 languages.
Handle yanked releases in the changelog
mainIf a version is pulled due to a serious bug or security issue (a "yanked" release), do not hide it. List it in the changelog and mark it clearly using brackets to make it easy for both humans and tools to notice.
Example format:
## [0.0.5] - 2014-12-13 [YANKED]Best practices for automation and LLMs
mainWhen using automation, CI, or Large Language Models (LLMs) to assist with changelogs, follow these principles:
- Human Curation: Machines can draft entries, but humans must curate them. A generated changelog should be treated as a draft, not a final product.
- No Machine-Only Format: There is no separate machine-readable format; the human-readable
CHANGELOG.mdis the source of truth for both humans and tools. - Conventional Commits: Use tools like Conventional Commits to generate drafts, but ensure the output is refined for readability.
- CI Integration: Use CI to handle the mechanics of the changelog (e.g., version bumping or drafting), but do not use it as a hard gate that prevents releases if the changelog is imperfect.
Follow the Keep a Changelog tone and voice principles
mainWhen writing changelogs or documentation following the Keep a Changelog standard, adhere to these eight core principles to ensure content is accessible to non-native English speakers and non-programmers:
- Lead with the point: State the recommendation first, then the reason.
- Don't gatekeep: Avoid words that imply knowledge is assumed, such as
obvious,simply,just,of course,trivially,everyone knows, oras you'd expect. - Plain over clever: Avoid idioms, metaphors, wordplay, and cultural references.
- Explain necessary jargon; drop the rest: Use common technical terms but define them briefly upon first use. Prefer plain verbs (e.g.,
releaseinstead ofship;formatted correctlyinstead ofwell-formed). - Short sentences: Aim for one idea per sentence using the active voice.
- Concise over complete: Remove redundant words or paragraphs that repeat existing points.
- Consistent terms: Use the same word for the same concept every time (e.g., always use
changelog,entry,version, orrelease). - Warm, not in-group: Use a friendly tone that does not rely on insider jokes or references that exclude outsiders.
Implement version-pinned changelog views via derivation
mainTo ensure that older specification pages display a changelog consistent with their era (rather than the latest version's format), use a derivation approach. Instead of maintaining separate files for every version, compute a 'pinned' view from the single live
CHANGELOG.mdat build time.Derivation Logic
When a page's major.minor track is older than the newest track documented in
CHANGELOG.md, the following transformations are applied to the view:- Identify Cutoff: The pin cutoff is the newest release on the page's major.minor track. Patch releases are ignored for the cutoff to allow for site fixes/translations without shifting the spec version.
- Filter Entries: All entries newer than the cutoff are removed, along with their corresponding reference-link definitions.
- Handle Unreleased: The
[unreleased]section heading is preserved (to maintain format consistency), but its contents are emptied. - Rewrite Links:
- The
[unreleased]compare link is rewritten to diff against the cutoff release. - The "based on Keep a Changelog" URL in the preamble is rewritten to point to the specific spec version for that page.
- The
- Update Caption: The caption above the example is updated to state the changelog is shown "as of the last x.y release".
Integrate KAC with Conventional Commits and automation
mainKeep a Changelog is designed to be complementary to automation tools like
semantic-release,release-please,Changesets, orgit-cliff.- Automation/Commits: These tools operate on the input (the commit history).
- KAC: This is the human-facing output.
Treat automated changelogs as a draft. The final step in a professional workflow is human curation to ensure the document is readable and focuses on notable changes rather than a raw git log dump.
Set up the CHANGELOG.md file header
mainName your file
CHANGELOG.md. Start the file with a# Changelogheading and a preamble that explains the file's purpose and the conventions followed (e.g., Keep a Changelog and Semantic Versioning).# 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).Attribute changes to contributors
mainWhile not explicitly mandated by the core Keep a Changelog (KAC) spec, many projects use contributor attribution to credit developers. There are two common styles:
- GitHub-style machine-generated attribution: Using a handle and PR link (e.g.,
by @user in [#123]). Note that@userhandles are host-specific (e.g., GitHub-only). - Manual attribution: Using a real name in parentheses (e.g.,
(Real Name)).
When using handles, ensure you also include a link to the PR or issue to maintain portability.
Fix log accumulation across DynamicData test invocations by @Evangelink in [#7925] Less_Parser: Fix SetImportDirs() type hint... (Timo Tijhof)- GitHub-style machine-generated attribution: Using a handle and PR link (e.g.,
Include CVE IDs in Security entries
mainWhen documenting security fixes in the### Securitycategory, it is a best practice to include the CVE ID and a link to the relevant security advisory if one exists. This provides immediate context for security-conscious users.Set up semantic triage with LaBSE model
mainFor meaning-based errors that linting cannot catch, you can set up a semantic triage pipeline using the LaBSE model. This requires a one-time setup to create a local virtual environment and download the ~1.8 GB model.
Setup Commands:
- Use
bin/rake translations:setuportools/setup.shto install dependencies and download the model to your standard Hugging Face cache (~/.cache/huggingface). - To keep the model project-local, set the
HF_HOMEenvironment variable.
Running Triage:
- Use
bin/rake translations:qato run the entire pipeline (export segments $\rightarrow$ score with LaBSE). - Alternatively, export segments manually using
--segmentsand run the Python scripttools/labse_triage.pydirectly.
- Use