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.
AWS SES: The Unglamorous Setup That Keeps You Off Blocklists
SES sandbox mode is easy. Production SES that doesn't get you blocklisted is a different project entirely. Here's what I've learned the hard way.
Getting SES out of sandbox mode feels like an accomplishment. It isn't. It's just the beginning of a setup that, if you skip any of it, will eventually get your sending domain blacklisted and your clients calling you on a Saturday morning. I've done this setup probably a dozen times now — for e-commerce clients…
Read the daily →How Much Traffic a $40 VPS Actually Handles (Real Numbers)
Everyone assumes you need Kubernetes and auto-scaling. I've been running production Laravel apps on single VMs for years. Here's what the numbers actually look like.
The reflex in this industry is to reach for complexity before you've earned it. I've watched clients spend $800/month on managed Kubernetes clusters running apps that serve 200 visitors a day. I run production Laravel apps — real ones, for paying clients — on $40 VMs, and they handle more than most people expect. This…
Read the daily →Disaster Recovery for a One-Server Laravel App: The 2am Restore
Backups are useless if you've never practiced the restore. Here's what a real one-server Laravel recovery actually looks like at 2am.
Your backup strategy is not a strategy until you've done the restore. I don't mean read through the steps — I mean actually spun up a blank box, followed your runbook, and watched the app come back. Most shops haven't. I know because I was one of them, until a managed hosting client's VPS provider had a catastrophic…
Read the daily →Trigger.dev: Background Jobs That Actually Live in Your Codebase
I've run Sidekiq for years. Trigger.dev is the first JS job runner that made me think I could stop missing it.
I've been running Sidekiq in Ruby projects and Laravel Horizon in PHP projects long enough that I stopped thinking about background jobs as a hard problem. You define a job class, enqueue it, Horizon or Sidekiq runs it, you watch a dashboard. Done. The JS/Node world has never had a clean answer to this. BullMQ is fine…
Read the daily →OpenAI Function Calling: Don't Let Your Schema Drift
Function calling is the most useful thing OpenAI added to the API — and the easiest way to ship a system that silently breaks three weeks later.
Function calling is the most useful thing OpenAI added to the API since the API itself. It's also the fastest way I've found to build something that works great in staging, ships to production, and then silently starts returning garbage two weeks later when someone changes a function signature without updating the…
Read the daily →