Nicholas Kocher

Bend, OR → SF Bay Area

I build systems that run on real hardware, and I care about the harnesses that measure them as much as the systems themselves.

Selected work04

mml-gpt

PyTorchESP32-S3~2,600 lines

A character-level GPT written from scratch in PyTorch, quantized to INT8 and running on a microcontroller that plays what it generates through four buzzers.

A model can lower validation loss while never emitting a song that parses. So checkpoint selection samples the model mid-training, parses the output, and scores validity, repetition, and looping alongside loss. The model itself is small and mostly wrong. The harness is the part worth reading, and it is shown below.

no-eyes

RustESP-NOW meshThree.js

Three ESP32-S3 boards reconstructing a room in 3D from WiFi signal distortion. No camera involved.

Passive CSI measures the access-point-to-node channel, not node-to-node, which gives three rays in a fan rather than six paths between boards. Getting that wrong produces a reconstruction that looks plausible and is fiction. Fresnel-weighted ray sensitivity, ART solver, 3,200 voxels, about 60 microseconds per frame.

ai-cmo

PythonFastAPI84 tests

An LLM pipeline that audits a site and returns a reviewable queue of actions. Nothing executes on its own.

A response can arrive with empty content and finish_reason == "length": the model spent its whole budget before emitting text. Nothing raises. A naive client returns an empty string and the caller parses garbage, which is worse than a crash because it fails quietly. The client catches that case and retries at double the budget. I found it by watching a pipeline produce empty proposals.

subway-sign

RustTokio · Axum26 tests

Live MTA arrivals on a 192×32 LED matrix, decoding GTFS-RT protobuf on a Raspberry Pi.

Two choices, both about never touching the device again. Config hot-reloads in five seconds behind an HTTP control interface, so changing stations does not mean an SSH session with something mounted on a wall. And the panel driver sits behind a feature flag, so the whole system runs against a mock display on a laptop. That is the difference between iterating and deploying to test.

Also a pile of smaller embedded work: an IR-to-USB HID bridge, a fireplace thermostat, and the four buzzers that mml-gpt writes for.

The harnessmml-gpt

Three training runs. Pick the metric that decides which one wins.

runval lossvalid rate loop ratecomposite

Real numbers from a hyperparameter sweep in mml-gpt. Each metric crowns a different run, which is why checkpoint selection there runs on a weighted composite rather than on loss. I wrote up how I would extend this to evaluating coding agents.

About
Currently

I am self-taught and building full time. Before this year I worked in coffee and in film production, which is where I learned to run things that have to work on a schedule with other people depending on them.

What I keep returning to is measurement. Most of my projects end up with a harness bolted to the side, because the interesting question is usually not whether something runs, but whether you can tell when it is quietly wrong.

I am moving to the Bay Area and looking for work on developer tooling and AI systems.