The Daily
A note a day on APIs and the realities of shipping web applications. Stuff I've actually learned across 25 years of doing the work.
The Rollback Conditions Nobody Writes Until 3am
Automated rollback sounds easy until production is on fire. Here's the actual condition logic I use to catch bad Laravel deploys before users do.
Every team I've talked to has automated deploys. Almost none of them have automated rollbacks. They have a rollback command — , swap the symlink, — but the part that decides to run it is a tired engineer squinting at Slack at 3am. That's not automation. That's a pager. I've been burned enough times that I finally sat…
Read the daily →MariaDB thread pools: what max_connections can't save you from
Raising max_connections feels like the right fix for connection exhaustion. It isn't. Here's what actually works under burst traffic.
Raising is the first thing everyone does when MariaDB starts rejecting connections under load. It's also mostly wrong, and I've watched it make things worse on more than one client server. The real fix is the thread pool, and understanding why changes how you think about database capacity entirely. The situation that…
Read the daily →Twilio Status Callbacks: What 'delivered' Actually Means
Twilio will tell you a message was delivered. That doesn't mean anyone read it. Here's how I build a real audit trail in Laravel.
Twilio's message status callbacks look simple until a client asks you to prove that a patient received their appointment reminder and you realize 'delivered' just means the carrier accepted the message, not that any human saw it. I learned this distinction the hard way on a healthcare project, and it changed how I…
Read the daily →Laravel Horizon: Size Workers by Memory, Not Queue Depth
Most teams tune Horizon by tweaking numProcesses and call it done. The pmset memory config is where the real sizing lives, and almost nobody touches it.
Most teams ship Horizon with the default config, bump when queues back up, and consider the job done. That worked fine until I had a queue worker OOM-kill itself mid-job and corrupt a batch of records for a healthcare client. That's when I started actually reading what in the supervisor config does — and realized I'd…
Read the daily →GitHub Actions Secrets Are Not Enough for Multi-Env CI
Environment-scoped secrets in GitHub Actions feel like the answer until you actually run multi-environment CI at scale. Here's what bites you.
I spent two days last spring untangling a secrets mess on a project that had grown from one environment to four. Everything looked correct in the GitHub UI. The deployments were failing in ways that made no sense until I realized we had three different values for the same secret name living in three different scopes…
Read the daily →