Projects are data, not pages
How this site turns a folder of MDX into routes, cards, filters, OG images and search, and fails the build when content is wrong.
The rule
Adding a project means adding one folder. No new components, no routing changes.
Validation
Frontmatter is parsed with Zod. A missing alt text, a low-contrast accent or a broken internal link fails the build, so mistakes never reach production.
const parsed = projectSchema.safeParse(frontmatter);
if (!parsed.success) throw new Error(formatIssues(parsed.error));What gets generated
Each project produces a static route, a card on the work index, an Open Graph image, metadata, JSON-LD, a sitemap entry and a search entry.