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.

The PHP attribute that yells at you for ignoring a return value: #[\NoDiscard] in 8.5
php

The PHP attribute that yells at you for ignoring a return value: #[\NoDiscard] in 8.5

PHP 8.5's #[\NoDiscard] makes the engine warn you when you call a function and throw away its result — the classic immutable-API footgun ($url->withScheme('https') that quietly did nothing). Why it's the rare attribute that improves your code by nagging you, where it fits in Drupal (Url, cache metadata, fluent withX() setters), the (void)-cast escape hatch, and why it only helps if your CI fails on warnings.

2026-09-07 / 03 min
Immich v3 quietly swapped my vector database — read the release notes to the end
tooling

Immich v3 quietly swapped my vector database — read the release notes to the end

Immich is the self-hosted Google Photos replacement everyone recommends, and it ships features faster than its commercial rivals. v3 also swaps the Postgres vector extension underneath your library (pgvecto.rs → VectorChord) on a point-major bump. 'Ships fast' and 'boring backup for irreplaceable photos' are in tension — snapshot the DB before you pull, pin your version, and keep a dumb app-independent copy of the actual files.

2026-09-07 / 04 min
Agent Skills are just folders of Markdown — and after a year of MCP hype, that's the point
ai

Agent Skills are just folders of Markdown — and after a year of MCP hype, that's the point

The most useful upgrade to my agent workflow lately is embarrassingly low-tech: a folder with a SKILL.md in it. Anthropic's Skills (now an open standard) use progressive disclosure to load the right instructions only when relevant. They're the honest counterweight to MCP: half the time you don't need a live tool, you need the paragraph the agent was missing — versioned in git, no daemon. Plus the supply-chain caveat nobody screenshots.

2026-09-07 / 04 min
Coming from free Drupal contrib: making peace with Craft's paid plugin economy
craft cms

Coming from free Drupal contrib: making peace with Craft's paid plugin economy

Opening Craft's Plugin Store and seeing a price on the field type you need is a values-level culture shock for a Drupal dev used to free GPL contrib. How the money works (20% cut, one-time + annual renewal), why the paid model is a feature disguised as a tax (maintenance funded by self-interest, not goodwill), and the real lock-in: 'we stopped paying' and 'we stopped getting security updates' are the same sentence.

2026-09-07 / 04 min
No Views UI: fetching content in Craft when your hands expect Drupal Views
craft cms

No Views UI: fetching content in Craft when your hands expect Drupal Views

The thing that made Craft feel different from Drupal wasn't a missing feature — it was a missing screen. There's no Views UI; you fetch content by writing element queries (a fluent Twig/PHP API) or hitting Craft's free first-party GraphQL. For a developer that's mostly better — all in code, all reviewable. For the site builder who shipped listings without a developer, it's a real loss worth naming.

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