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.