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.

Craft Cloud vs my $6 VPS: what first-party serverless actually buys you
craft cms

Craft Cloud vs my $6 VPS: what first-party serverless actually buys you

My reflex to Craft's own managed hosting was the self-hoster's sneer — why pay for what I can run myself? But Craft Cloud isn't competing with my VPS's price; it's competing with my weekends and my bus factor, and that's a fairer fight than I wanted. What it includes, the lock-in the abstractions hide, and when managed hosting is the rational call vs. self-hosting pride.

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
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
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
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
Entry types, Matrix, and why Craft 5 quietly out-designed Paragraphs
craft cms

Entry types, Matrix, and why Craft 5 quietly out-designed Paragraphs

Drupal taught me to juggle nodes, paragraphs, blocks and media — four entity types with four APIs. Craft 5 collapsed almost all of it into one primitive: everything is an entry, and Matrix blocks are just nested entries. The conceptual economy is real. What a Drupal dev gains (nesting that just works) and gives up (Views, SQL-shaped reporting).

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