How this site is built
I made it myself with Claude Code, and I treat it like a client project: it has written rules, and the build fails when it breaks one.
The rules
Written down, so they are checked and not remembered.
A booking button on every page
The build stops if a page ships without the booking button. A guard runs over every built page.
Proof before the ask
On the home page, a client result has to come before the email sign-up. The same guard checks it.
Six type sizes
Every piece of text uses one of six sizes, from small labels to the page headline. There are no one-off sizes to drift.
Tap targets
A script checks that every button and stand-alone link is at least 44 pixels tall and wide, at phone and desktop width.
No list tags
Lists are plain blocks with list roles, so I control the spacing and screen readers still announce them as lists.
One accent
One orange for the things you can act on. Everything else is ink on paper.
What it loads
Static pages
Astro builds plain HTML. Nothing waits on a server to show you a page, and a case study ships about 2 KB of script.
One 3D scene
The funnel on the home page and the growth page is three.js, about 119 KB, loaded only on those two pages and only after the page is on screen. Without WebGL, or with “Turn off animations”, it falls back to a still or to plain text.
Search
Press Ctrl K (Cmd K on a Mac) or the slash key on any page. The index is built from the finished pages at build time, so it cannot list a page that does not exist.
Page transitions
Pages cross-fade and the header stays still, using the browser’s own view transitions. Browsers without them simply navigate, and nothing fades if you have asked for less motion.
No third-party scripts
No tracking, no ad tags, no chat widget from someone else. The forms post to this site’s own endpoint.
Type
One family, Schibsted Grotesk, served from the site itself, so no text waits on a font from another server.
Measured
Lighthouse, mobile profile, on 14 November 2026. Accessibility scored 100 on all six pages, and layout shift was 0 on all six.
Home
90 performance. The 3D funnel loads after the page has painted.
Hiring page
100 performance.
Growth partner page
97 performance. Carries the same funnel.
A case study
100 performance. Gaba Healthcare.
An article
100 performance. Fix the page before you buy more traffic.
The clinics page
100 performance.
Scores move a little from run to run. The home page is the lowest because of the 3D scene, and I’d rather keep the scene than chase the last nine points.
Why bother
A growth marketer’s site is the first piece of work a client or an employer sees. If the booking button is missing, the page is slow or the text can’t be read, that is the work. So the site is held to the same standard as the pages I fix for clients, and the one that took bookings from 1.8% to 5.0% is the model.