iOSSwift
#176
2026-06-276 min read

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.

Read post→
iOSSwift
#177
2026-06-275 min read

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.

Read post→
Build LogCreative Coding
#178
2026-06-276 min read

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.

Read post→
Build LogSEO
#179
2026-06-266 min read

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.

Read post→
iOSSwift
#180
2026-06-266 min read

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.

Read post→