// Labour Against the Assisted Dying Bill
A campaign site where every word had to be signed off
Revisions turned round in minutes while dozens of people signed off, then converted to a custom WordPress theme the campaign runs themselves, with no licence to renew.
Visit the live site// summary
A campaign site for a network of Labour MPs, peers and party members. Built first in Astro, because with that many people reviewing the wording a change had to be live minutes after it was agreed, then converted to a hand-built WordPress theme so the campaign could take it over. The first site I built without Elementor, and the reason I no longer start there.

// drag or flick it · visit labouragainsttheassisteddyingbill.org ↗
What the site is
A campaign site for a network of Labour MPs, peers, campaigners and party members opposing the Terminally Ill Adults (End of Life) Bill. It sets out the network’s position, carries statements from individual MPs in their own words, breaks the objections into six separate issues, and hosts a short captioned film of MPs speaking in the Commons.
I built it white label, so the site carries no developer credit and the campaign’s own name is the only one on it. What follows is about how it was built rather than what it argues.
The constraint that shaped everything
The hard part wasn’t the build. It was how many people had to agree on it.
Copy for a site like this doesn’t get written once and shipped. It goes round MPs and their offices, it’s weighed by people who will be held to every line of it in public, and it comes back with corrections from several directions at once. Every claim has to be right and every attribution has to be right, and nothing goes live until the people whose names are on it have said so. On a normal project you get a round of feedback a week. Here it was several a day, often on the same paragraph, from people who hadn’t spoken to each other.
That put an unusual requirement on the site. The gap between “we’ve agreed the new wording” and “it’s live and I can see it” had to be close to nothing.
Building it in Astro first
So I built it as a static site in Astro, which isn’t what you’d normally reach for on a project that has to end up in a content management system.
The reason is turnaround. A static site rebuilds and deploys in seconds, so a wording change agreed on a call was on the preview link before the call ended. Across a month of constant revision that difference compounds into something else entirely: the campaign was never waiting on me, and I was never batching changes up to make them worth doing. When someone asked “can we see it with that paragraph removed”, the answer was yes, now, rather than a description of what it would look like.
Why the WordPress build has no page builder
The other requirement was fixed from the start. At launch the campaign had to be able to edit the site and take it over completely, which ruled out leaving it static. I looked at a few content platforms and settled on WordPress as the best fit for the people who’d be using it.
Normally that would have meant WordPress and Elementor, which is how I built for years. This is the first site where I didn’t, and it’s the reason I no longer start there.
Elementor earned its place by being a block editor I could hand to a client who’d then get on with it. That’s got harder. The product has moved towards subscription tiers and AI credits, and the editing experience has drifted away from the thing I actually wanted it for, which was a handover a non-technical person doesn’t find intimidating. There’s a commercial edge too: it’s an annual licence per site. When a client hosts their own site, as this one did, that becomes a renewal to explain and bill on, and I’d rather build something that doesn’t have one.
So I worked out how to bring the Astro build across into a hand-built WordPress theme instead. Not just technically editable, but comfortable to edit: the editing surface is shaped around what this campaign actually needed to change. Nothing to license, nothing to renew, and no third party deciding next year what the admin screen looks like.
I held that conversion back as late as I could, so it happened once most of the wording had been signed off. More revisions arrived afterwards, as they always do. Those were still perfectly possible, just slower than they’d been in Astro, which is the trade you make for handing over the keys.
Structured content, not duplicated pages
Inside WordPress the parts of the site that grow are custom post types rather than pages: issues, news and events.

Six issues, each its own entry rather than six hand-built pages. Adding a seventh is filling in a form, not copying a page and remembering to change everything in it.
It matters more than it sounds. The common approach is to hard-code each item into a page, which leaves whoever inherits the site duplicating a page, editing sections, deleting the bits that don’t apply and hoping they didn’t miss one. Instead there’s a form. An event takes a name, a place, a date and the details, and it then appears everywhere on the site it should appear. When the date passes it takes itself down, which is why the events section currently says there’s nothing planned rather than listing something that already happened.

The empty state is the part worth pointing at. Nobody had to remember to take last month’s event down, and the page doesn’t look broken without one.
Content management belongs in one place, with one way to do each thing. That’s what makes a site survivable by the next person who logs into it.
Accessibility as part of the argument
The campaign’s own accessibility statement makes the point better than I can: a campaign arguing that disabled people aren’t adequately protected can’t publish a website that excludes them.
So the site targets WCAG 2.2 AA, and the film is captioned throughout so it can be watched with the sound off, with a downloadable MP4 for anyone whose browser won’t play it.

The video is self-hosted rather than embedded from a third party, so watching it doesn’t hand a visitor’s attention to somebody else’s tracking. On a site read by people who’d rather not be logged doing so, that’s not a small detail.
When something goes wrong after launch
Launch is rarely the end of it.
This site worked everywhere, with one exception: it wouldn’t load from inside Parliament. Certificates are something I’ve set up on a thousand sites, usually with Let’s Encrypt, and there was nothing wrong with this one anywhere else in the world.
I worked through it from every angle. As a long shot we moved to a premium GlobalSign certificate to rule the certificate out completely. That didn’t fix it either, which was itself the useful result: it pointed away from the site and towards the network it was being opened on. With that established it went to the people who could actually act on it, and it was picked up and diagnosed by parliamentary IT.
None of that was billable. Not the days of diagnosis, not the research, not drafting the explanations that went out across the network. The only thing that changed hands was the cost of the certificate itself, because that’s a real invoice from somebody else.
That isn’t generosity, it’s the business model. If a site I built doesn’t work properly, finishing the job is the job. Clients who get a surprise invoice after launch learn to stop telling their developer about problems, and that’s how small problems turn into big ones. I’d rather be the person you ring straight away.
// keep reading
Other case studies

Rebuilding a fashion brand with 95M monthly reach on Astro, Payload and Cloudflare
Culted (RAD Media Group)
A 95M-reach fashion platform rebuilt from WordPress in just over a month: fast for a global audience, publishing daily, and serving ad campaigns for the biggest fashion brands in the world. Astro, Payload and Cloudflare underneath.
- Astro
- Payload CMS
- Cloudflare
- Cloudflare D1 & R2
- +6 more

An online booking system for a Dartmoor dog field
Mutts on the Moor
Customers book a time slot, pay online and get a fresh gate code by email the moment payment clears, with no manual work for the owner.
- WordPress
- Elementor Pro
- Custom PHP
- MotoPress Appointments
- +4 more
