Free closed betaVersion 0.1.1macOS & Windowsproprietary licenceRead what to expect
All posts
8 min readCourtney Allen

To add a second design system, I had to find where the first one was hiding

Making the tool work beyond GOV.UK — NHS, departmental systems like HMRC, and a design system that belongs to no one — meant admitting GOV.UK was never logic in my code. It was data, hardwired in about ten places.

The tool started GOV.UK-only, and the obvious question came back almost immediately: can it do NHS? What about HMRC, or our departmental system? Fair questions. Answering them properly turned out to be one of the most clarifying pieces of work I've done on this — not because adding a design system is hard in the way you'd expect, but because of what it forced me to notice about the one I already had.

The design system was data pretending to be logic

Here's the thing I didn't fully appreciate until I went looking. Everything GOV.UK-specific the tool consumes was already data, not logic — a list of valid classes, the component documentation, the page shell, the html/body template, the validator's rules, the system prompt. None of that is clever code. It's reference material. The problem was that this reference material had quietly wired itself into about ten different places across the codebase, as hardcoded strings and constants and embedded files, until "GOV.UK" stopped looking like data and started looking like the way the app simply was.

So the real work of adding a second design system wasn't the second system at all. It was making the first one explicit: gathering that scattered, implicit bundle into one thing — a pack — that the app loads rather than assumes. A pack is just the honest name for what was always there: the stylesheet, the component corpus, the class allowlist, the shell, the page template, the validation rules, the generation prompt, and a declaration of which brand assets must never ship. GOV.UK became pack #1. Everything after it is a matter of writing another pack.

You can't add a second design system until you find where the first one is hiding. That excavation was the project.

NHS: pick the second system that proves the architecture

Once GOV.UK is just one pack, the question becomes which system to add next — and the instinct to reach for the most different, most impressive one is exactly wrong. I picked NHS.UK, and picked it because it's close to GOV.UK, not despite it.

NHS.UK frontend is a GOV.UK cousin — the same underlying structure, the same class-based markup, aimed at the same UK service-design community. That makes it the cheapest honest test of the abstraction: if my new pack machinery can render, generate, validate and export NHS pages as cleanly as GOV.UK ones, the abstraction is real. If I'd jumped to something exotic first, a failure could mean the exotic system or my architecture, and I'd learn nothing.

NHS also came with a useful complication: a font licensed only to NHS organisations, and a trademarked logo. Restricted assets the tool must never redistribute. That sounds like a problem until you notice it's the exact problem I'd already solved for GOV.UK, whose own font and crown are handled the same way — stripped from exports, guarded by tests. The second system reused the brand-safety machinery the first one forced me to build. Choosing a system that exercises your hardest existing constraint, rather than dodging it, is how you find out whether the constraint generalises.

HMRC and the departments: model the world as it is

The next request is always departmental — HMRC, MOJ, DfE, DWP, the Home Office. And the tidy instinct is to treat each as its own design system. That would be wrong, because it isn't true.

These aren't separate systems. They're extensions on top of GOV.UK — their styles load after GOV.UK's, they add their own classes to GOV.UK's components, and they keep the GOV.UK page furniture. HMRC is GOV.UK-plus, not GOV.UK-instead. So they get a different kind of pack: an overlay that appends to the GOV.UK base rather than replacing it. No new shell, no new page kinds, just extra components and classes and a short prompt addendum. Modelling HMRC as "a whole new system" would have been cleaner on a diagram and false in reality — and the tool would have generated worse pages for the effort. Match the model to the world, not to the taxonomy you wish the world had.

Abstract: a system that belongs to no one

The most interesting addition isn't a real-world design system at all. It's one I'm building from scratch, called Abstract, and it exists to solve a problem the others can't.

Not every prototype should look like it belongs to a government. If you're testing a service pattern, or teaching, or working somewhere with no house style yet, generating a GOV.UK-branded page quietly asserts something false: that the Crown owns this service. Abstract is a complete, sector-neutral system for prototyping a service without implying that any government body, hospital, department, or company owns it. Its furniture carries a service name and nothing else — no parent mark — and every page wears a permanent "Prototype — not a real service" strip in preview, share and export.

The decision that matters here is what Abstract isn't. It is not "GOV.UK with the crown taken off." It is not a theme, an overlay, or unbranded anything. And that distinction is the whole point: if you make an institution's design system your neutral default, you've smuggled that institution's assumptions in as the hidden specification — its components, its journey grammar, its idea of what a service is. Neutral has to be designed, not subtracted. So Abstract has its own identity, its own interaction language (organised around what a user is trying to do — explain, ask, decide, confirm, recover — rather than clones of GOV.UK components), its own accessibility envelope, and its own validation. It's still experimental, and deliberately hidden behind a readiness gate: it stays out of the normal picker until it has passed real keyboard, screen-reader, contrast, reflow and comprehension testing. A "neutral" system that isn't genuinely accessible would be worse than none.

Two decisions that fell out — and why they're familiar

Two smaller decisions came with the territory, and both are the same shape as choices I've made elsewhere in the tool.

The design system is owned by the page, not the project. You can have NHS pages and GOV.UK pages in the same project; the active page is the single source of truth for how everything renders and validates. But a mixed-system project refuses to produce a single-kit export, rather than silently converting every page through one adapter. That's the same instinct as the refinement rebuild I wrote about earlier: never quietly do the destructive thing. Give the honest error, not the mangled output.

An un-evaluated pack says "quality unknown." Every quality number I've published — the pass rates, the prompt tuning — was measured on GOV.UK. A new pack invalidates all of it. So a new pack does not get to inherit GOV.UK's scores and wear a confidence it hasn't earned. It falls back to the fullest prompt, shows "not yet evaluated," and carries a visible caveat until it's actually re-measured. Same discipline as everything else here: don't claim quality you haven't checked.

The constraint that chose the candidates

One technical fact quietly decided which systems are even eligible, and it's worth sharing because it surprised me. The offline preview is a sandboxed iframe, and the safety net that stops the model inventing markup is a class allowlist. Both of those assume a system built from CSS classes on plain HTML. That rules out the entire modern wave of design systems shipped as web components — <x-tag> markup renders as a blank box in a sandboxed frame with no JavaScript hydration, and a class allowlist has nothing to check. Class-based CSS systems are becoming the minority, but they're the only ones this architecture can honestly support. The constraint chose the candidates before taste got a vote.

Why any of this matters

Underneath the engineering, this is about a quiet assumption I didn't want to bake in. GOV.UK is an excellent design system. It is not "the way services look" — it's one institution's house style, and a very good one. A tool that can only produce GOV.UK pages gently teaches everyone who uses it that government-shaped is the default shape of a service.

Making the tool multi-system, and building a genuinely neutral option that belongs to no one, is a small stand against that. And the way I got there is the same way I've built the rest of it: make the implicit explicit, never convert silently, don't claim quality you haven't measured, and respect the brands you don't own.

Prompt to Page is an independent project by Courtney Allen. It is not affiliated with, endorsed by, or connected to the Government Digital Service, the NHS, the Crown, or any UK government body. "GOV.UK", "NHS.UK" and the design systems named here are referenced descriptively; restricted fonts and logos are never redistributed by the tool.

Try Prompt to Page.

Free during the closed beta. Runs entirely on your machine.