Writing releases
A changelog collection is a folder of release files. Each file is one release; the page at the base path renders them all as a single timeline, newest first.
content/changelog/
1.4.0.md → /changelog#1-4-0
1.3.0.md → /changelog#1-3-0
v1.3.0-beta.1.md → /changelog#v1-3-0-beta-1
Naming releases
The version comes from the filename when it looks like one — 1.4.0.md,
v2.0.md, 2.0.0-rc.1.md all parse — or from frontmatter, which always
wins:
---
title: The collections release
version: "1.4.0"
date: 2026-06-11
---
### Added
- Collections: mount a blog, docs, and changelog on one site.
### Fixed
- Order prefixes no longer leak into URLs.
Quote the version ("1.4.0") so YAML doesn't read it as a number. title
is still required; if you have nothing better, voxx new "1.4.0" defaults
it to v1.4.0.
Dates drive the timeline
Releases sort by date, newest first — version numbers name releases but
don't order them. Give every release an explicit date; "what shipped when"
is the whole point of a changelog.
Anchors
Every release gets a stable anchor derived from its slug, so you can link
to /changelog#1-4-0 from release tweets, commit messages, or upgrade
guides and the link keeps working as new releases land above it.
Body conventions
The body is ordinary markdown. Grouping changes under ### Added,
### Changed, ### Fixed, and ### Removed (à la
Keep a Changelog) reads well in the timeline,
but Voxx doesn't enforce it — paragraphs, bullets, even images all render
fine.
If the changelog shares a site with other surfaces, see Collections.