Case study 02 · Platforms and design systems
A design system for 30+ brands, and a client who came back
I built about a hundred components for 30+ white-label brands. Three years later the client brought me back when their Android app would no longer install.
~100 components carrying 30+ white labels
built solo in two months
The same client, back after three years, on an unrelated discipline
The story in 5 steps
Stack
- JavaScript
- CSS
- SCSS
- design tokens
- Figma
- npm
- Android
01 · Context
The client's software turns a photograph of a floor plan into a cost estimate and a phased work plan, and the client sells it under other companies' brands.
The client's software turns a photograph of a floor plan into a cost estimate and a phased work plan, and the client sells it under other companies' brands.
In 2022 I built their central design system alone, in two months. Three years later they brought me back for something entirely different: their Android app could no longer be installed on current devices.
02 · Could not change
In 2022 the product was white-label: more than thirty construction companies each got their own colors, logos and imagery.
In 2022 the product was white-label: more than thirty construction companies each got their own colors, logos and imagery. With that many brands, the product could not work without design tokens. Implemented naively, a hundred components for thirty brands would mean three thousand variants that nobody would maintain.
In 2025 the app could no longer be installed on current Android versions, because its libraries had been abandoned and the APIs it relied on were deprecated. An app in that state disappears without an error: new users simply cannot install it, and existing users lose it the moment they change phones. At the same time, a large share of the phones on a construction site are several years old, so the fix could not leave them behind.
03 · What we did
The design system (2022, alone). I exported the design tokens from Figma into JSON, generated SCSS from them and built about a hundred components on top, organized by size, type and kind.
The design system (2022, alone). I exported the design tokens from Figma into JSON, generated SCSS from them and built about a hundred components on top, organized by size, type and kind. The library is versioned and distributed as a package, with its own documentation.
No component knows its own color, only the name of a token. A new client is a new set of values, not new code, and that is what keeps thirty brands maintainable.
I made the library framework-agnostic on purpose, because two different products use it. Tied to one framework, it would force every consumer outside that framework to build its own implementation of the same design, which is the problem a design system exists to solve.
With a hundred components, the organization by size, type and kind has a practical purpose. Without consistent organization, a library that size turns into a search through file names: a developer who does not find what they need in thirty seconds concludes it does not exist and writes their own CSS, and the design system ends up bypassed without anyone deciding to drop it.
The Android app (2025, three of us). We got the app running again on both current and older devices. We brought camera permissions into compliance after a store policy change, upgraded the dependencies used for viewing documents and moved work off the main thread.
04 · Result
~100 components carrying 30+ white labels , built solo in two months
- ~100 components carrying 30+ white labels, built solo in two months
- A versioned package with documentation, used by two products
- The Android app installs and runs again on both new and old devices
- The same client, back after three years, on an unrelated discipline
05 · Differently
The documentation was custom-made, without a standard tool, so it became one more thing to maintain and one more thing every new developer had to learn.
The documentation was custom-made, without a standard tool, so it became one more thing to maintain and one more thing every new developer had to learn. For a library that thirty brands depend on, I would choose a standard documentation tool, even though it is the boring option.
Related services
The services that draw on this work.
- Web developmentMulti-tenant and white-label SaaSA design system of about a hundred components serving more than thirty white-label brands, each brand a set of token values. Three years later the same client came back to have their Android app rescued.
- How we can workA developer in your teamA design system for a white-label product, and three years later the same client asked us back to fix their Android app.
- How we can workApp takeover and launchA client came back after three years because their Android app could no longer be installed on current devices. It now runs on new and older phones alike.
- MobileReact Native developmentAn Android app that could no longer be installed on current phones. We got it running on both current and older devices for a client who came back three years after the first engagement.
- Design systemsDesign system and component libraryA library of about a hundred components, built in two months for a white-label construction product with more than thirty brands. It works with any framework and is organized by size, type and kind, so developers can find what they need.
- Design systemsDesign tokens and multi-brand themingA white-label product for construction companies, sold under more than thirty brands, each with its own colors, logos and imagery. About a hundred components take all of that from tokens that were exported from Figma to JSON and generated into SCSS. One developer built the library in two months.
- Design systemsFigma to codeA thirty-brand library in 2022, where a plugin exported the tokens from Figma to JSON and the JSON was generated into SCSS. It was automated, but it worked in one direction only and easily fell behind the design file.
Case study 02
Working on a similar problem? We reply within one business day.
The first call takes 30 minutes, and you’re under no obligation.