What we learn shipping fixed-scope sprints, written down. No growth hacks, no listicles — one note at a time, when there's something worth saying.

I spent a Saturday auditing local businesses on Apple Maps and found a pattern most owners don't know is costing them. Here's what's broken and the 20-minute fix.
Read the note →I wired Claude into our support inbox to classify and draft replies, then watched what happened over 84 emails. Here are the three failures that taught me where AI agents shouldn't touch customer…
Most tutorials still show REST. Shopify's docs now nudge you at GraphQL. Here's the actual decision framework, with rate-limit math and a migration path from someone who shipped both.
I shipped a Shopify app. Here are the receipts — what it paid, what it cost, and the one question to answer before you write a single line of code.
The five things nobody warned me about: context rot, prompt injection via product titles, rate-limit cascades, retry-cost explosions, and MCP loops that never terminate. Each with a fix.
Four years of Firebase in production. Two months of Supabase on the same product. The decision framework, the real trade-offs, and when I'd pick each.
Three tiers, three real numbers, and the hidden costs nobody quotes: review queue, revenue share, merchant support, API drift. What you're really buying at each price point.
Real client work, not toy benchmarks. Thirty days with Claude Code, Cursor, Copilot, Windsurf, and Gemini. The ranking, the receipts, and the metric I wish I'd tracked from day one.
Most React SPAs ship an empty body to Google. Here's what the crawler actually sees, why the JS-render queue can take weeks, and the three fixes ranked by effort.
A perfect 100 told me nothing about my real users. Here's the gap between lab and field data, the three numbers that actually matter, and the audit I run instead.
A Saturday audit of 20 Surrey, BC small business sites. 18 had NAP inconsistencies costing them local Maps rank. The bug, the fix, and why it keeps happening.
The migration itself took an evening. The aftermath took two weeks. Six specific things broke that the standard migration blog posts don't mention — with the fixes for each.
For three months my Journal was invisible to Google. The cause was a single template literal in a Cloud Function. Here's how I finally caught it.
New notes, what we shipped, and one thing we'd do differently. No launches, no fluff, unsubscribe anytime.