Skip to main content

Engineering the open web.

Long-form writing on Drupal, PHP frameworks, AI tooling, automated testing and everything else in a working programmer's stack — shipped from production, not theory.

It deleted prod in 9 seconds — and the AI was the least interesting part
ai

It deleted prod in 9 seconds — and the AI was the least interesting part

An AI agent wiped PocketOS's production database and its backups in nine seconds (April 2026). Strip out the AI and you find three ordinary failures: an overprivileged token that outlived its purpose, backups sharing a volume with the data, and no gate on destructive actions. Every 'rogue AI' headline is an IAM-and-backups failure in costume — and it's the exact fear from my Coolify-MCP post, realised.

2026-08-17 / 04 min
Install modules from the admin UI — the catch nobody puts on the slide
drupal

Install modules from the admin UI — the catch nobody puts on the slide

Project Browser hit stable: browse contrib and click 'Add and Install', no Composer, no terminal. But it needs a web-writable codebase and is local-dev-only — and that limitation isn't unfinished, it's a security decision in disguise (a writable codebase is exactly what production hosts forbid). Why the catch is the most reassuring part.

2026-08-17 / 04 min
Stop new \DateTime(): treat time as a dependency you inject
drupal

Stop new \DateTime(): treat time as a dependency you inject

Every time() and new \DateTime() buried in your logic is a hidden dependency on the one thing you can't pause — and it's why your time-sensitive tests are flaky. Inject Drupal's TimeInterface (already there) or Symfony's Clock (freeze and advance instantly in tests). Where Drupal's built-in falls short, and the discipline that makes 'what happens at midnight?' a test you can actually run.

2026-08-17 / 04 min
You don't need Harbor: a tiny Zot pull-through cache for faster Coolify redeploys
tooling

You don't need Harbor: a tiny Zot pull-through cache for faster Coolify redeploys

Docker Hub's 100-pulls-per-6-hours (per IP) limit and slow cold pulls bite exactly when you're redeploying under pressure. A single-binary Zot pull-through cache fixes both. An honest comparison (Zot is more modern than registry:2, far lighter than Harbor — but not magically 'lighter' than registry:2), the real downsides, and whether one blog even needs it.

2026-08-17 / 04 min
One emoji, quadratic time: the Markdown bug that DoSes your site without a payload
php

One emoji, quadratic time: the Markdown bug that DoSes your site without a payload

CVE-2026-71488 in league/commonmark — the Markdown parser behind Laravel, Drupal, Statamic and more — turns a single non-ASCII character into O(n²) parsing. No RCE, no leak, just one long line with an emoji pinning a CPU. Why algorithmic-complexity DoS is the vuln class nobody threat-models, and why you should benchmark parsers with adversarial input.

2026-08-13 / 04 min
Your agent's reasoning trace is mostly theater
ai

Your agent's reasoning trace is mostly theater

A pile of 2025-26 research says chain-of-thought is often unfaithful: 30-60% of 'thinking steps' have minimal causal impact, models trained on scrambled traces do fine, filler tokens substitute for reasoning, and Anthropic found models admit using a hint only ~25% of the time. If you log CoT to debug and audit agents, you're trusting a story the model made up after the fact.

2026-08-13 / 04 min
Subscribe to Home
One email a week. No noise.
Every new article, plus the tools and patches I’m watching.