01/04Halcyon Optics
A frame configurator that holds 60fps on a phone, and a quality ladder that steps down before the frame rate does.
Motion-led launch sites and production web applications, from one pair of hands. Shaders, interface engineering and the state machines underneath — designed, built and shipped as code your team owns.
React, WebGL and GLSL. Interfaces that hold frame rate on hardware people actually own, not on the machine they were built on.
The unglamorous half: state machines, data tables, empty states, keyboard paths, and the error case nobody designed.
Tokens, components and the documentation that keeps a team consistent long after the engagement ends.
These are self-initiated builds, not client engagements — each card says which. The interfaces you can operate are one section further down, in the product lab.
01/04A frame configurator that holds 60fps on a phone, and a quality ladder that steps down before the frame rate does.
02/04A market narrative drawn entirely in SVG, so every chart on the page lifts straight into a deck.
03/04A scroll-scrubbed launch film that streams its frames instead of downloading them.
04/04One token vocabulary, two themes, and not a single `dark:` variant in the component layer.
Case notes
A frame configurator built to find the real cost of real-time lighting on a phone: streamed geometry, one draw call per frame, and a quality ladder that steps down before the frame rate does.
Not screenshots, not a video. Each of these is the interface itself at a smaller scale — click through it here, then open the whole thing on its own route.
AI operations interface
A run you can hold: plan, tool calls, an approval gate a human has to pass, then a streamed answer and the artifact it produced.
A run you can hold: plan, tool calls, an approval gate a human has to pass, then a streamed answer and the artifact it produced.
Pick one and the whole section reconfigures — the object, the readouts around it and the next step. It is the same argument the rest of the page makes, in a form you can hold.
Marketing surface
Editorial typography, one scroll timeline and a motion budget written down before the first commit. Built to convert, measured on the deployed build rather than on a laptop.
See the standardsOne person, so one project at a time. Pick the one that sounds like yours and the brief form opens with it already selected.
The site a product launch deserves, built to convert rather than to win an award on its own.
You are left withA repo, a motion spec and a performance budget your team can hold.
Brief me on thisThe signed-in half: dashboards, AI surfaces, internal tools and the long tail of states that decide whether people keep using it.
You are left withTyped components, documented tokens and a recorded walkthrough.
Brief me on thisWhen the thing being sold has to be turned over, configured or felt before anyone will believe it.
You are left withA GPU budget, a graceful fallback and source you can read.
Brief me on thisFive stages, one pair of hands. Scroll and the frame gets rebuilt at each one — from the sentences a client sends to the numbers the work is handed over with.
01
Three paragraphs and a deadline. The first job is to find the one sentence in it that the whole build has to serve, and to write down what will not be built.
inbound · re: new site
“We’re launching in eleven weeks and the current site doesn’t explain what we do. It needs to feel like the product feels.”
“There’s a dashboard behind the login too. Same look, ideally.”
“And it has to be fast on a phone.”
The sentence it serves · it needs to feel like the product feels
02
Routes, states and the shape of the data before a single pixel. Wireframes exist to argue about hierarchy while it is still cheap to lose that argument.
03
One type scale, one spacing rhythm, two radius families and a token vocabulary with no theme variants in the components. The system is what makes screen forty as fast to build as screen four.
--space: 4 8 12 16 24 32 48 64 --radius: 12px 24px --ease: cubic-bezier(.22,1,.36,1) --motion: 180ms 320ms 560ms
04
Real components against real state — including the loading, empty, error and cancelled cases. This is where most of the time goes, and where most of the quality is decided.
MRR
€184.2k
+6.4%
Active
1,284
+2.1%
Churn
1.7%
-0.4%
05
Measured on the deployed build, on a throttled profile, on hardware people own. Then a handover: readable commits, documented tokens and a recorded walkthrough for whoever inherits it.
That is the whole path, and it is the same path whether the thing at the end is a launch page or a product with a login.
Start at stage oneHover, focus or tap a card for the evidence behind the claim
Every number on this page comes from a Lighthouse run against the production build, on a throttled mobile profile. The three demo applications are separate chunks that a visitor who never scrolls to them never downloads.
Next.js · RSC · LighthousePosition and velocity live in floating-point textures and never leave the GPU. Every canvas on this page mounts on approach, stops drawing the moment it leaves the viewport, and has a still fallback if WebGL fails.
GLSL · three.js · R3FLenis is driven from GSAP's ticker and ScrollTrigger reads its smoothed position, so the page has a single scroll owner. Every animation rides transform and opacity, and every one of them has a reduced-motion path.
GSAP · Motion · LenisOpen any demo and look for the loading, empty, error and cancelled states — they are all there, along with keyboard paths through the board, the chart and the agent run. That is the half of product work that decides whether people stay.
State machines · a11y · TypeScriptTwo to eight weeks, one project at a time. It opens with art direction and a working prototype of the hardest screen, so the risk is spent before the budget is.
Fixed price per milestone, quoted from the brief. If scope moves we re-quote the next one and you decide.
Six commitments that go in the contract rather than the pitch deck. Each one is checkable — which is the only reason to write it down.
LCP, INP and bundle ceilings agreed before the first commit and measured on the deployed build, on a throttled connection — not on localhost with a warm cache.
Keyboard paths through every flow, visible focus, contrast that holds in both themes, and a reduced-motion fallback for every animation on the page — including the ones you are looking at.
Strict TypeScript, schemas validated at the boundary and generated types across the seam. If a field changes shape, the build tells you before a user does.
Web Vitals and error reporting wired up in the first week, so performance is a number the team watches rather than an opinion someone defends in a review.
Readable commits, documented tokens, decision records for anything non-obvious, and a walkthrough recorded for whoever inherits it. The engagement ends; the knowledge does not leave.
A four-year-old mid-range Android and a throttled network are the target, not a flagship on office wifi. If it holds there, it holds everywhere else.
Based in Remote · Europe, working across CET / UTC+1 and overlapping with most of Europe and the US east coast. I travel for kickoffs and handovers.
The things people ask before the first call. Still curious? The inbox is one section down.
Two to twelve weeks, one project at a time. It starts with a week of art direction and a working prototype of the hardest screen, so the risk is spent before the budget is.
Every brief is read by the person who would build it. Usually within a day.
You get the shape of the work written down first, then a fixed number against it.
The hardest screen gets built first, so the risk is spent while the budget is still intact.
Typed components, a documented system and a repo your team owns outright at handover.