Blog
Insights on technology, engineering, and digital strategy.
- Models from ScratchEssay
A gift recommender is a calendar problem, not a model problem
A gift recommender that looked like a model problem and was a calendar problem. Spain gives presents on 6 January, and no embedding in 2022 knew that.
Aug 24, 2026 · 8 min read - InfrastructureEssay
You do not need four subnets yet
Most cloud security advice is written for a company you are not. Four stages, what each one actually protects, and a check you can run at every step.
Aug 22, 2026 · 9 min read - Agent LoopsEssay
AI coding agents moved my work from writing to checking
Nine posts, one argument: agents made producing cheap and verifying expensive. Here is the order I would read them in, and what each one broke.
Aug 20, 2026 · 6 min read - InfrastructureEssay
An MCP server is mostly the places where it says no
Simon Willison argues MCP is safer than giving an agent a shell, because tools are easier to audit. He is right. I went and read back the two MCP servers in my own products to see what auditable had actually cost, and almost all of it is refusal.
Aug 20, 2026 · 8 min read - Agent LoopsEssay
Five rules for building agents, checked against 24,560 pull requests
The advice on building AI agents has converged, and almost none of it is measured. I held five of the most repeated rules against my own data.
Aug 19, 2026 · 8 min read - MeasurementEssay
Your design system is adopted. It still isn't used.
Adoption dashboards count which components get imported. That answers the wrong question. Counting how many different ways one component gets called found things in my own app I would never have looked for.
Aug 18, 2026 · 7 min read - MeasurementEssay
I designed for a rare GitHub outage. It happens every three days.
I built a collectible ticket for GitHub outages, assuming they are rare. GitHub's own feed says one major or critical incident every 3.3 days.
Aug 18, 2026 · 5 min read - Agent LoopsEssay
My AI workflow: delegate, verify, let it run
Most of my work is done by models now. That is the easy part. The hard part is saying, in advance, how I will know it is finished.
Aug 17, 2026 · 9 min read - Agent LoopsEssay
The green check is a claim, not a result
Three tools reported success in one week and all three were wrong. None failed a test. What caught them was knowing what the output should have looked like.
Aug 17, 2026 · 8 min read - InfrastructureEssay
Three lists drifted from their registry this month. Nothing turned red.
A hand-kept copy of a list that already exists somewhere else is the cheapest bug to write and the hardest to notice. Types pass, lint passes, tests pass, and the only symptom is something missing.
Aug 16, 2026 · 7 min read - MeasurementEssay
Tokens tell a model what exists, not what's allowed
A component library documents six button variants. Nothing in it says when to use which, so a model generating from it produces plausible slop. I spent three days building the layer that does — and my own eval found the first bug in it.
Aug 14, 2026 · 8 min read - InfrastructureEssay
I picked Coolify for the fast setup. Eleven projects later I am moving to Kubernetes.
Coolify was the right call for what I chose it for. Then the question stopped being how do I deploy this and became how do I move it, and the answer turned out to be a tarball and a lot of clicking.
Aug 14, 2026 · 8 min read - InfrastructureEssay
CDKTF is archived. Your state is fine.
HashiCorp archived the Terraform CDK on 10 December 2025. It generated Terraform rather than replacing it, so the exit is one command and your state survives it.
Aug 13, 2026 · 7 min read - Models from ScratchEssay
I wrote a tokenizer, and German got expensive
Context window, price per million, rate limit — all denominated in a unit you didn't choose. I implemented byte-pair encoding to see what that unit actually is, and my own language came out costing more.
Aug 11, 2026 · 4 min read - InfrastructureEssay
What actually runs your infrastructure when you use SST
SST v3 dropped CloudFormation for Pulumi, and Pulumi's providers are bridged from Terraform's. If you already write Terraform, that chain decides whether SST is a shortcut or a detour.
Aug 11, 2026 · 9 min read - Models from ScratchEssay
Hetzner is giving away inference. The models spent it thinking.
Four open-weight models behind a free, OpenAI-compatible API. Given 512 tokens to answer a question, three of them returned no visible answer at all — and two transport details break a stock client before you get that far.
Aug 11, 2026 · 9 min read - Agent LoopsEssay
The most quotable thing in my review was made up
An agent reviewed my loss-function post and filed three findings. Two were exactly right and made the post better. The third was the best story in the batch, and none of it was in the files.
Aug 9, 2026 · 6 min read - Models from ScratchEssay
A language model small enough to read in one sitting
I could recite why models start repeating themselves at low temperature. I couldn't derive it. So I built the smallest model that has the same problem, and put it in the page.
Aug 7, 2026 · 5 min read - Agent LoopsEssay
LLMs reward expertise. Scored loops freeze it.
Sean Goedecke is right that domain knowledge is what lets you push a model hard. Write that knowledge into a loss function and it stops being a lever — it becomes the one assumption nothing in the run can revise. My eval had 600 scenarios and not one of them was a real request.
Aug 5, 2026 · 6 min read - Agent LoopsEssay
How loss functions changed the way I run agent loops
Larson and Eugene Yan describe compounding as writing things down. Attach a score and you have an optimiser — which attacks your metric first.
Aug 4, 2026 · 14 min read - MeasurementEssay
The least examined component in your design system
A progress bar fills left to right and that's where the thinking stops. I swapped the renderer and kept the semantics — 10.4 kB gzip, 120 FPS at fifty.
Aug 2, 2026 · 6 min read - MeasurementEssay
I built a typeface and gave it a test suite
Zutat Sans is a Geist derivative under the OFL. What made it hold up wasn't the drawing — it was FontBakery, nine Playwright checks and a reproducible release.
Aug 1, 2026 · 6 min read - Agent LoopsEssay
How I route models, and why no agent reviews its own work
I stopped picking one model and started routing work by intelligence and taste. Plan before code, and never let the agent that wrote something check it.
Jul 30, 2026 · 8 min read - Agent LoopsEssay
The queue that can be empty: T3 Code's inbox sidebar
T3 Code's settle button changed how much work I finish, not how fast I start it. The mechanism, and where it meets my research on PR size.
Jul 30, 2026 · 7 min read - InfrastructureEssay
5 Terraform Anti-Patterns I See in Every Startup Codebase
One main.tf with 1,847 lines, no modules, no remote state. The five Terraform patterns that cause the most damage in startup codebases.
Apr 15, 2026 · 7 min read - Agent LoopsResearch
Do AI Coding Agents Break Your CI/CD Pipeline?
I analysed 24,560 pull requests across 447 repos. AI-authored PRs fail CI 19.4% more often — but only below 55 lines. Here's where the gap actually is.
Apr 13, 2026 · 8 min read
Notes
2Short write-ups of things I hit and fixed. One behaviour, one fix, no argument to defend.
- Lenis stops a textarea or dropdown from scrollingAug 6, 2026 · 3 min read
Smooth scroll intercepts wheel events for the whole page, so anything with its own scrollbar stops responding. The documented fix is per-element and easy to forget. There is a better one.
- A scheduled post leaked its full text through next-intlAug 4, 2026 · 3 min read
The route returned 404 as intended. The article was still readable in view-source on every other page of the site, a week before it was due.