Tech stack
Astro builds the pages, TinaCMS manages the content, React runs only in the admin. No database and no server of its own for public pages.
At a glance
| Part | Uses | Notes |
|---|---|---|
| Page generation | Astro 7 | Every page is built to HTML ahead of time |
| Content management | TinaCMS | A modified build, kept in vendor/ |
| Admin and preview | React 18 | Runs only in the admin; public pages load no React |
| Language | TypeScript | |
| Environment | Node.js 22 or 24, pnpm | Not npm or yarn |
| Code checks | Biome | pnpm lint, pnpm format |
Static pages, a React admin
At build time every page becomes an HTML file. Public pages load only a few small scripts for the parts that need interaction (menu, FAQ, forms), and no React.
Each page also has a /preview/… copy for the admin: that copy runs React in the browser, so as you type in the form the preview redraws without calling a server. /preview/… pages carry noindex, so search engines leave them out.
Content is JSON files
Every page, menu, colour and setting is a JSON file in content/. The admin reads and writes those files. Because content lives in Git, every edit is a commit: you can read the history and go back.
Code checks
pnpm test # tests of the shared logic
pnpm check # TypeScript type check
pnpm contrast # contrast of every colour scheme
pnpm lint # BiomeAfter each build, four more commands check the output: pnpm zero-js (no public page loads React), pnpm nul-bytes, pnpm preview-parity (each /preview/… copy draws its public page’s HTML) and pnpm seo-check.