diff --git a/.gitignore b/.gitignore
index dbda677..df0be64 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@ public/docs-manifest.json
public/sitemap.xml
public/llms.txt
public/llms-full.txt
+public/feed.xml
public/md/
# Playwright
diff --git a/README.md b/README.md
index cdb5b63..5cb4699 100644
--- a/README.md
+++ b/README.md
@@ -47,6 +47,8 @@ React + Tamagui app you fully own and can edit.
- **AI-native** — generates `llms.txt`, per-page "Copy as Markdown", and "Open in ChatGPT/Claude".
- **Edit this page** — every doc links to its source on GitHub (menu + below
the article), so readers can send fixes.
+- **Changelog** — dated release notes in `content/changelog/` get their own
+ tab, a newest-first listing, and an RSS feed.
- **Authoring components** — callouts, tabbed code samples, API method badges, see-also cards.
- **Multi-deploy** — env-driven, so one codebase powers many branded docs sites.
- **Public by default** — auth is opt-in; a fresh clone runs with zero config.
diff --git a/content/changelog/v0-1-0.mdx b/content/changelog/v0-1-0.mdx
new file mode 100644
index 0000000..676c6e1
--- /dev/null
+++ b/content/changelog/v0-1-0.mdx
@@ -0,0 +1,20 @@
+---
+title: v0.1.0 — Initial release
+date: "2026-06-15"
+description: The first release of Capsa — a self-hosted documentation platform you own end to end.
+---
+
+# v0.1.0 — Initial release
+
+The first public release of Capsa.
+
+## Added
+
+- MDX content pipeline with callouts, tabbed code samples, API method badges,
+ and see-also cards.
+- ⌘K command palette over a build-time search index.
+- Interactive OpenAPI reference powered by Scalar.
+- Four theme styles (steel, aurora, retro, shadcn) × light/dark, token-driven.
+- AI-native exports: `llms.txt`, per-page "Copy as Markdown", open-in-ChatGPT/Claude.
+- Optional WorkOS authentication for private docs.
+- One-command deploy to Cloudflare Pages (or any static host).
diff --git a/content/changelog/v0-2-0.mdx b/content/changelog/v0-2-0.mdx
new file mode 100644
index 0000000..fe8a2f0
--- /dev/null
+++ b/content/changelog/v0-2-0.mdx
@@ -0,0 +1,29 @@
+---
+title: v0.2.0 — Prerendering, search, and a front door
+date: "2026-07-10"
+description: Full static prerendering, Pagefind search, social cards, a landing page, and edit-this-page links.
+---
+
+# v0.2.0 — Prerendering, search, and a front door
+
+The release that makes Capsa sites fully static-first.
+
+## Added
+
+- **Full prerendering (SSG)** — every doc ships as real HTML with the complete
+ article and crawlable nav links, then hydrates into the SPA. `PRERENDER=0`
+ opts out.
+- **Pagefind search** — the ⌘K palette now runs on a typo-tolerant static
+ index built from the prerendered pages; no search service required.
+- **Social cards** — a branded `og:image` PNG is generated per page at build
+ time.
+- **Landing page** — drop in `content/home.mdx` and `/` becomes a real home
+ page with hero, feature-grid, and CTA components.
+- **Edit this page** — every doc links to its source on GitHub.
+
+## Fixed
+
+- Body text rendered semi-bold site-wide due to size-linked font weights; all
+ body sizes now default to weight 400.
+- Theme styles now apply their full semantic token sets (accents, sidebar
+ colors, radii) in both JS and CSS.
diff --git a/content/configuration/configuration.mdx b/content/configuration/configuration.mdx
index 17a297c..3ab9460 100644
--- a/content/configuration/configuration.mdx
+++ b/content/configuration/configuration.mdx
@@ -18,7 +18,7 @@ All are optional. A bare deploy needs none of them.
| `VITE_SITE_NAME` | Brand shown in the top bar, titles, footer. Defaults to `Capsa`. |
| `VITE_SITE_ORG` | Footer copyright name. Defaults to `VITE_SITE_NAME`. |
| `VITE_DEFAULT_THEME_STYLE` | Pin a theme (`steel`, `aurora`, `retro`, `shadcn`) and hide the switcher. |
-| `VITE_SITE_URL` | Base URL — enables `sitemap.xml`, canonical + `og:image` tags, absolute links in `llms.txt`. |
+| `VITE_SITE_URL` | Base URL — enables `sitemap.xml`, canonical + `og:image` tags, the changelog `feed.xml`, absolute links in `llms.txt`. |
| `VITE_PRODUCT` | Scope nav + search to one product folder (multi-product setups). |
| `VITE_GITHUB_URL` / `VITE_STATUS_URL` / `VITE_SUPPORT_URL` | Footer links — each renders only if set. `VITE_GITHUB_URL` also powers the "Edit this page" links. |
| `VITE_GITHUB_BRANCH` | Branch the "Edit this page" links target. Defaults to `main`. |
diff --git a/content/getting-started/introduction.mdx b/content/getting-started/introduction.mdx
index a645abc..d7779c8 100644
--- a/content/getting-started/introduction.mdx
+++ b/content/getting-started/introduction.mdx
@@ -24,7 +24,7 @@ edit.
- **MDX content** — write Markdown, drop in React components when you need them.
- **⌘K command palette** — instant, keyboard-first search over a build-time index.
- **OpenAPI reference** — a full interactive API explorer (Scalar) from your spec.
-- **Theming** — five built-in styles × light/dark, all token-driven and brandable.
+- **Theming** — four built-in styles × light/dark, all token-driven and brandable.
- **AI-native** — generates `llms.txt`, a per-page "Copy as Markdown", and "Open in ChatGPT/Claude".
- **Authoring components** — callouts, tabbed code samples, API method badges, "see also" cards.
- **Public by default** — auth is opt-in; a fresh clone runs with no configuration.
diff --git a/content/guides/changelog.mdx b/content/guides/changelog.mdx
new file mode 100644
index 0000000..44f5c86
--- /dev/null
+++ b/content/guides/changelog.mdx
@@ -0,0 +1,49 @@
+---
+title: Changelog
+description: Publish dated release notes with a listing page and an RSS feed.
+order: 6
+---
+
+# Changelog
+
+Add dated MDX files under `content/changelog/` and Capsa gives you a
+**Changelog tab**, a newest-first listing at `/docs/changelog`, per-entry pages,
+and an RSS feed — no configuration.
+
+## Writing an entry
+
+```mdx title="content/changelog/v1-2-0.mdx"
+---
+title: v1.2.0 — Webhooks
+date: "2026-08-01"
+description: Outbound webhooks, retries, and a new signing scheme.
+---
+
+# v1.2.0 — Webhooks
+
+## Added
+
+- Outbound webhooks with automatic retries.
+```
+
+- `date` (ISO `YYYY-MM-DD`, quoted) drives the listing order and shows next to
+ the breadcrumb on the entry page.
+- `title` and `description` appear on the listing card, in search, and in the
+ RSS feed.
+- Entries are otherwise **normal docs**: searchable, prerendered, social-carded,
+ with edit-on-GitHub links — everything a page under `content/` gets.
+
+## How it behaves
+
+- Entries never appear in the Documentation sidebar — the changelog is its own
+ tab (an `href` tab in `src/navigation.ts`, like the API Reference).
+- The listing page at `/docs/changelog` sorts entries newest-first by `date`.
+- Remove the `content/changelog/` folder and the tab simply 404s — delete the
+ tab entry in `src/navigation.ts` to hide it entirely.
+
+## RSS
+
+On deploys with `VITE_SITE_URL` set, the build emits `feed.xml` (RSS 2.0) with
+every dated entry, and the site `
` advertises it via
+``. Readers and release-watchers can subscribe to
+`https://your-site/feed.xml`.
diff --git a/e2e/prerender.spec.ts b/e2e/prerender.spec.ts
index 232b60c..6061bce 100644
--- a/e2e/prerender.spec.ts
+++ b/e2e/prerender.spec.ts
@@ -208,6 +208,50 @@ test('docs pages link to GitHub editing and back home', async ({ page, request }
await expect(page.locator('#root h1')).toContainText('Documentation that ships itself');
});
+test('changelog listing is prerendered newest-first', async ({ request }) => {
+ const html = await (await request.get('/docs/changelog')).text();
+ expect(html).toContain('Changelog — Capsa');
+ const root = html.split('
')[1] ?? '';
+ const v2 = root.indexOf('v0.2.0');
+ const v1 = root.indexOf('v0.1.0');
+ expect(v2).toBeGreaterThan(-1);
+ expect(v1).toBeGreaterThan(-1);
+ expect(v2, 'newest entry listed first').toBeLessThan(v1);
+ expect(root).toContain('Jul 10, 2026'); // TZ-free formatted date
+});
+
+test('changelog entry renders as a doc with its date and hydrates', async ({ page, request }) => {
+ const html = await (await request.get('/docs/changelog/v0-2-0')).text();
+ const root = html.split('
')[1] ?? '';
+ expect(root).toContain('Jul 10, 2026'); // breadcrumb date
+ expect(root).toContain('Pagefind search'); // article body prerendered
+ await expectHydrated(page, '/docs/changelog/v0-2-0/');
+});
+
+test('changelog stays out of the Documentation sidebar and docs index', async ({ request }) => {
+ const doc = await (await request.get('/docs/guides/theming')).text();
+ const sidebar = doc.split('