Writing & build logs.
Essays on software development, web builds, and AI tooling. Plus build notes from what I'm actually working on right now.
One PR, three game systems: why pure generators kept the ledger honest
Shipping streaks, quests, and levels as a single PR forced a specific architecture: pure generators with no side effects, persisted targets decoupled from quest logic, and celebration overlays computed after state transitions. This is the constraint that produced those decisions.
Real quests, broken buttons: how Phase C and N closed bb finance's behaviour loop
Phase C replaced mockQuests with a generator that reads real transaction history. Phase N found that the quest blocks were non-interactive labels and the streak's Check In button opened the wrong screen. Both sprints were necessary. Only together did they close the loop.
Spring became winter on the bass hit. That was the effect that mattered.
Three reactive effects were already live — bloom, particles, waveform — and the visualiser still read as a showcase. The portal changed that: a bass-driven radial mask cuts from spring into winter, and reactive opacity does something reactive motion cannot.
Six pages Google couldn't find: telemetry ruled out the technical before we touched any code
The GSC digest showed six pages stuck at “URL is unknown to Google.” That specific status — not crawled and filtered, just never discovered — changed what we looked for first. Two stdlib-only telemetry skills made that diagnostic distinction available before we opened a single file.
The accessibility gate that made stacking five motion effects into one PR survivable
Phase D of the Cursed Energy DNA landed sigil rotation, energy pulse, claim spark, level-up celebration, and streak milestones in a single PR alongside three other features. Accessibility review was a non-event — not because the PR was small, but because every motion effect owned its own gate.




