Skip to main content

Content

Changelogs

Publish product updates with date-based entries, tag badges, an auto-generated RSS feed, and a one-click subscribe button. One MDX page + one frontmatter flag, no new infra.

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)path

Entry date. Used for sorting, feed pubDate, and the human-readable date above the entry.

labelstringpath

Short 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.

versionstringpath

Optional version number (e.g. 1.2.0). Rendered next to the label.

descriptionstringpath

One-line summary. Used as the RSS item description when the Update has no rss override.

tagsstring[]path

Array of tag strings, each rendered as a neutral badge.

rssstringpath

Optional 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.xml

Pages 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's label

  • <link> — absolute URL to the entry anchor (<page>#<slug>)

  • <guid> — same as link, isPermaLink="true"

  • <pubDate> — from date prop (RFC 822 / UTC), or a descending synthesised sequence when date is missing

  • <description> — plaintext from rss prop → description prop → 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.xml in any channel

  • Discord — bots like Readybot or RSS.app

  • Email — 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:

  • SurfaceAPI, Dashboard, CLI, Docs

  • AudiencePro, Enterprise, Public beta

  • DomainAuth, Billing, Search, Analytics

Labels we colour

LabelBadge colourWhen to use
Featuresuccess (green)New functionality
Fixinfo (blue)Bug fix
ImprovementprimaryEnhancement to existing behaviour
Breakingdanger (red)API break, forced migration
Securitywarning (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 lists h2 / h3 headings, not Update labels. Write ## Your date headings inside each Update body to get TOC entries.

  • No rssEntries prop. 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

Was this page helpful?

Last updated August 7, 2026