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.
API Versioning in Laravel: The Operational Pain Nobody Warns You About
URI vs. header versioning both work until they don't. Here's where each one actually burns you in production.
Every architecture post on API versioning draws the same clean diagram, explains the two main camps — URI versioning () vs. header versioning () — and then says "choose based on your needs" and moves on. That's where they all stop. I'm going to start there. I've shipped both approaches across a dozen production APIs…
Read the daily →Telescope Will Burn You in Production
Laravel Telescope is the best debugging tool I've ever accidentally left in production. Here's why I don't use it anymore, and what I run instead.
Telescope is a genuinely great debugging tool. It's also one of the most dangerous things you can leave running in a production environment, and the Laravel ecosystem doesn't talk about that loudly enough. I've seen it expose request payloads, slow down apps under load, and balloon databases — all while sitting…
Read the daily →Build vs. Buy Your Admin Panel (And When You're Fooling Yourself)
Filament and Nova are genuinely good. But I've watched teams spend three weeks customizing one into something they should have just built from scratch.
Filament and Laravel Nova are both genuinely good pieces of software. I've used both in production. But I've also watched a project start as "we'll just use Filament" and end three months later as a barely-recognizable fork with seventeen custom Livewire components, a hacked-together permission system, and a teammate…
Read the daily →Structured Laravel Logging You Can Actually Query (No Datadog Required)
You don't need a $500/month observability platform to query your logs. Here's how I set up structured logging on a single VM that doesn't make me want to grep through walls.
Most single-VM Laravel apps I inherit have the same log setup: the default channel, a wall of unstructured text in , and a developer who's been doing and hoping for the best. That's fine until something breaks at 2am and you're staring at a 400MB log file trying to correlate a user ID across five different request…
Read the daily →Shaving 600MB off a Laravel Image with Multi-Stage Builds
Multi-stage Docker builds aren't magic — they're a scalpel. Here's what they actually copy, what they silently skip, and how I got a Laravel image from 980MB to 340MB.
I spent an embarrassing amount of time thinking multi-stage Docker builds were basically magic — build your stuff in one container, copy it to another, done, small image. Then I deployed a Laravel app to a client's VPS and watched the image clock in at 980MB. That's when I actually sat down and read what does and…
Read the daily →