Blog
Blog posts and whatever I'm tinkering with lately.

OpenCode source code deep dive: how an open source agent harness really works
One harness, taken apart subsystem by subsystem, in the order a request flows through it: the loop, the prompts, the tool surface, the permission system, the subagents, the context manager, and the undo. Every part is a file you can open, and most of them are smaller than you would guess.

What is an agent harness? Claude Code vs Codex CLI vs OpenCode
A language model only turns text into text. The loop that lets it read files, run tests and fix its own mistakes is the harness, and it moves results as much as swapping models does. I cloned Claude Code's leaked prompts, Codex CLI and OpenCode to see what they actually do differently.

Two users, tiny data: how my Convex chat app read tens of MB a day
Convex bills you for reads, not storage. My chat app held a few hundred KB and still read tens of MB a day, because reactive queries re-read everything each time anything changed. Here's what was actually going on, and how I fixed it.

A motionless Three.js scene was cooking my phone
My phone got hot showing a Ludo board that wasn't moving. The render loop was redrawing the same frame 60 times a second, and a dirty flag fixed it. Notes on render-on-demand, pixel ratio, and antialiasing on mobile.

An iOS multiline TextInput that wouldn't wrap, and the one-line fix
A mentions library inserts text through children instead of value, so iOS never re-runs layout and the input stops growing. One setNativeProps call fixes the wrap without a remount or keyboard flicker.