How this site is built.
Our own site is held to the standard we hold client work to. Here's what's underneath it, and how it performed on your device just now.
Your visit, measured live
Read from your own browser's timing data. These numbers aren't sent anywhere.
- First paint
- –
- Your browser doesn't report largest paint, so this is first paint
- Server response
- –
- Time until the first byte arrived
- Transferred
- –
- Everything downloaded so far, compressed
- Requests
- –
- Files fetched so far, cached ones included
The same system we build for clients.
- 01 · Data
Postgres on Supabase
Row-level security means only the studio's own account can read enquiries or analytics. Visitors write through two validated, rate-limited database functions, never the tables themselves.
- 02 · Integrations
Email and database, in parallel
Every enquiry goes two ways at once: emailed through Web3Forms and saved to the database. It counts as sent if either lands, so a lead is never lost to one service being down.
- 03 · Back office
A private command center
Traffic, the enquiry funnel, sources and campaigns, plus an inbox with a status pipeline and notes, behind a magic-link sign-in. The same kind of tool we build for clients.
- 04 · Content
Typed content, generated metadata
Pages, case studies and services live in typed content files, so a broken change fails the build instead of the page. Titles, share cards and structured data are generated from the same source.
- 05 · Website
React 19, pre-rendered
React and TypeScript, built with Vite and styled with Tailwind CSS 4. Every page is rendered to finished HTML at build time, then React takes over in place.
Fast by design, not by luck.
Finished HTML on arrival
Every page is pre-rendered, so content shows without waiting for JavaScript. The app script loads after the first paint.
Styles inline, fonts first
Critical CSS ships inside the page. The two headline fonts are preloaded, with metric-matched fallbacks so text never jumps.
Code only where it's used
The 3D scene, the live demo and the command center are split out and load only on the pages that need them.
Images that wait their turn
WebP at the right size for each screen. The full-page site captures load after your first scroll or tap, never during page load.
A hero that knows its limits
The 3D stack is a hand-written WebGL2 shader, no 3D library. It watches its own frame times and steps quality down on slower devices, all the way to a still image.
Zero layout shift
Every image and late element reserves its space up front, so nothing moves under your finger as the page loads.
Analytics without the tracking.
Visits are counted by our own analytics: no cookies, no advertising trackers and no consent banner to click away. Your IP address becomes an anonymous code that changes every day and is never stored. Read the privacy notice.
Built for everyone who visits.
Every page passes automated WCAG 2.1 AA checks in light and dark mode. It works with a keyboard, honours reduced-motion settings (the 3D scene becomes a still image), and keeps tap targets large enough for a thumb.
- React 19
- TypeScript
- Vite
- Tailwind CSS 4
- WebGL2
- Supabase
- Postgres
- Lenis
- Zustand
- Vercel