Deploying a Third App to a Crowded Droplet with Kamal
The droplet had room for a third app. What it didn't have room for was two settings that quietly meant something different to a second subsystem than the one I was tuning.
Long-form writing on software engineering, systems design, and building things.
The droplet had room for a third app. What it didn't have room for was two settings that quietly meant something different to a second subsystem than the one I was tuning.
Every system has invariants—conditions that must always be true. The most dangerous ones are the implicit invariants that nobody writes down.
LLM outputs vary, but system rules shouldn't. AISpec brings invariant contracts, confidence intervals, and Rails-native testing to your LLM pipeline.
AI can generate a thousand lines of code in a minute. It still can't tell you whether those lines belong in your system. As code becomes abundant, software architecture becomes the scarce resource.
LLM evaluation is probabilistic. If you treat your LLM judges like unit tests, you'll chase ghosts. Here is how to separate the two sources of noise and build an evaluation pipeline you can trust.
The Outbox Pattern solves the dual-write problem, but it isn't free. From database write amplification to retention strategies and duplicate execution, here are the real costs of transactional reliability.
Mature systems rarely waste time inside algorithms. They waste time moving data between them—and that is why performance fixes compound.
JSON is one of the most expensive ways to move embedding vectors. Here's how switching to binary Base64 float buffers cut payload size by 75% and reduced serialization latency by 98%.
When you need more throughput, adding threads seems obvious. But under the wrong conditions, concurrency can grind your system to a halt. Here is why your AI server is fighting the scheduler—and how to fix it.
Every senior engineer has lived through a migration that got 80% finished, stalled for a year, and left the team maintaining two versions of the same system forever. Migrations rarely fail because the new architecture is bad; they fail because of incorrect system boundaries, lack of dual-writing strategy, and ignoring human momentum.