Skip to main content
Cache tags vs cache contexts: the mental model that ends “why won't my block update?”
drupal

Cache tags vs cache contexts: the mental model that ends “why won't my block update?”

The single most misunderstood corner of Drupal, and the root of ~90% of 'stale content' and 'user B sees user A's data' bugs. The one-line model: stale = a missing cache tag, leaking = a missing cache context. How they bubble, why max-age:0 quietly poisons a whole page, and the debug header that finds the culprit in seconds.

2026-08-03 / 04 min
Drupal shipped a native CLI called dr — and the Drush maintainers built it
drupal

Drupal shipped a native CLI called dr — and the Drush maintainers built it

Drupal 11.4.0 (July 1) added an experimental native command-line tool, dr, built by a team that includes the Drush maintainers. What it can and can't do yet, why 'the death of Drush' is the maintainers' own stated goal, and why that's the good version of a project handing off — not abandonment.

2026-07-29 / 04 min
Five Drupal modules just got marked “unsupported” — the contrib abandonment tax
drupal

Five Drupal modules just got marked “unsupported” — the contrib abandonment tax

On July 22 the Drupal security team shipped ten contrib advisories — five with no fix, just 'uninstall it.' What 'unsupported' actually means (including why they all read 'Critical' regardless of real severity), why it keeps happening, and the audit I now run on my own composer.json.

2026-07-29 / 04 min
Drupal's rough summer: when the thing that stops SQL injection is the SQL injection
drupal

Drupal's rough summer: when the thing that stops SQL injection is the SQL injection

Three core security advisories in a month, including a highly critical SQL injection in the database abstraction layer itself — exploited in the wild, anonymous, PostgreSQL-only. My blog runs MariaDB so I dodged it, but the JSON:API object-injection pair hit closer to home. What actually happened, and why serialized fields plus unserialize() are a bomb you keep in the building.

2026-07-27 / 04 min
hook_ is dying (slowly) and I started rewriting my .module files anyway
drupal

hook_ is dying (slowly) and I started rewriting my .module files anyway

Attribute hooks have been stable since Drupal 11.1, so I converted this blog's SEO module from a procedural .module file to a #[Hook] class. The catch nobody mentions: procedural hooks aren't actually deprecated yet and won't be removed before Drupal 13, around 2028. What's worth doing now, what isn't, and the LegacyHook trap that quietly fires your hook twice.

2026-07-24 / 05 min
FrankenPHP + Drupal: Great Server, but Skip Worker Mode
php

FrankenPHP + Drupal: Great Server, but Skip Worker Mode

Field notes on running Drupal 10/11 on FrankenPHP in classic mode today, why worker mode is still off-limits for Drupal, and how it sits behind my Traefik/Coolify setup.

2026-07-11 / 04 min
I Wired My Coding Agent Into a Live Drupal Site via MCP
drupal

I Wired My Coding Agent Into a Live Drupal Site via MCP

Field notes on connecting a coding agent to a running Drupal install through the AI module's MCP server, and the governance gaps of letting it build content types and run actions.

2026-07-11 / 04 min
Subscribe to Drupal