A design system that ships to production, not to Figma

Head of Product Design

Design-led infrastructure, with an engineering partner. Hamburg / Berlin

Most design systems are Figma libraries; engineers copy the values into their own platforms by hand. I built a deployed service instead: a Git repo, Style Dictionary, and automated sync, so a token change updates every consuming platform in seconds. Figma is one consumer, not the source.

The problem

Change the radius on a card at Bibel TV, and that isn't a five-minute edit. Development sits with an external agency, so it's an estimate in hours and a slot in a sprint. Small changes were not small.

That cost existed because each of the four platforms — iOS, Android, web, connected TV — kept its own copy of every design decision: Kotlin values, Swift constants, CSS variables, Figma styles. Change a color in one place and four teams had to catch it in four others. In practice, three fell behind every time, and the platforms drifted apart. The design system was a Figma library people referenced, with nothing enforcing that the reference stayed true.

There was also a budget reality underneath all of it: no platform-engineering team to own design infrastructure. If the Head of Design didn't build it, nobody would.

The architecture

The other options each failed somewhere. A Figma-only library breaks at scale through copy-paste drift. Per-platform token sets give flexibility but make every change an N-times job. A Storybook system handles web and ignores native. Manual sync holds only as long as one person stays perfectly consistent.

Diagram: one token repository is built by Style Dictionary in CI and served by a token API. Android reads the API on launch, the web build pulls the same tokens into Storybook, and Figma syncs through a plugin; iOS and connected TV are drawn dashed as the next implementation step. View full size ↗
Fig. 01

Android, web and Figma read the same build today. iOS and connected TV are dashed: reaching them is an implementation task, not a system change.

Read the reasoning behind this decision

What I built is a Git-based token repository that builds to a live API the platforms consume directly.

One Git repo holds the tokens, versioned and reviewed like any other code. A four-tier hierarchy keeps them sane, running from primitives (OKLCH colors, spacing, type) through semantic and component to the page and view tokens a product team works in. Style Dictionary builds platform-specific outputs from that single definition. An automation layer distributes every committed change to the platform endpoints and the Figma plugin.

The top two tiers are the part a purist would question. Component and page-or-view tokens introduce no new values at all; they alias downward to semantic and primitives. That redundancy is deliberate. Each is a place the company can reach in and change a component's spacing or type size, or border radius across the board, without going through the agency that owns the code. Read as a taxonomy it is redundant. Read as a control surface it is the whole point, and it is the first step toward server-driven UI for the streaming section of the app.

The agency backed it, which I did not take for granted. The architecture takes billable change work away from them and they were enthusiastic anyway.

What changed

Figma with the BibelTV Design Tools plugin open: a 'Sync Tokens to Figma' button with the token API as source, beside the primitive color ramps (blue, brand, green, neutral, orange, purple, red) it wrote into the file, and a page list of components from buttons and cards to heroes. View full size ↗
Fig. 02

Figma as a consumer, not the source: the plugin pulls the primitives from the token API into the design file, and every component page binds to them.

One token on two platforms. Left: the play button on an episode page of the Android app, version 6.0.7, dark on a light page and white on a dark page. Middle: the token API entries component.light.button.primary (background #252F35, text #EBF0F2) and component.dark.button.primary (background #FFFFFF, text #252F35). Right: the same button rendered in the web Storybook from the live token API, in both themes. View full size ↗
Fig. 03

One token, two platforms. The shipped Android app loads this payload at launch, and Storybook reads the live token API. On both, the primary button's fill and label match the token to the hex, in light and in dark.

Sync
Four teams hand-updating tokens; platforms drifting apart One commit in the token repo, and every consuming platform updates without anyone touching code
Reach
A platform-agnostic token API: Android, web and Figma already build on it, and reaching iOS or connected TV is an implementation task, not a system change
Structure
Four-tier token hierarchy: consistency enforced by structure, not by coordination

Want to hear more?

  • Want to know how I got the agency that bills for every UI tweak to back a system built to make most of those tweaks free, or why two of the four token tiers were built to add nothing at all?
Get in touch