Pekka Toppi

Five design systems, five different answers

Consulting, Qvantel, Alma · 2016–present · Creator or owner on all five
Problem
A design system is usually treated as a house style: one set of components, applied everywhere. Five products across five domains showed me that's the wrong model.
My contribution
Built or owned five systems. Two on MUI, one from scratch at enterprise scale, three as a consultant. Currently design system owner at Alma.
What changed
Each system solved a different problem, so each looks and behaves differently. The consistent part is the method, not the output.

Role: Creator or owner on all five. Currently design system owner for a dealer management platform, working alongside the lead front-end engineer.

Span: Enterprise telecom, three consulting engagements, one current platform.

Technologies: Two built on Material UI against React MUI front ends. One current system maintained in two forms: an annotated Figma library, and a machine-readable version AI tooling builds against directly.

A design system is not a house style. It's an answer to a specific product's problem, and the answers should look different.

The argument

Most design system work is described in terms of maturity: how many components, how well documented, how widely adopted. Useful, but it skips the interesting question, which is what the system is for in this particular product.

Five systems, five genuinely different constraints, five different shapes. The method carried over. The output didn't.

1 · Investment project management — density without dullness

The constraint. Enormous data density, and a client who needed the product to look modern and striking rather than like a spreadsheet with ambitions.

The answer. An extremely tight system that used relatively heavy contrast between elements to hold structure. Contrast did the work that whitespace usually does, so views could stay dense without turning into an undifferentiated grid.

What it taught me. Density and visual quality are not opposed. They're opposed if you only have spacing to separate things with.

2 · Healthcare triage simulation — a system designed to recede

The constraint. The product generated simulations, and those simulations were the reason anyone opened it. The interface around them had to feel clinical and stay out of the way.

The answer. A deliberately recessive system. We also tuned the simulation visuals to sit inside the design language rather than beside it, but always so the simulation held the view.

What it taught me. Sometimes a design system's job is to be unnoticeable. That's harder than making one that announces itself, and it's a different success criterion entirely.

3 · Customer analytics — patterns for reading data

The constraint. An AI-driven customer communications analytics product, dashboard-heavy, where most of the real design problem was data visualisation rather than layout.

The answer. Built on Material UI, with the majority of the system work going into visualisation patterns: how findings are represented, compared, and made scannable at different levels of detail.

What it taught me. In a data product, the visualisation patterns are the design system. Buttons and forms are the easy part.

4 · Telecom BSS — a system as a quality argument

The constraint. A 1000-person company, around 12 core products, and no shared system. I built the company's first.

The answer. Getting it resourced took two arguments. For the business: our rarely-used specialist tools looking as good as our flagships would say something real about us, that nothing here is treated as trivial. For engineering: the system removed pixel-level round trips they disliked, and let them push their own ideas without booking a designer first, because anything they built would look credible enough to show a PO immediately.

What happened. Adopted across all new products, and still in place a decade later.

What it taught me. Adoption is a separate discipline from construction, and the arguments that work are the ones aimed at what each group already wants.

5 · Dealer management — a system built for two readers

The constraint. Users migrating from legacy systems where a spare white pixel was considered waste, a React MUI front end, and AI tooling that needed to produce shippable work rather than plausible-looking work.

The answer. Built on Material UI, customised heavily. Spacing tightened toward efficiency without losing legibility — a decision I've had to justify more than once. MUI's two-colour model overloaded to carry three, adding brand alongside primary and secondary. Dynamic components for core entities: a vehicle, customer or trade case renders by context, from full focus page down to cards, list rows and dropdown items, so one entity has one definition across every surface.

And the system exists twice: an annotated Figma library, and a machine-readable version that Claude Design and Claude Code build against directly, with skills mapping it to the front-end component library.

What it taught me. Once the system is machine-readable, the tools change places. Figma stopped being where I explore and became where decisions are documented and versioned. Exploration happens through AI-assisted channels; Figma holds the resolved outcome.

How I run one

The method matured over the five, and the current system is the most controlled. But the consulting systems taught me the more useful lesson, because I was never going to be their long-term owner.

A system that only lives in its author's head dies when the author leaves. On a consulting contract that isn't a risk, it's a certainty. So the work wasn't only building the system — it was making sure the engineers and founders I built it with understood why it did what it did. Without that shared reasoning, the system drifts the moment I'm out of the room and every new case gets solved from scratch.

That pushed everything toward explaining rather than specifying. On the current system, where I am the long-term owner, I've kept the same instinct and taken it further.

Patterns are documented as features. Each core pattern has a PRD explaining the business reason behind it, plus view and flow documents holding the detail. Not a component with a name, but a decision with a rationale.

Every change is logged, including the ones we don't make. A decision log records what changed and what we deliberately left alone, so the system has a history rather than just a current state.

Contribution is low-hierarchy. If an engineer or someone in QA hits a gap, we work it through together with the front-end lead, log the decision, then version the library and the supporting documents.

Built with engineering, not handed to it. The current system is built alongside our lead front-end engineer, on the component library the product actually uses.

What changed

The systems don't look alike, and that's the point. A recessive clinical system and a high-contrast dense one are not the same system with different colours. Each answered its own product.

One of them outlived its company's memory of building it. Qvantel's is still in place a decade on.

The current system changed how I work. Machine-readable output means AI-generated work arrives using the same components, spacing and tokens an engineer would reach for — the difference between a prototype and a demo.

What I'd do differently

For a long time I treated the system as the deliverable and the explaining as the follow-up. It's the other way round. What I'd want now, on any system I build, is that the people I built it with could defend its decisions without me in the room.

Building the system is the smaller half.

I'm open to head, lead, and staff product design roles.