Colophon
How this site is built. Every check runs on every push.
Stack
Astro with static output — zero JavaScript by default. The interactive pieces (the Council hero, ⌘K, the theme toggle, the mobile menu) are Preact islands, hydrated only where they're used. TypeScript in strict mode throughout, with Zod schemas on every content collection.
Content integrity, enforced by the build
Every project's status badge, every metric and every key finding needs a source in its frontmatter — a repo path, a FINDINGS.md line, or a dated confirmation. The Zod schema rejects an entry that skips one; the build fails, not just a lint warning. A separate script scans the built site for a short list of banned terms (never committed to the repo) so nothing private ends up published by accident, and a second script fails the build on any leftover draft-only placeholder note. Both run again in CI on every push.
Type & fonts
Inter Variable for UI text, Geist Mono Variable for data and labels — both self-hosted as WOFF2 subsets, with metric-matched fallback fonts so the swap doesn't shift layout (CLS stays at 0). No Google Fonts CDN, no third-party font requests.
Targets
- Lighthouse mobile 100 across performance, accessibility, best practices and SEO on the homepage, /work, one case study and one paper.
- LCP under 1.2 s on throttled 4G, CLS 0, INP under 100 ms.
- Homepage JavaScript under 90 KB gzipped.
- WCAG 2.2 AA: full keyboard access, visible focus rings, a genuinely static experience under
prefers-reduced-motion.
Testing
Vitest covers the schemas, the lints and the pure logic behind the live demos (the tie-out engine's integer-cents math, the order-book model). On every push, CI also runs Playwright smoke tests on every page, an axe accessibility pass on every page in both themes, the four live demos end to end, Lighthouse, a JavaScript size budget and a link checker.
Hosting & decisions
Netlify, chosen over Cloudflare Pages mainly for repo-versioned cross-domain redirects and a zero-backend contact form. Every non-obvious choice — including that one — is logged as it's made in DECISIONS.md, an ADR-lite log in the repo.
Source
The whole site goes public at launch, at github.com/mit37/mitanshm.com: the same repo this page is served from.