Insurance

Building one design system for design, engineering and their AI tools

A design system built from day one for an AI-first insurance platform, so designers, engineers and the AI tools they ship with all work from the same source of truth.

Capabilities
Product designDesign systems
IndustryInsurance
Timeline2.5 months
PlatformsWeb (React, HTML/JS)

The client is a Series A insurance platform, kept undisclosed. This case study shares a selection of the system’s foundations, components, patterns and documentation.

The stakes

The team was building an AI-first product for insurance work, moving quickly with a small group of designers and engineers. AI tools were already part of how they designed and shipped. Designs were turned into code with AI assistance, and pull requests came from people and tools alike.

That speed had a cost. Without one agreed reference, every screen, prompt and pull request made its own decisions about colour, spacing, states and behaviour. AI tools made it worse: they fill gaps confidently, so a missing rule turns into a new variation rather than a question.

The product also had to suit insurance. People spend whole days in claims queues, policy records and dense tables. Statuses like escalated or pending need to read the same everywhere. AI suggestions sit next to decisions that affect real claims and real money.

The goal was a single source of truth that design and engineering could ship from, written so that AI tools could follow it as reliably as people.

Starting with references and an audit, then working towards one source of truth

I started outside the product. I looked at how well-built tools handle the jobs this platform does every day:

  • finding a record from a half-remembered ID;
  • working through long queues;
  • editing data in place;
  • putting an assistant next to the work without letting it take over.

Each reference earned its place by solving a problem the platform also had, not by how it looked.

Then I audited what already existed in design and code. The same kinds of data appeared again and again: policy and claim IDs, amounts, dates and statuses. They were styled differently from screen to screen. Colours had been picked per component, so near-duplicates had built up.

The audit decided what to keep, what to merge and what to rebuild. Anything already shipped and working was kept exactly as it was, so the system could replace what existed without the product visibly changing.

A sample of the colour audit: what each colour was used for, its value today, and the token it became. 22 colours were pinned exactly, so nothing on screen changed; a few one-off colours moved to the nearest step, with the difference shown.
A sample of the colour audit: what each colour was used for, its value today, and the token it became. 22 colours were pinned exactly, so nothing on screen changed; a few one-off colours moved to the nearest step, with the difference shown.

1. Building foundations for a dark, data-heavy product

The product is dark and dense, and people work in it for hours, so the foundations were designed dark-first. Colours already in the product were pinned to the new ramps, so nothing on screen changed.

Seven colour ramps, fifteen steps each, built in OKLCH so a step number means the same brightness in every colour. Graphite’s darkest steps sit only 2–3% apart, enough to separate canvas, sidebar, cards and menus without borders.
Seven colour ramps, fifteen steps each, built in OKLCH so a step number means the same brightness in every colour. Graphite’s darkest steps sit only 2–3% apart, enough to separate canvas, sidebar, cards and menus without borders.
Atlantic, the brand blue. Each swatch shows its contrast score, step and hex; the dot marks the key step used for primary actions and focus.
Atlantic, the brand blue. Each swatch shows its contrast score, step and hex; the dot marks the key step used for primary actions and focus.
Hover any colour for its token, hex and contrast on the card surface and on white. 31 semantic tokens sit on top of the ramps, and components only ever use those.
Chart colours from the same ramps. The diverging scale is quiet graphite on target and gets brighter the further a value strays. The eight category colours never reuse status or AI colours.
Hover any colour for its token, hex and contrast on the card surface and on white. 31 semantic tokens sit on top of the ramps, and components only ever use those. Chart colours from the same ramps. The diverging scale is quiet graphite on target and gets brighter the further a value strays. The eight category colours never reuse status or AI colours.
One app shell for every workspace screen: a 360px assistant panel, a 48px top bar, a page header and a content area on a 12-column grid. Only the content area scrolls.
One of five layout types, each defined by what the person came to do: chat, dashboard with navigation, dashboard with chat, summary and records. Records is for queues: a full-width table, with a drawer so people keep their place.
One app shell for every workspace screen: a 360px assistant panel, a 48px top bar, a page header and a content area on a 12-column grid. Only the content area scrolls. One of five layout types, each defined by what the person came to do: chat, dashboard with navigation, dashboard with chat, summary and records. Records is for queues: a full-width table, with a drawer so people keep their place.

2. Giving AI one colour, one place, and clear limits

In an AI-first product, the easiest mistake is letting AI show up everywhere. A sparkle on every feature soon means nothing, and the one label that matters, “a model wrote this”, gets ignored.

So AI has one colour, Orchid, used only for things a model produced: summaries, suggestions and AI actions. It is never used for decoration, gradients or ordinary features. If people learn that Orchid means AI, they can spot model output anywhere in the product at a glance.

AI also has a defined place in the layout. When the assistant works next to a task, it keeps a fixed width and the content gives up space instead, so the conversation never reflows. Next to it, no more than three cards sit side by side.

Dashboard with chat: work and the assistant side by side, as on claim intake. When the assistant changes something, the matching card highlights.
Dashboard with chat: work and the assistant side by side, as on claim intake. When the assistant changes something, the matching card highlights.

And AI has limits, written down. Exact matches always rank above an AI suggestion, so someone who types the right command gets it first. Nothing runs on the model’s interpretation without a confirmation step. A command like “close all auto claims” is never executed straight from a guess.

Command search moves from suggestions to slash commands to free text. When nothing matches exactly, “Ask AI” appears as a clearly marked option, below anything the system knows for certain.

3. Shaping components and patterns around how claims work gets done

I kept the component set small:

  • badge;
  • button, in two sizes;
  • a multi-select menu;
  • command search;
  • table.

Most of the work went into the patterns built from them, because that’s where insurance work actually happens.

Smart lookup is the Open Claim flow. One panel asks four questions in turn: which policy, what happened, when it happened, then a review before opening the claim.

It recognises policy and claim numbers as they’re typed, so a partial ID finds the right record. Each answer becomes a chip at the top, and tapping a chip goes back to that step.

The Open Claim flow: find the policy, choose what happened, set the date, review and open. The same panel answers each question in turn.
The Open Claim flow: find the policy, choose what happened, set the date, review and open. The same panel answers each question in turn.

Every lookup also needs a way out. “Missing? Send report” stays pinned to the bottom of the panel at every step. When a policy can’t be found, the person reports it from where they are, instead of abandoning the claim or working around the system.

A partial policy number finds Northwind Logistics. The loss type and date follow, and the claim is ready to open in a few keystrokes. An unknown policyholder returns no results, and Send Report is right there. The escape route never moves.

Tables come in four patterns, chosen by what someone needs to do with the data:

  • Fixed, for read-only history.
  • Actionable, for triage, with row actions like assign.
  • Editable, for adjusting reserves and assignments in place.
  • Bulk, for selecting many claims and reassigning or exporting them together.

Each pattern has three densities and documented loading, empty and error states.

Two of the four table patterns. Fixed is for read-only history: nothing is editable, and rows open details elsewhere. Bulk is for queues: checkboxes let people reassign or export many claims at once.
Two of the four table patterns. Fixed is for read-only history: nothing is editable, and rows open details elsewhere. Bulk is for queues: checkboxes let people reassign or export many claims at once.
Bulk: sort the queue, select claims, and the toolbar turns into actions for the selection. Editable: reserve amounts change in place. Each change is marked and counted until it’s saved, and anything that isn’t a number is flagged rather than read as zero.
Loading, empty and error, built into the table so every screen handles them the same way.
Loading, empty and error, built into the table so every screen handles them the same way.

Data cards follow the same structure everywhere: the metric and its period at the top, the numbers in the middle, and a one-line takeaway in plain words at the bottom.

Data cards. Left: resolution time, where switching the period updates the split, the bar and the takeaway together. Middle: a weekly scorecard above a list of teams. Right: a trend card with headline figures, a hover readout and a breakdown.

4. Writing documentation that people and AI tools can both follow

Documentation was where this system had to work hardest. An AI tool reads a docs page differently from a person. It doesn’t infer intent or ask a colleague; it does what the page says, and fills any gap with a guess.

So every component and pattern page follows the same structure:

  • overview, anatomy and when to use it;
  • the types of item it contains;
  • every state;
  • keyboard behaviour and accessibility rules;
  • do’s and don’ts;
  • AI anti-patterns;
  • React guidance, with the libraries to use and the effort each part takes;
  • the API, events and tokens.

Because the structure never changes, a designer, an engineer or an AI tool knows where to look before reading a word.

A pattern page in the docs. The same sections, in the same order, on every page.
A pattern page in the docs. The same sections, in the same order, on every page.

The AI anti-patterns are the part I’d most want other teams to copy. They name the specific ways a model goes wrong in each component:

  • Inventing commands that don’t exist.
  • Ranking a generated answer above the exact match someone typed.
  • Streaming results into a list while the person is choosing.
  • Quietly rewriting a search.
  • Presenting an unsourced answer with the same confidence as a verified record.

In insurance, that last one means a made-up claim number that looks real.

AI anti-patterns for command search, each with what goes wrong and what to do instead. They double as review criteria for anything an AI tool builds.
Do’s and don’ts for Smart lookup, in plain language with a working example of each.
Left: AI anti-patterns for command search, each with what goes wrong and what to do instead. They double as review criteria for anything an AI tool builds. Right: Do’s and don’ts for Smart lookup, in plain language with a working example of each.

The React guidance for each component lists the library to use for each part and how much work it is. That way an engineer, or an AI tool, doesn’t rebuild what a well-tested library already does.

The React stack for the table: which parts come from a library, which are custom, and how much effort each one takes.
The React stack for the table: which parts come from a library, which are custom, and how much effort each one takes.

5. Setting up production code across shadcn, React and HTML/JS

The system ships in three tiers:

  • shadcn base: simple components start from shadcn and take on the system’s tokens.
  • React: complex components and patterns with real state are built in React. That covers tables, lookup, menus and layouts.
  • HTML/JS: a framework-free layer of custom elements and helpers, such as the <search-palette> element, carries the same behaviour without a build step.

All three use the same tokens. A single script generates the colour ramps, overlays and semantic tokens as CSS variables for the code, and as structured data for charts, Figma variables and AI tools. Change a value once and it reaches every tier, every docs page and every contrast score.

One source of truth, three ways to ship. Tokens are generated once, and every tier and every docs page reads from the same files.
One source of truth, three ways to ship. Tokens are generated once, and every tier and every docs page reads from the same files.

Every pull request, whether written by a person or an AI tool, links the docs page it was built from and is reviewed against that page’s do’s, don’ts and AI anti-patterns before it merges.

The result is a system that designers, engineers and their AI tools all build from in the same way. The rules live in one place, so speed doesn’t cost consistency.

If you’re considering working together, I’d be happy to walk you through this project and other design system work relevant to your product, industry and tech stack.

Book a call

Work Showcase

More Case Studies

The Complexity Gap

You know the product and industry inside out. The people buying or using it bring different levels of knowledge and experience. The work is in making that complexity manageable throughout the product—helping beginners get started, supporting people as their needs grow, and giving experts the depth and control they need.

The Retention Gap

Getting someone to try a product is one thing. Becoming part of their day-to-day workflow is another. That comes down to how well it helps them do their job—how naturally it fits into their work, how much easier it makes important tasks, and whether it gives them a reason to keep using it.

The Growth Gap

As your business grows, the experience doesn’t always keep up.

Your brand, website and product evolve at different speeds. Some parts reflect the business you’ve become; others still belong to an earlier stage. Customers see one company, but the quality of what they see and use can leave them with very different impressions.

Your teams feel that disconnect too. Marketing works around a website it has outgrown. Product and engineering rebuild patterns that should be shared. Sales spends time explaining value the experience should already make clear.

Each workaround helps someone move forward. Together, they make growth harder to sustain.

Cursor Text