When to use it
One changelog per product (or per clearly versioned surface). Two load-bearing distinctions:
- Record vs. policy: dated entries of what changed live here; how versioning works and how to migrate live on their own pages, linked from every breaking entry.
- Two genres, pick by what the reader keys on:
- Date-headed — for a continuously shipped product surface. Sections per release date; entries titled by the change.
- Version-headed — for a versioned artifact (an SDK, a named API version): sections per version (
## [2.14.0] — 2026-06-18, plus anUnreleasedsection for libraries). The entry rules below apply within each version section. The maintainer’s question “what changed between 2.13 and 2.14?” is unanswerable in a date-headed log — if readers pin versions, head by version.
The changelog is not:
- A commit log. A changelog is written for humans (and now agents) — curated, benefit-first entries, not a dump of merge messages. If a change isn’t worth explaining, it isn’t worth listing.
- Release marketing. A launch post persuades; a changelog entry informs. Link the launch post from the entry if it exists — don’t replace the entry with it.
- A migration guide. An entry says that something breaks and links out; the step-by-step of migrating is a how-to (or a dedicated migration guide for big ones).
Title & description
- Page title: “Changelog” — the fixed, expected string.
- Entry titles: the change itself, specific and self-contained. “Retry backoff is now configurable per endpoint” — not “Improvements to delivery” (says nothing) and not a bare version number (versions head sections, not entries).
- Description formula (page): “Every notable change to product, dated, with breaking changes flagged.”
Scaffold this page
Install the recipe — your coding agent reads the full skeleton and checklist and adapts them to your product:
npx @cloudflare/nimbus-docs add content-changelogyarn dlx @cloudflare/nimbus-docs add content-changelogpnpm dlx @cloudflare/nimbus-docs add content-changelogbunx @cloudflare/nimbus-docs add content-changelogComponent guidance
- Section headings (date or version) + entry sub-headings are the structure. The breaking flag opens the entry body in bold (
**Deprecated · Breaking, effective 2026-09-18**) — first thing scanners and feed readers see, without polluting the heading’s anchor. In rendered pages a Badge component on the heading line can echo it. - Category labels (the six standard categories: Added / Changed / Deprecated / Removed / Fixed / Security) as consistent bold prefixes — they make the page filterable by eye and by machine.
- Doesn’t fit: Steps (migration steps live in the linked guide), Cards, screenshots (link the docs that show the new UI instead — screenshots in a changelog rot in place forever).
Ending
A changelog doesn’t end; it accumulates. The contract is at the top (policy link, subscription channels) and per-entry (links to the pages describing the new state). Published entries are never silently rewritten: if an entry turns out wrong — a breaking change went unflagged — amend the original entry and publish a dated correction entry, so both the version-scanning upgrader and the timeline reader see it.
Thresholds
- Entry body ≤ 3 sentences. Depth beyond that lives on a linked detail page, migration guide, or launch post.
- Entries that change documented behavior link to the updated docs page. Fixed and Security entries link to the relevant reference or troubleshooting page when one exists — a fix for behavior the docs never documented has nowhere to point, and that’s fine.
- Every breaking/deprecation entry carries: who’s affected, what to do, and a date. Missing any of the three, it isn’t ready to publish.
Links & freshness
The changelog is the site’s freshness layer — entries deep-link into stable doc anchors, which is one more reason reference anchors never move (the reference recipe). Publishing an entry and updating the pages it links to is one act, not two: an entry announcing a field the reference doesn’t show yet documents a product that doesn’t exist. Entry headings are themselves permalinks other people cite — treat them with the same stability rule.
Agent notes
- The changelog is the prior-correction surface: deprecated things live on in training data, so Deprecated/Removed entries are what stop an agent from recommending them. Write them as flat declaratives an agent can act on: “
attempt_countis deprecated; useattempt.” - Dates in ISO format (
2026-06-18); “last month” is meaningless in a retrieved chunk. - Each entry self-contained: full field names, full feature names — an entry retrieved alone must make sense alone.
- Personality never replaces the fact. Whimsy without specifics is a non-statement no reader or agent can act on; if you want voice, add it after the fact, not instead of it.
Checklist
Advisory — self-review for author or agent, never a build gate:
- Genre chosen deliberately: date-headed (continuous surface) or version-headed (pinned artifact, with Unreleased for libraries)
- Entries titled by the change, self-contained, reverse-chronological
- Categorized: Added / Changed / Deprecated / Removed / Fixed / Security
- Breaking flag opens the entry body, with who’s-affected + what-to-do + date
- Deprecations announced and removed as two separate entries; never silent
- Behavior-changing entries link to the updated docs page (Fixed/Security link where a target exists)
- Entry bodies ≤ 3 sentences; impact before mechanism; depth on linked pages
- Linked docs pages already updated at publish time
- Corrections amend the original entry and add a dated correction entry
- Subscription channels (RSS at minimum) linked at the top; entry anchors stable