
- Sector
- Community · Automotive
- Year
- 2025 – now
- Role
- Architect · build
- Outcome
- Headless Drupal 11 rebuild · garages, groups, events, stories · tested & CI-gated
What needed fixing.
The rescued WordPress site worked, but it was a ceiling, not a floor. Every new feature fought the platform. A car community needs structured things — vehicles with histories, groups with discussions, events with RSVPs, members with garages — and bolting those onto a blog engine is how you end up rescuing a site twice.
How I built it.
I modelled the domain properly in Drupal 11 — vehicles, galleries, groups, events, stories as first-class content — and exposed it over JSON:API so the front end is free to evolve independently. The interface is built from Single-Directory Components, so a button is a button everywhere. None of this is taken on faith: 100+ kernel tests, JS unit tests, end-to-end runs with accessibility checks, and a pre-commit gate that refuses code that fails static analysis. CI runs on every pull request.
The WordPress rescue bought time; this is the long game. A full community platform rebuilt on Drupal 11, headless-ready, with a test suite that actually runs.
- 01Re-platform a car community from legacy WordPress onto Drupal 11
- 02Model vehicles, groups, events and stories as first-class structured content
- 03Expose everything over JSON:API for a headless, independently-evolving front end
- 04Build a component system so the UI stays consistent as it grows
- 05Gate quality with real tests and CI, not good intentions
- Per-vehicle garages with galleries, build logs and ride history
- Groups with discussions, a friend system, activity feed and notifications
- Events with RSVP, capacity tiers and public / member / group visibility
- Editorial "Stories" and a member profile system
- Single-Directory Component UI with a unified button system
- 100+ kernel tests, Vitest JS units, Playwright + axe end-to-end, GrumPHP pre-commit gate, GitHub Actions CI
Built to be driven, not patched
The WordPress rescue got Eternalgarage running again — but a community for people who keep things forever deserves a platform built the same way. So the long game was always a rebuild: take the same gearheads, the same garages and galleries and groups, and move them onto a stack you can develop hard for years without it fighting back. Where the old site had to be coaxed, v2 is built to be driven.
Eternalgarage v2 runs on Drupal 11, headless-ready from the first commit — every surface exposed over JSON:API, the UI assembled from Single-Directory Components so a piece of the interface is a self-contained thing you can reason about and test, not a fragment smeared across four files. The point of that architecture isn't novelty; it's that the next feature is days of work instead of a renovation. Built to be extended, not patched — which, after a rescue, is the whole moral of the story.

The test wall
The thing that separates a hobby build from a platform is whether you can change it on a Friday and trust it on a Monday. So before the features, there's a wall of tests: 100+ kernel tests across the custom modules, 32 Vitest unit tests over the front-end behaviours, and Playwright end-to-end runs that drive the real flows with axe-core checking accessibility on the way through. Nothing reaches the branch without passing a GrumPHP pre-commit gate — phpcs, phpstan, eslint and stylelint, plus branch-name and commit-message rules — and GitHub Actions runs the lot again on every pull request. None of it is taken on faith. The car metaphor earns its keep here: this one's built to be driven hard.
The podium
The heart of Eternalgarage is the vehicle page, and getting its shape right was the redesign that mattered most. The old model treated a vehicle and its photos as one flat thing; the rebuild made a vehicle a first-class entity that owns many galleries, a garage log of the work done to it, and a ride history of the milestones in its life — all converging on a single page where the specs, the builds and the story sit together. Internally we call it the podium: the place a machine is finally presented properly, not scattered across a feed.
AutoExpose is that idea taken all the way — Featured Builds, where a vehicle stands in full frame beside its spec sheet, engine, transmission, mileage and all, attributed to the gearhead who built it. That architecture — vehicle → many galleries, ride logs, history, the podium — I designed because I'm a user of the site as much as its engineer. The model underneath was the part that had to be right, and getting it right is what lets every surface above it sit together instead of scattering across a feed.

- Entity
- Vehicle → many galleries
- Tabs
- Gallery · Garage Log · History
- Accent
- #00779E
- Layout
- Mobile-first · 600/900/1200
One vehicle, many galleries, a full history — the model the old site couldn't express.
A garage that keeps everything, forever
Eternalgarage is for gearheads and collectors who love all things that move — and it means all of them. Cars and bikes, sure, but also planes and boats, scale and remote-control models, even game and console collections; the Groups page has a Scale Models club sitting next to a marque owners' club, and both belong. The promise in the name is the product: a place to build your gearhead history forever — what you have, what you had, and even what you spot out there — with photos, video and audio, and galleries that carry a build from bare metal to finished. It's a personal museum for everything you've ever loved that moves, and museums don't forget.
The social fabric
A collection is better with people around it, so the community is structured, not bolted on. Groups run on Drupal's Group module with real public and private access, and they form the way enthusiasts actually cluster — by make, by model, by region, by driving style — each with its own hero, member and thread counts, and a threaded forum with reactions and role badges underneath. It's a proper discussion space, not a comment box.
Around the groups runs the social layer: a Flag-based friend system with send/accept/reject and mutual-friend awareness, an activity feed of what your friends are building and posting, and notifications with an unread badge in the header and per-message read tracking. There are editorial Stories too — the platform's blog, for build features, event recaps and community spotlights — but the day-to-day pulse is the feed and the groups.
Events & meets, done properly
Meets, cruises, shows, track days — the reason a community ever leaves the screen — get treated as seriously as the vehicles. An event carries a date, location, cost and type, an attendee list, and an RSVP that actually understands capacity: run it unlimited, hard-cap it so it shows "Event full" once the limit's hit, or soft-cap it to let a few extra in, with existing RSVPers always able to cancel. Three visibility tiers decide who even sees it — public to everyone, member-only with a sign-up nudge for anonymous viewers, or private to a linked group. And the credits are polymorphic: an organiser, co-organisers, partners or sponsors can each be a registered user, a group, or a one-off manual entry, because real events don't fit one shape. Never miss a gathering in your area again — and never wrestle the form to publish one.
From rescue to rebuild
This is the other half of the Eternalgarage story. The WordPress rescue kept the lights on and the community together; the Drupal 11 rebuild is where that community gets a platform worthy of the word eternal — headless-ready, tested to the hilt, and modelled around how gearheads actually keep their history. Same people, same passion, a stack built to carry them for years. The rescue was the triage. This is the build.