Content

Blog, changelog, docs, and JSON-driven app pages, all versioned with your code.

Three MDX collections

Content lives in the content/ folder and compiles at build time via content-collections, with validated frontmatter:

  • content/posts/: blog posts, rendered at /blog with tag pages at /blog/tag/:tag and an RSS feed at /rss.xml
  • content/changelog/: release entries with version frontmatter, rendered at /changelog
  • content/docs/: these documentation pages, rendered at /docs via the olwibaDOCS pattern

Adding content is adding a file. Invalid frontmatter fails the build instead of rendering a broken page.

Post frontmatter

---
title: "Your post title"
description: "One-line summary used in lists and meta tags."
date: "2026-06-01"
published: true
tags: ["engineering", "product"]
---

Set published: false to keep drafts in the repo without rendering them.

Docs structure

Docs use folder-based navigation with meta.json files controlling sidebar order:

{
  "title": "Guides",
  "pages": ["authentication", "configuration", "theming"]
}

Add an MDX file, list it in the nearest meta.json, and it appears in the sidebar.

JSON-driven app pages

Authenticated app pages (/a/dashboard, /a/billing, /a/settings, /a/notifications) render from JSON specs in src/content/pages/ through GenesisJsonPage, powered by @olwiba/genesis-render.

Routes patch live data into the spec by element ID:

<GenesisJsonPage
  spec={spec}
  data={{
    'stat-usage': { value: todayCount },
  }}
/>

The spec defines structure and defaults; the route supplies live values from tRPC. This keeps app pages declarative and lets layout changes happen in JSON without touching the data wiring. See src/content/pages/README.md for the per-page data key reference.