Skip to content

Content authoring guide

Content lives in apps/web/src/content/ as typed MDX, validated at build by Zod (see apps/web/src/content.config.ts). Malformed content fails the build rather than shipping.

Create apps/web/src/content/cases/<slug>/index.mdx (folder-per-entry so images sit beside the file):

---
title: 'Outcome-led title with the number in it'
client: 'Client name'
summary: 'One or two sentences leading with the outcome.'
disciplines: ['engineering', 'data']
outcome:
kicker: 'Grew.' # optional 1-2 word opener, real punctuation
headline: 'A falsifiable, declarative sentence sourced from the body.'
stat: { value: '10×', label: 'revenue growth' } # genuine numerals ONLY
supporting: # max 2, requires stat, true numbers from the body
- { value: '500k', label: 'avg weekly pageviews' }
role: 'Embedded product & engineering team'
duration: '5 years'
hero: ./hero.png
heroAlt: 'Describe the image'
featured: false
order: 10
legacySlug: 'old-wordpress-slug'
---
## The challenge
...
## What we did
...
## The outcome
...

Create apps/web/src/content/posts/<slug>/index.mdx with the post frontmatter (title, description, publishedDate, author, category, tags, hero).

Reference images relatively (./hero.png); Astro optimizes them to AVIF/WebP with correct dimensions to protect CLS.