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.