Colophon
How this site works.
A portfolio should demonstrate the work, not just describe it. This one is hand-built, self-hosted, and instrumented end to end — view source; it's all there.
- Stack
- Hand-written HTML and React 18, with JSX transpiled in the browser by Babel standalone. No build step, no bundler, no framework CSS — design tokens are CSS variables, set in Archivo and JetBrains Mono.
- Hosting
- Cloudflare Pages. A git push to
mainis live in about thirty seconds. Serverless Pages Functions handle the contact form (via Resend) and everything below. - Theme
- Light, dark, or auto — auto follows local daylight, estimating sunrise and sunset from your browser's timezone. No geolocation prompt, no flash of the wrong theme.
- Analytics
- First-party only: no third-party trackers, no cookies. A small beacon posts to a Pages Function; events live in Workers KV for 90 days and nowhere else.
- Notifications
- Town Crier, a self-built notification hub: visit and contact alerts fan out to ntfy phone push and Web Push to an installable PWA — with per-channel delivery status recorded, because silently swallowed failures are the real bug.
- AI workflow
- Designed, built, and shipped in pair with Claude Code — an agentic workflow where the pages, the serverless functions, and the notification hub were written conversationally and verified end to end against the live site. The words are mine.
- Photography
- By Jason — photographer & Getty Images contributor.