Writing & build logs.
Essays on software development, web builds, and AI tooling. Plus build notes from what I'm actually working on right now.
Cursed Energy Phase C: wiring an iOS budget app's quest system to real transaction history
The an iOS budget app gamification layer had quest cards, a claim button, and a streak counter. None of it read from actual spending. Replacing a hardcoded array with a transaction-aware QuestGenerator turned decorative chrome into a feedback loop that surfaces real patterns.
Device QA found three regressions. The simulator had approved them all.
Round-2 device QA on bb finance flagged a navigation stack popping two levels instead of one, ProMotion locked at 60Hz on a 120Hz panel, and category rules over-reaching on shared word fragments. None of them showed in the simulator.
Eight calculators were cannibalising each other. One prefix strip fixed it in 72 hours.
A site-wide SEO audit against ukcalculator.uk surfaced 8 routes competing with themselves for the same search intent. The fix — strip the NN- prefix, issue 308 redirects across 23 routes, repoint every internal cross-link — had to land as a single atomic operation or it would introduce crawl noise between deployments. Three days later, Google had started indexing.
Five slots, twenty percent: the substitute pool had no editorial policy
Five scheduled publishing slots, four expirations, and a breach chain that exhausted six candidates in three seconds. The scheduler fired on time every run. The substitute pool was offering articles the drafter’s citation rules were going to refuse.
GOOGLE plus CLOUD matched SoundCloud. Why the fuzzy categoriser had to go.
Phase Q's fuzzy categoriser propagated category matches silently. Device QA on Phase R's part-based builder immediately surfaced an ANY-match failure: GOOGLE plus CLOUD matched SoundCloud. Version two adds exclusions and per-row overrides; the difference is that the user can now see what the matcher is doing.




