Skip to content

Carry standing text on every release

Goal: put the text that is true of every release — what the artefacts are, which one to pick, how to verify them — on the release page, without writing it into the changelog seventeen times.

A release body generated from commits answers "what changed". For a project that publishes artefacts, a consumer landing on the release page usually needs something else first: which licence variant to download, what the profiles contain, how to check a signature. None of that comes from commits, and none of it changes between releases.

Name the files

# .colophon.yaml
release_notes:
  standing:
    prefix: docs/release-preamble.md
    suffix: docs/release-verification.md

The prefix opens the release body and the suffix closes it. Both are optional, so if all you want is a verification footer, name only the suffix.

There is no placement setting: the key's name is the placement. That is why there are two keys rather than one — a project usually wants a short orientation above the news and the long reference material below it, and one file could only be in one place.

Write the files

They are ordinary Markdown, included exactly as written. No templating, no variables, no substitutions.

<!-- docs/release-preamble.md -->
## Which build do I want?

`*-lgpl-*` for redistribution in a closed-source product; `*-gpl-*` when your
own licence is compatible and you want the extra codecs.

Keep the prefix short. It sits above the changelog on every release, so length there is paid by every reader, every time.

Check it before you release

plan reads the manifest and warns about a file it cannot find:

$ colophon plan

Warning: .colophon.yaml names docs/release-preamble.md as standing release text
and it is not in the repository; a release cut now would not carry it

propose warns about the same thing. This is the check worth relying on, because a missing file does not stop the release — colophon warns and publishes without that block. By the time release says so the release exists, and fixing it means editing a published release.

What a release then carries

docs/release-preamble.md      ← prefix

## What's Changed             ← the generated notes
- feat: the thing

docs/release-verification.md  ← suffix

The files are read at the released commit, like CHANGELOG.md and the manifest itself, so a release carries the text that was true when it was cut. Correcting a figure changes future releases and leaves published ones alone.

CHANGELOG.md does not get this text. It belongs to the release object, which is what a consumer reads; in the changelog it would repeat once per release, and correcting it would mean editing history.

In a monorepo

A component inherits the root's blocks and can replace either one:

release_notes:
  standing:
    prefix: docs/preamble.md
    suffix: docs/verify.md

components:
  cli:
    version: own
    standing:
      prefix: cli/docs/preamble.md   # the root's suffix still applies

What this is not

Standing text is the project's, not a release's. No commit can change it — there is no trailer for it, deliberately. Release-Note: is how a commit says something about the release it is part of; this is what is true of all of them. It lives in a file so that changing it goes through review like any other change.

See also: Write a release note for the per-release prose, and the release manifest reference.