Colophon
How this site is built.
An honest list of the stack. Small enough to explain in one page.
- 01BuildThis site is generated from a single PowerShell script. There is no framework, no bundler, no npm. The script writes HTML, CSS and JavaScript to disk, then deploys them to Cloudflare. Running the script again rebuilds the entire site from scratch in under two seconds.
- 02HostingCloudflare Pages. HTTPS and CDN are automatic. Every deploy is versioned, so rolling back is a single click in the dashboard. The site is served from Cloudflare's edge network, closest to wherever you happen to be reading this.
- 03TypographyCharter — an open-source serif — for prose and headings. The system sans stack for the interface. A monospace stack for numbers, eyebrow labels and metadata. Every font is a system fallback; nothing is downloaded.
- 04MotionView Transitions for page-to-page crossfades. IntersectionObserver for scroll reveals. requestAnimationFrame for the cursor-tracking ambient light. All three are native browser APIs. No animation library, no CSS framework, no dependencies.
- 05ContactForm submissions go through Web3Forms, a small third-party service. That is the only external request this site makes, and only when you submit the contact form. No analytics, no tracking pixels, no cookies, no banner.
- 06AccessibilityFocus rings are visible on keyboard navigation. The skip link jumps to main content. Contrast meets WCAG AA. Reduced-motion preferences are honoured — the ambient light, film grain and reveals all disable automatically.
- 07PrintEvery page has a stylesheet for print. Try printing the About page — you get a clean one-page CV. The Work page prints as a list. The Writing page prints as a small essay collection. No header, no footer, no navigation, just content.
- 08ColoursDark theme is a warm near-black (#0b0b0e). Light theme is a warm cream (#fafaf6). One accent colour, a muted brass (#d4a574 dark, #8a6230 light), used for links, emphasis and the ambient cursor light. No gradients except on a few project icons and the monogram.
- 09WeightUnder 40 KB of HTML, CSS and JavaScript combined, before the base64-encoded portrait. Loads in under a second on any connection. There is nothing to cache-bust, nothing to hydrate, nothing to parse at runtime.
- 10What it is notNot a React app. Not a Next.js site. Not a WordPress theme. Not a template. Not a static site generator. It is one PowerShell file and a folder of assets, and it deploys with one command.