Craft · Core Competency

Design Systems that Engineers Actually Use

I have built three design systems from scratch and stayed to own them, which is where you find out whether a system holds. One runs across iOS, Android and web for a suite of five small-business products. One wears a different bank’s brand per client without a code change. One lives in production code inside an engineering studio, with a build that fails on the first new value that reaches past its tokens. Where a system had to carry other people’s brands, a brand was never a second system: it was a value set over the same keys the components read.

Specialization
Tokens, Theming & GovernancePrimitive → semantic → theme; modes and brands as value sets; gates in the build
Platforms Unified
Web, iOS, AndroidReact, Vue, Web Components; native iOS and Android conventions
Core Tooling
Figma Variables, Tokens Studio, StorybookCSS custom properties, a Figma plugin I wrote, npm build gates
Brand Touchpoints
Product, Console, Marketing SiteOne UI kit across product, console and hardware-facing screens; a marketing site shipped in Webflow
3 Scale
Systems Built from Scratch, Then Owned
6 mo → 2 wks Velocity
Bank Onboarding Once Styling Became a Theme Layer (upSWOT)
387 System
Storybook Stories Behind the Build Gates (IBWT)
1 Governance
New Hardcoded Colour Is Enough to Fail the Build (IBWT)
01 · Evidence

Where this showed up in real products

SaldoAppsMulti-Platform Suite
One Decision, Three Native Expressions
A token-based system for five small-business products on iOS, Android and web — 500K+ users by the stores’ own public figures. Colour, type, spacing, elevation and motion are decided once and resolved per platform, so Apple HIG, Material and web conventions express the same decision rather than three separate decision sets.
Read the case →
upSWOTFintech Multi-Brand
A Bank’s Brand as a Value Set, Not a Fork
Replaced per-bank styling with three token layers — Core, Semantic, and one bank’s theme — shipped as web components inside the banks’ own online banking. A component may only reference the semantic layer, so re-theming stopped being a code change and onboarding went from six months to two weeks. Each component carried a written boundary: what a bank may change, what it may not.
Read the case →
IBWTCode-First, Figma Downstream
The System Is a Step in the Build
A hand-built kit on shadcn-style semantic tokens, with no component-library dependency. Components are written in code first, published to Storybook with their states, then pushed into Figma by a plugin I wrote — variant sets assembled from Prop=Value names, fills bound to variables rather than hex, every batch a single undo step. Three gates sit behind one command, two of them in CI, and the middle one fails on the first new hardcoded colour.
Read the case →
zhovnir.comOne Source, Two Tiers
The Site You Are Reading Runs on One Token Dictionary
The public tier and the password-protected one share a single palette source: light, system-dark and explicit-dark are rendered from one dictionary, the private tier’s ground and seal colours included, and the main contrast pairs are documented against WCAG AA in the source. The build stops on any font size, weight or spacing that is not on the scale.
Read the case →
02 · Method

How I actually do it

STEP 01
3-Tier Token Taxonomy
Global primitives (values) → Semantic aliases (intent, e.g. action.primary.bg) → Component overrides. A component may only reference the middle layer, so a mode, a brand or a white-label client changes values, never components.
STEP 02
One Dictionary, Many Resolutions
A mode or a brand is a value set over the same keys, never a second file. At IBWT light and dark are one Figma collection resolved twice, every key carrying the same variable id in both. At upSWOT a bank supplies values into the third layer and never touches the first two. At SaldoApps the decision is made once and each platform expresses it in its own conventions. Where the pipe is not automated I say so: the colour tokens at IBWT went from Figma to the repository by hand, and the full version says as much.
STEP 03
Living Code as Source of Truth
Components live in Storybook and production repos. Designers and engineers review the same living interactive states, keyboard focus, and edge-case permutations — and Figma is the record of what was decided, not the place it is enforced.
STEP 04
Governance the Build Enforces
Usage rules written beside the components: when to reach for one, when not to, what each state means. Then something that can fail. At IBWT the legacy violations are frozen at a per-file baseline and the count may never go up — zero is never required, growth is never allowed. At SaldoApps it was a recurring cross-platform session where per-app divergence became a documented decision rather than a thing somebody noticed later in review.
STEP 05
Product and Brand from One Source
Where a brand touchpoint is in the product’s hands, it is a theme over the product’s tokens, not a parallel system with its own hex values. That is how upSWOT could wear a different bank per client, how light and dark at IBWT keep identical geometry and differ only in values, and how this site renders its public and private tiers from one dictionary. When I inherit a brand, I match it exactly and extend it only where the interface has no pattern for what is needed — on the 2026 assignment the agent channel reused a colour already in the product’s palette, and the one addition was named as one. What this page does not show is an identity built from nothing — a mark, a type system, a voice. My brand work has run the other way, from an existing identity into the product.
03 · Stack

Tools, in service of the above

Token Architecture
W3C design tokensFigma Variables & ModesTokens StudioCSS custom properties
Code & Components
ReactVueshadcn-style kitStorybookWeb Components
Build Gates & Tooling
npm run verify: build · tokens · compositionFigma plugin + local relayClaude CodeCodexCursor
Figma Practice
Components & VariantsAuto-layoutVariables & ModesDev ModePlugin API
The full version

What the complete version of this page adds

  • The two Figma files read as files: 202 component sets and 387 variables under four modes in one; 660 keys per mode with the same variable ids in the other — and the frontmatter admitting the colour went over by hand
  • The three build gates with their real output: 320 baselined violations, 56 surfaces against 21 patterns, and the two limits the page states about them
  • The Storybook: 387 stories across 78 files, where a business rule is a named state
  • The multi-brand theming that took bank onboarding from six months to two weeks, with the per-component boundary tables

It lives at alex.zhovnir.com/craft/design-systems, behind a password — client agreements, not theatre. Send me a note and I’ll open it: alex@zhovnir.com.