Things that run in
a browser tab.

I build the tools for my own hobbies, and then I build them properly. Games, musical instruments, and workshop software for boats, circuit boards and flag football. Everything here opens in a browser — no installer, no account, no plugin, and in most cases no assets to download either, because the sounds and the terrain are generated on the spot.

By day I am an applied AI and ML lead — twenty years of production machine learning, the last three building GenAI systems end to end, previously at Amazon and Google and twice a technical founder. Everything below is what I build when nobody is paying me to: the hobbies came first and the software followed. If you are here to hire rather than to play, the work and CV page is the one you want.

Sound

Web Audio, down to the circuit

Ambient

live

A granular instrument for live performance. Eight voices, no timeline, always running — you sculpt it rather than arrange it.

No shared clock. Every voice sweeps its source on its own cycle, so give them 7.3s, 11.1s and 4.7s and they will drift against each other for hours without ever realigning.

Web Audiogranular MIDIPaulStretch

Amp

live

A guitar amplifier in a browser tab. Cascaded valve preamp, push-pull power amp with sag, and a speaker cabinet. 5.3 ms round trip.

The tone stack is the real circuit. Third-order transfer function from the published analysis, component values off the schematics, and checked against the analogue response to within 0.05 dB.

AudioWorkletDSP oversamplingconvolution

Games

Godot, exported to the web

Driftwind

live

A relaxing physics toss game. Launch a spinning cylinder over procedurally generated terrain and land it on the pad.

The air is alive. Gusts curl around the hills and interact with the spin you put on the disc, so reading the wind beats throwing hard.

Godot 4.7Magnus effect procedural terrain

Driftwind Links

live

2.5D disc golf that grew out of Driftwind — same air, same spin, a course instead of a target pad.

Low power, high spin wins. The flight model rewards finesse and wind-reading rather than arm strength.

Godot 4.72.5D flight physics

Soccer Game

live

Arcade soccer in 2.5D, built in Godot and exported to the web.

Pick-up-and-play rather than simulation — the whole thing is a browser tab and a keyboard.

GodotGDScript 2.5D

Workshop

Software for things that get built in the real world

FlagBook

live

A play designer for 6-on-6 flag football. Draw routes, animate them, and watch them run against simulated coverage.

Built for the sideline. iPad-first, so it works with a thumb on a cold morning rather than needing a desk.

JavaScriptcanvas touch-first

Unfold to Sheets

live

Take a 3D model, cut it into pieces that flatten, nest those onto sheet stock, and mark the seams so it can be put back together.

It sweeps the scale. The interesting output is not one layout but the curve of waste against size — how big you should build it.

JavaScriptgeometry nesting

Lofting

live

Turn a scanned or photographed boat lines plan into a table of offsets you can scale to any size.

Calibration is the whole problem. A photo of a plan is perspective-distorted, and the accuracy of every offset depends on getting that undone first.

JavaScriptboat building calibration
68.0 ±0.238 32.0 c-c

Caliper

source

Spec-driven generation of manufacturable 3D parts. Describe the part, get an executable spec, generate the mesh, measure it, iterate until it passes.

Test-driven development for physical parts. Wall thickness, hole inventory, mass, interference and watertightness are measured exactly and graded against the spec. The numbers are ground truth; the render is only a sanity check.

PythonCadQuery LLMCAD

Plasma Nesting

source

2D nesting for CNC plasma cutting. Parses the cut shapes back out of G-code, packs them onto a sheet to waste less steel, and emits new G-code panels.

It reads the toolpaths you already have. Nothing to redraw and nothing to re-export — G-code in, packed G-code out.

Pythonbin packing G-codeCNC
OWNER designaskready reviewship

The Firm

source

An operating model for running several coding agents on one real codebase. Five roles, one owner, a labelled board, and seven rules.

One agent in one checkout is a solved problem. The trouble starts at two — branches switched out from under each other, authority arriving sideways from a peer, and “tests pass” from a session that read it rather than ran it.

multi-agentgovernance git worktreesMIT

Cartograph

source

A visual map of any repository, built from the source rather than from a model’s impression of it, with coding agents attached at every level.

A map that can be wrong in a way you notice. The crawler extracts what the code actually says — modules, imports, resolved call edges — and every element carries a file:line you can go and check.

PythonAST agentscode visualization

Circuit Forge

private

Netlist in, KiCad schematic, placed board and fab files out. A local, scriptable replacement for the browser EDA tools.

No cloud, no lock-in. Everything runs against kicad-cli on your own machine and the output is a real KiCad project.

PythonKiCad autoroutingGerbers

paper2pod

in progress

Turn a technical PDF into a podcast episode you can actually listen to at the gym.

For papers that are worth knowing but not worth sitting down with.

PythonLLM TTS