Writing & build logs.
Essays on software development, web builds, and AI tooling. Plus build notes from what I'm actually working on right now.
Telemetry surfaced six invisible YMYL pages. The operator-side fixes didn't move them. Internal linking did.
After ga-telemetry and gsc-telemetry made six stranded YMYL pages visible, Phase 1.6's first move was operator-side: sitemap canonical fixes, IndexNow, twelve Request-Indexing nudges. The technical audit cleared every blocker. The pages stayed unknown. Internal linking — crawl-weight transfer from body prose — was the diagnosis the data forced.
The og:image that wasn't there: blank WhatsApp previews and a pre-ship check no CI runs
Sharing a captainrandom.co.uk album link on WhatsApp returned a blank white card. The site had structured data, a navigation spec authored by 16 parallel agents, and data-driven course stubs. It had no default og:image. The gap was invisible until a real phone surfaced it.
Four fixes to pass AdSense: Google scores the estate, not the page
The UK Calculators readiness audit scored 7 of 8 green before submission. Eight days later, AdSense rejected the site on content quality. Closing the gap to re-submission required four separate fixes — telemetry, thin surfaces, media diversity, and hub listings — because Google scores the estate as a portfolio, not page by page.
`strict: true` was in tsconfig.json. `ignoreBuildErrors: true` was in next.config.mjs. Twelve YMYL product bugs were in between.
The UK calculators site had TypeScript strict mode configured and then silenced at build time. Removing the override surfaced twelve masked product errors in one afternoon. On a YMYL financial calculator site, that's not a developer experience win. It's a trust gate becoming real.
Strip the sentence you wrote for yourself
Four copy fixes across five weeks. Each one stripped a sentence written from inside my own head and replaced it with one a cold reader could actually decode. The pattern only became visible after the fourth.




