How I built this

No template, no page-builder, every page here is hand-written, one file at a time. Here's the system underneath it, and how the parts that move were made.

hover to reveal the decisions underneath
01, the stack

Plain files, on purpose.

built with
Hand-written HTML & CSS. No framework, no build step, no bundler. A little vanilla JavaScript where something needed to move, and GSAP for the scroll-tied motion.
hosting
Deployed on Vercel. A few small serverless functions power the “ask me anything” assistant, which runs on Claude.
type
PP Neue Montreal for everything you read, PP Neue Montreal for the little labels.
analytics
Microsoft Clarity, anonymized, aggregate, never sold. No ad trackers.
02, the design system

One file is the source of truth.

Every colour, size, space, radius and easing comes from a single tokens.css. It's deliberately small: one cool neutral ramp, one accent, and tints derived from it, never a pile of one-off colours. Change it there, it changes everywhere.

tap a color to copy it
Aa
PP Neue Montreal, the whole site reads in one geometric sans, 400 → 600.
PP Neue Montreal
display + body
Aa
PP Neue Montreal, the small print, kicks & labels.
PP Neue Montreal
labels
--fs-giant the loud one
--fs-h1 section titles
--fs-h2 sub-heads
--fs-h4 lead paragraphs

spacing · 8-pt scale

481624324864…

radius · one ladder

10162028

shadow · exactly two

--shadow-1 · raised--shadow-2 · floating

motion · one ease

cubic-bezier(.22, 1, .36, 1)
03, the homepage sky

A sky that knows what time it is.

The landing page isn't a photo or a video, it's divs and gradients. The whole sky is drawn in CSS and quietly retinted to match the actual hour where you're standing. Here it is in miniature, drag through it:

drag through the day12:00 ·
a working miniature of the real hero, same gradient stops, same drift.
1

The gradient. Four CSS colour-stops (--sky1…4) from deep blue up to pale horizon. That's the entire sky, one linear-gradient.

2

Time of day. A small script reads your clock and blends the four stops through morning, noon, golden hour and night. Drag the timeline to see the entire day, or return it to your local time.

3

The clouds. Blurred white circles (a div with two pseudo-elements) drifting on a @keyframes loop. At night they turn slate-grey so the hero text stays legible.

4

The life. The sun becomes a moon and the stars quietly fade in. No canvas, no WebGL, no library, just the browser.

04, from the ground up

How it came together.

Start with the words, not the layout.

Every page began as a sentence I was trying to say. The design came after, in service of it.

One tokens file, before anything else.

Colours, type, spacing, motion, decided once, in tokens.css, so nothing drifts. Consistency is a system, not willpower.

Hand-write it, keep it flat.

Plain HTML & CSS a browser reads directly. No framework to outgrow, no build to break. Motion is CSS first, GSAP only where scroll needs choreography.

Make one thing sing per page.

The sky here, a drag-to-reveal painting there. One idea, obsessed over, beats ten that are fine.

made with AI, directed by me

I design for AI. It felt right to build with it.

Claude helped me code and iterate. The concept, structure, writing, taste, and final call on every pixel are mine.

inspect the system
the door's open

Say hi.

Tell me what you'd build differently.