Skip to content

feat: add changelog support to the template #2

Description

@martyy-code

Problem statement

The template currently has no dedicated place for release notes. Adopters who want a public changelog either:

  • inline it in the docs (pollutes the documentation tree),
  • point users at GitHub Releases (loses branding and styling),
  • or build a separate page from scratch (duplicates work the template should ship).

A common need for a docs site is a versioned changelog that follows the Keep a Changelog convention.

Proposed solution

Add a /changelog route group that:

  • Lives at /changelog (sibling of /docs and /blog)
  • Reads content from content/changelog/ (parallel to content/docs/)
  • Uses a second Fumadocs loader() source collection for releases
  • Frontmatter: version (semver), date (ISO), optional title
  • Body follows Keep a Changelog categories: Added, Changed, Fixed, Deprecated, Removed, Security — rendered as styled sections
  • Index page lists releases, newest first, with version + date + a one-line summary
  • Individual pages at /changelog/<version> (e.g. /changelog/v1-2-0)
  • Latest release prominently surfaced on the home page or in the docs sidebar
  • Generates an Atom/RSS feed at /changelog/feed.xml via a dynamic route handler so users can subscribe to release notifications (see docs/internal/learnings/fumadocs/rss.md)
  • Optional: /llms-full.txt extended to include the changelog

Keep a Changelog rendering

The Added/Changed/Fixed/etc. sections are rendered via a custom MDX component (e.g. src/components/change-section.tsx) that maps each ## Added heading to a styled block (similar in spirit to Fumadocs' <Callout>). The component receives the section type as a prop and renders with the appropriate color/icon.

Two example releases should ship in the template (content/changelog/v1.0.0.mdx, v0.9.0.mdx) to demonstrate the schema and Keep a Changelog rendering.

Acceptance criteria

  • /changelog route renders a reverse-chronological list of releases
  • /changelog/<version> renders a single release with Keep a Changelog sections
  • Frontmatter schema (version, date, optional title) is validated by source.config.ts
  • Latest release is surfaced somewhere visible (home or sidebar)
  • Two example releases ship in the template with realistic entries
  • README.md documents the changelog conventions and how to add a new release
  • All existing CI checks (Lint, Type Check, Build) still pass
  • No regressions on the docs section
  • (Recommended) Atom/RSS feed at /changelog/feed.xml — same feed-based pattern as /blog/feed.xml (see RSS learning doc). Register in metadata.alternates.types.

Alternatives considered

  • Auto-generate from git log in CI. Rejected — produces noisy, inconsistent output, and conflates commit history with user-facing release notes.
  • Pull from the GitHub Releases API only. Rejected — couples the template to GitHub and loses theming, layout control, and offline builds.
  • Single-page flat changelog (one long page, no per-release routing). Rejected — does not scale past a handful of releases and provides no per-version URL for linking.
  • Fold changelog entries into the blog (post type = "release"). Rejected — conflates concerns (release notes have a strict format and versioning; blog posts are free-form).

Risks

  • Another content collection means a third loader() call and a third source tree in the navigation. Layout decisions (where to surface the latest release) need a UX pass.
  • If the blog and changelog land together, the home/sidebar layout has to accommodate three entry points (docs, blog, changelog) without becoming cluttered.
  • If i18n is also adopted (see feat(docs): add internationalization (i18n) support #10), the changelog content tree must follow the same parser choice as docs and blog. Document this in the migration guide.
  • RSS feed sort order — releases must sort by version descending (semver), not by date. Custom comparator required.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Fields

    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions