How this site is built
Personal project · Design and engineering · 2025 – 2026
A small Next.js 16 site that doubles as a working sample: prerendered pages from typed content, tests that keep the site consistent with my CV, and privacy-first analytics without cookies or stored IP addresses.
- Staticpages, prerendered at build time
- No cookiesand no stored IP addresses for visitors
- Testedcontent claims checked against the evidence behind my CV
Context
This site is the long version of my CV. I wanted it fast, accurate and private, and I wanted to know when someone I sent an application to actually read it.
Content as code
All text lives in typed TypeScript modules, versioned with the code. Every number comes from one metrics module that mirrors the evidence behind my CV, and tests fail when a page states a title, date or figure that the evidence cannot back.
Rendering
Pages are prerendered with Next.js 16 and React Server Components; the interactive parts (navigation, theme toggle, contact form, analytics) are small client components. A CI check fails if a public page stops being static.
Privacy-first analytics
- No cookies and nothing stored on your device. The server derives a visitor id from a random salt that changes every day and is then deleted; IP addresses are never stored.
- Links I share in applications can carry a short code. A tiny script removes it from the address bar before the page starts, and the first real, engaged visit sends me an email. Link scanners and headless browsers are filtered out.
- Visitors whose browser sends Do-Not-Track or Global Privacy Control are not tracked; only the opening of a coded link is noted.
Engineering
TypeScript in strict mode, ESLint, Vitest with Testing Library and an in-memory database for the analytics store, and a GitHub Actions pipeline that lints, type-checks, tests and builds every change.
Stack
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS v4
- TanStack Query
- libSQL
- Zod
- Vitest
- Testing Library
- GitHub Actions
- Vercel