A changelog page is a regular docs page with a series of <Update> components, one per release. NookDocs renders each as a timelined entry (date + coloured label + version + tags + content), exposes the whole page as an RSS 2.0 feed at <page-url>/rss.xml, and — when rss: true is set in frontmatter — shows a RSS button in the page header so readers can subscribe with one click.
Quick start
Create docs/changelog.mdx:
---
title: Changelog
description: Product updates and release notes.
rss: true
---
<Update date="2026-04-19" label="Feature" version="1.2.0" tags={["API","AI"]}>
## New
- Schema-reference page auto-generated from `public/schema.json`
- RSS feeds for any page containing `<Update>` components
## Fixes
- Navigation crash when nested groups were placed inside `pages` array
</Update>
<Update date="2026-04-15" label="Fix" version="1.1.3" tags={["API"]}>
Fixed rate-limit header parsing on custom-domain tenants.
</Update>Add to your nav in nookdocs.config.json:
{
"navigation": [
{
"tab": "Changelog",
"groups": [
{ "group": "Releases", "pages": ["docs/changelog"] }
]
}
]
}Deploy. The page renders as a timeline. The RSS button appears in the header. https://docs.yoursite.com/changelog/rss.xml serves a valid RSS 2.0 feed.
The <Update> component
Each entry is one <Update> block. Props:
datestring (ISO 8601)pathEntry date. Used for sorting, feed pubDate, and the human-readable date above the entry.
labelstringpathShort category label rendered as a coloured badge. Known values get smart colours: Feature → green, Fix → blue, Breaking → red, Improvement → primary, Security → amber. Any other value falls through to a neutral badge.
versionstringpathOptional version number (e.g. 1.2.0). Rendered next to the label.
descriptionstringpathOne-line summary. Used as the RSS item description when the Update has no rss override.
tagsstring[]pathArray of tag strings, each rendered as a neutral badge.
rssstringpathOptional plain-text override for the RSS feed description. Use when the Update body contains components / code / HTML that don't serialise cleanly to RSS. When omitted the feed strips fenced code + JSX and truncates the body to 600 chars.
Example with every prop
<Update
date="2026-04-19"
label="Feature"
version="1.2.0"
description="RSS feeds + tag filter UI + rss frontmatter button"
tags={["API","AI","DX"]}
rss="Shipped RSS feed generation for every page with Update components."
>
### What's new
- `/<any-page>/rss.xml` returns a valid RSS 2.0 feed
- `rss: true` in frontmatter shows a subscribe button in the page header
- Optional `rss="..."` prop on each Update overrides the feed description
### Gotcha
Tag filter UI is cosmetic only today — tags render as badges but don't gate display. Filtering lands in a follow-up.
</Update>RSS feed
Endpoint
Every docs page has an RSS variant at <page-url>/rss.xml:
https://docs.acme.com/changelog/rss.xml
https://docs.acme.com/api-updates/rss.xml
https://docs.acme.com/whatever/rss.xmlPages without <Update> components produce an empty-channel feed — not a 404 — so subscribers don't panic when a page gets cleared temporarily.
Format
Standards-compliant RSS 2.0. Each <item> has:
<title>— the Update'slabel<link>— absolute URL to the entry anchor (<page>#<slug>)<guid>— same aslink,isPermaLink="true"<pubDate>— fromdateprop (RFC 822 / UTC), or a descending synthesised sequence whendateis missing<description>— plaintext fromrssprop →descriptionprop → body (stripped of JSX + code fences, 600-char cap)
Subscribing
Any RSS reader works: Feedly, NetNewsWire, Inoreader. For team-level notifications:
Slack —
/feed subscribe https://docs.acme.com/changelog/rss.xmlin any channelEmail — Zapier's RSS-to-Email integration
The rss: true button
Adding rss: true to page frontmatter renders an RSS button in the page header next to Copy page:
---
title: Changelog
rss: true
---Click subscribes the reader's default RSS handler to the feed. Without rss: true, the feed still exists — readers just have to know the URL.
When to use tags
Tags render as neutral badges alongside the coloured label. They're searchable by readers (Cmd+F) but don't drive any filtering UI today — that's a cosmetic-only ship.
Useful tag categories:
Surface —
API,Dashboard,CLI,DocsAudience —
Pro,Enterprise,Public betaDomain —
Auth,Billing,Search,Analytics
Labels we colour
| Label | Badge colour | When to use |
Feature | success (green) | New functionality |
Fix | info (blue) | Bug fix |
Improvement | primary | Enhancement to existing behaviour |
Breaking | danger (red) | API break, forced migration |
Security | warning (amber) | Security patch, CVE |
Any other label string renders as a neutral badge — use custom labels when the standard five don't fit.
Nav placement
Changelogs sit best as their own top-level tab in the docs.json nav — readers click "Changelog" at the top of the docs and land on a single chronological page. Example:
{
"navigation": [
{
"tab": "Documentation",
"groups": [ ... your main docs ... ]
},
{
"tab": "Changelog",
"groups": [
{ "group": "Releases", "pages": ["docs/changelog"] }
]
}
]
}Alternatively fold it into an existing group (e.g. "Resources" or "About") — the feature doesn't require tab placement.
Limitations
No tag filter UI. Tags render as badges today; a filter component that toggles entries by tag lands in a follow-up. Cosmetic pages look fine without it.
No auto-TOC from
<Update label>. The right-column TOC listsh2/h3headings, not Update labels. Write## Your dateheadings inside each Update body to get TOC entries.No
rssEntriesprop. The feed includes every<Update>on the page — no way to exclude one. Delete unwanted entries from the page.No per-entry
authorName/authorEmail. Feed items use the channel-level metadata only.
Related
<Update>component — rendering reference + examplesSchema reference —
nookdocs.config.jsonfull field listingMarkdown export —
/page.mdcompanion for LLM crawlersSEO — sitemap / robots / canonical URLs