Installations, browser-native tools, and the odd commissioned shader. I build things that respond to you — permanent pieces for cultural institutions, open-source libraries that keep the work honest. Brooklyn studio, anywhere with a good soldering iron.
A compute-shader fluid sim running full-viewport at 60fps on a modest laptop. Velocity + pressure fields live on the GPU the entire frame — no CPU roundtrip. This is roughly the same pipeline shape I use for installation work: compute first, present late, composite everything in one pass.
I build things that respond to you — installations, tools, and the web version when a client has no budget for hardware.
My work sits between graphics engineering and studio practice. About half of it is commissioned for a gallery or a brand; the other half is open-source tooling that keeps the first half interesting. The installation work funds the library work. The library work makes the installation work possible.
The studio is small by choice. I take 5–7 commissions a year, ship one OSS release a quarter, and teach one workshop each summer. Everything else is noise.
Solo practice with two rotating collaborators. Commissions for MMCA, Leeum Museum, Serpentine Pavilion 2024. Running glint (3.4k stars) + noise.kit (1.2k stars) on the side.
Generative-AI prototypes pre-Gemini. Lead engineer on "Paint with Music" — a browser instrument that reached 2.2M unique visitors in the launch month.
Generative branding + interactive data viz. Shipped the Deutsche Bank 150 identity system across print, digital, and an 18m LED wall. Worked with Nike, The Economist, Somerset House.
Shaders team — contributed to the Universal Render Pipeline shader graph + post-processing v2. Two patent filings on screen-space reflection techniques. Left to go indie.
Permanent interactive installation for the MMCA lobby. Visitor silhouettes get translated into a real-time field of animated glyphs across a 48-panel LED wall. Opened 2024, runs daily.
Tiny animation library for WebGPU scenes. 3.4k stars, used in three published papers + the Three.js examples. Maintained alone — PRs merged on Sundays.
Browser instrument where canvas marks generate music in real time. 2.2M uniques in launch month. Webby nomination. The demo still runs.
Motion-responsive light piece at the main pavilion entrance. Eight overhead depth sensors translate footfall into ambient sound + projection. Ran the full Summer programme, 214k visitors logged.
First week is always a single tight prototype — the kind that would survive if every other idea was cut. If that one runs, everything else we add is upside.
Physics on the GPU, CPU as a conductor. Nothing that renders more than once leaves the card. This is the rule that makes installation work possible.
First pass is throwaway. Second pass keeps the one lesson from the first. Shipping is the third pass — and by then there are no surprises.
Permanent installations get a soft-launch period — two weeks where the piece runs but I am still there. Zero exceptions. That fortnight is where it earns the right to stay.
I keep a one-year maintenance SLA on every permanent piece. If a panel flickers at 3am, that is my phone. It is baked into the commission.
If a pattern shows up on three commissions, it becomes an OSS library. glint came out of MMCA. noise.kit came out of Serpentine. The next one is already in progress.
Commissions open for Q3 2026 — two slots. Teaching bookings for summer. Everything else: ask and we will see.