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.xmlcontent/changelog/: release entries with version frontmatter, rendered at /changelogcontent/docs/: these documentation pages, rendered at /docs via the olwibaDOCS patternAdding content is adding a file. Invalid frontmatter fails the build instead of rendering a broken page.
---
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 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.
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.