Writing
Essays
Field notes from inheriting, stabilizing, and shipping production software.
- May 15, 2026
The 1-Hour Audit: How I Walk a Contractor-Built Stack on Day One
Contractor-built applications fail in the same five places, in the same five ways, every time. Here is the seven-step walk I do in an hour, and the severity rule I hand the founder at the end.
Read → - May 15, 2026
The 14-Day Soak: What We Monitored, What We Ignored
A "boring" cutover doesn't finish at cutover — it finishes at day 14. Here are the four alerts that page, the noise we deliberately ignore, and the cyclic patterns we wait for.
Read → - May 15, 2026
5 Things I Found When I Took Over a Contractor-Built SaaS
The same five problems show up inside every contractor-built SaaS I've inherited. None are exotic. All are P0.
Read → - May 14, 2026
Cloudflare DNS-Only Behind GCP: Keep Webhook Signatures Alive
Put Cloudflare in proxy mode in front of a webhook origin and you will spend a quarter chasing "missed" Twilio webhooks that aren't actually missed. Here is why we ran gray-cloud instead.
Read → - May 13, 2026
Repointing Twilio Webhooks Via REST API, Not the Console
Repointing 200 Twilio webhooks via the console is a four-hour, error-prone afternoon. Via the REST API it is a 90-second script. Here is the script.
Read → - May 12, 2026
Stop Logging `req.body`
If you log `req.body` on auth routes, your log aggregator has every customer's password in plaintext. Stop. Here is the redaction pattern I use everywhere.
Read → - May 11, 2026
How to Renumber a Migration So It Doesn't Collide With the Contractor's
Two engineers, two migrations, the same number, one production database. Here is the renumbering pattern I use so the contractor's migrations and mine cannot collide.
Read → - May 10, 2026
The Encryption Key Gotcha That Would Have Shown Ciphertext to Every User
A single misconfigured encryption key would have shown ciphertext to every user the moment we cut over. Here is how I caught it, and the test that catches it next time.
Read → - May 9, 2026
Migrating Production Data: A 4-Minute Cutover That Took 14 Days to Plan
The cutover took four minutes. The plan that made four minutes safe took fourteen days. Here is the runbook, the rollback path, and what I would not skip again.
Read → - May 8, 2026
`sync({alter: false})` Is Not a No-Op
Sequelize `sync({alter: false})` is not a no-op — it still locks tables and reads schema metadata on every boot. Here is what it actually does, and what to use instead.
Read → - May 7, 2026
Why I Never `gcloud run deploy` From My Laptop
If anyone can `gcloud run deploy` from a laptop, you do not have a deployment pipeline — you have a habit. Here is what I do instead, and why.
Read → - May 6, 2026
The Leaked Service Account Key, the Public-IP Database, and Other Handoff Sins
A leaked service account key, a public-IP database, and the other handoff sins I find on every contractor-built stack. Here is the audit, by category.
Read →
Run the audit on your own stack
A 30-question self-audit. P0/P1/P2 severity. Takes about an hour.
Open the checklist →