← all posts

Building This Site

1 min read#nextjs#meta

This site is driven by a single typed JSON file and renders statically. Here's a taste of the loader that validates it at build time:

import { z } from "zod";
 
const schema = z.object({ name: z.string().min(1) });
export const parse = (data: unknown) => schema.parse(data);

If the data is malformed, the build fails loudly — which is exactly what I want.

Why static

Static pages are fast, cheap, and predictable. The only dynamic surface is the chatbot's serverless route, which keeps the API key server-side.