Canonical Release Pages, RSS Canonicalisation & Description Enrichment
Why This Matters
The changelog is one of the most content-rich pages on the marketing site, with 111 releases documented across four major versions. Until now, every release existed as a section inside a single page — invisible to search engines, unshareable as individual documents, and lacking per-release metadata.
This release promotes each changelog entry from a page fragment to a first-class document with its own canonical URL, structured data, and link preview. It also establishes the description field as a forward-looking enrichment for RSS subscribers and search engines.
Canonical Per-Release Pages
Every changelog entry now renders as its own page at /changelog/{releaseSlug}/.
-
111 release pages generated at build time Each entry in the changelog content collection produces a static HTML page with full rendered markdown content, breadcrumb navigation, and consistent typography matching the changelog index.
-
JSON-LD structured data Every release page includes a
SoftwareSourceCodeschema with version, date, author, and publisher metadata. We useSoftwareSourceCodeto model versioned releases as indexable software updates; this is stable and machine-readable across search surfaces. -
OpenGraph and meta tags Each page has distinct
og:title,og:description,og:url, andarticle:published_timetags, enabling rich link previews in Slack, iMessage, Twitter/X, and other sharing surfaces. -
Build-time collision guard
getStaticPaths()detects duplicate slugs and fails the build rather than silently overwriting pages. Invalid data never deploys. -
Trailing slash standardisation Canonical URLs use a trailing slash to match site routing and avoid duplicate indexable variants.
Slug Infrastructure
-
releaseSlugfrontmatter field Each entry has a URL-safe slug derived from version number and title keywords. NamedreleaseSlug(notslug) to avoid collision with Astro’s reservedslugproperty on content collection entries. -
Backfill automation
add-changelog-slugs.mjsgenerated slugs for all 111 existing entries in a single run. The script is idempotent — safe to run multiple times, skips entries that already have areleaseSlug. -
Schema validation The content schema enforces slug format (
^\d+-\d+-\d+(-[a-z0-9]+)*$) and date format (YYYY-MM-DD) at build time. Malformed frontmatter fails the build.
The URL segment is referred to as slug in routing ([slug].astro) and is sourced from the releaseSlug frontmatter field.
RSS Canonical Permalinks
RSS entries now resolve to stable, dereferenceable permalinks instead of fragment-based anchors.
-
Canonical
<link>and<guid>Both now point to/changelog/{releaseSlug}/instead of/changelog/#vX.Y.Z, giving each RSS item a permanent, dereferenceable URL withisPermaLink="true". -
Per-item descriptions Every RSS item now includes a
<description>element. New entries use the enricheddescriptionfrontmatter field; existing entries fall back to a title-based summary.
Description Enrichment
A new optional description frontmatter field provides a 1–2 sentence summary of what changed and why.
-
Three audiences served simultaneously The description appears in RSS feed readers, search engine result pages (as meta description), and link previews when sharing release URLs.
-
Forward-looking adoption The field is optional to avoid breaking the 111 existing entries. All new releases from v5.12.0 onwards include an enriched description that adds signal beyond the title.
-
Preview-safe constraint
descriptionis capped at 200 characters to remain readable in RSS readers and link previews.
Changelog Index Wiring
The changelog index page at /changelog/ now links each release through to its canonical page.
-
Version number links The
v5.11.0version badge now navigates to/changelog/5-11-0-speydocs-production-gold-search-hardening-footer-redesign/instead of self-referencing with a#vanchor. -
Title links Release titles are now clickable, navigating to the same canonical page with a subtle hover transition.
-
Legacy anchors preserved Each
<article>retains itsid="v5.11.0"anchor, so existing external links and in-page scrolling continue to work.
Compatibility
- Legacy fragment URLs (
/changelog/#vX.Y.Z) continue to resolve via preserved<article id="vX.Y.Z">anchors on the index page. - Canonical URLs (
/changelog/{releaseSlug}/) are now the preferred share and RSS targets.
Operational Impact
- 111 individually indexable release pages with distinct OpenGraph previews
- JSON-LD
SoftwareSourceCodestructured data on every release page - RSS items with stable canonical permalinks and meaningful descriptions
- RSS
<description>derived from frontmatter, improving feed readability without requiring click-through - Build-time validation prevents malformed slugs, dates, or duplicate routes from deploying
- Zero breaking changes to existing changelog content or external links
Files Changed
Backend: None
Marketing site (speybooks.com):
-
src/content/config.ts- Added
description(optional string, max 200 chars) - Added
releaseSlug(optional, regex-validated) - Added
dateformat validation (YYYY-MM-DD)
- Added
-
src/pages/changelog/[slug].astro— new file- Per-release page template with JSON-LD, OpenGraph, tag badges
- Build-time slug collision detection
- Light theme typography matching changelog index
-
src/pages/changelog/rss.xml.ts- Canonical slug URLs for
<link>and<guid> <description>from frontmatter with title-based fallback
- Canonical slug URLs for
-
src/pages/changelog/index.astro- Version and title now link to canonical release pages
- Added
getSlughelper forreleaseSlugresolution
-
add-changelog-slugs.mjs— new file- Backfill script: generated
releaseSlugfor 111 existing entries
- Backfill script: generated
-
src/content/changelog/*.md- All 111 entries updated with
releaseSlugfield
- All 111 entries updated with
This release establishes the changelog as a versioned document system — each release independently addressable, machine-readable, and built to scale with the platform.