Skip to main content
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
Gin isn't replacing Claro — it's merging with it, and it's messier than the headline
drupal

Gin isn't replacing Claro — it's merging with it, and it's messier than the headline

The tidy story is 'Gin replaces Claro as Drupal's admin theme.' The reality that landed in core is a merge, not a swap: a new experimental 'Admin' theme (Gin was built on Claro, so the codebases had to be reconciled), shipped ~3 months late and alpha, with Claro still the default. What it means for gin_toolbar, and why 'default in Drupal 12' is likely-not-guaranteed.

2026-09-02 / 03 min
Craft's project.yaml, from someone who's been burned by Drupal config sync
craft cms

Craft's project.yaml, from someone who's been burned by Drupal config sync

Picking up a Craft CMS backend as a Drupal veteran, the first thing I looked for was config management. Craft's project config solves the same problem with a gentler philosophy — the database stays the runtime source of truth and you can rebuild the YAML from it. Gentler is mostly good, and a drift trap if you skip allowAdminChanges=false. A working comparison.

2026-09-02 / 04 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
No-code automation is still code: ECA, the dead Rules module, and reviewable workflows
drupal

No-code automation is still code: ECA, the dead Rules module, and reviewable workflows

The tidy 'Rules is stuck, use ECA' story is out of date — Rules shipped a stable 4.0.1 in Feb 2026. But it already lost, and why says something honest about 'no-code': ECA models are version-controlled YAML you can't actually review in a diff, can't breakpoint, can't unit-test. Where ECA is the right tool, and where a 30-line event subscriber wins.

2026-08-24 / 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
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
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
Subscribe to Drupal