Diletta design systemDesign system · mobile and web9 min read
A new brand in 3 days, without touching a component.
Two live apps and a web dashboard, each with its own brand, on one design system, and a written way to change that system
- Client
- Diletta Solutions
- Period
- 2021 to now
- Role
- System architecture and code
- Scope
- 2 live apps · web · 51 pieces
System in production. Product Designer at Diletta Solutions, a software company in Campinas, Brazil, from November 2021 to today, Senior since 2025.
- 2
- live products with different brands on the same design system.A third is being built.
- 55
- colors are all a new product declares to get its own brand.No component changes.
- 2
- platforms on one source: mobile in Flutter and web in web components, with 51 pieces.
- 3 days
- for Conta Bold to get its own brand on the system, in July 2026.It used to take about six weeks.
00 File
| Product | The design system behind Diletta's apps |
| Products on it | CPF Seguro, which protects a person against fraud in their name and was the system's base, and Conta Bold, a digital bank · both live · and, since October, the Flash Enterprise web dashboard |
| Role | Product Designer, Senior since 2025 · Diletta Solutions · in Figma, the components were split among the designers; the idea, the architecture and the execution of the system were mine |
| Platform | Flutter, iOS and Android · web, as web components |
| Tools | Figma, Flutter, web components, Git, Python, Claude Code |
| Scope | everything beyond my share of the Figma components: specs and contracts, colors, code package, versions, catalog, checks and governance |
| State on 23 Sep 2026 | version 1.0.2, with 302 published versions |
| Period | November 2021 to today |
01 Summary
Problem. Apps with different brands, two live and a third on the way, and a small team. The usual path is to copy the component library into each one, and then a fix in one copy never reaches the others.
Role and team. In Figma, the components were split among the designers; the idea, the architecture and the execution of the system were mine. That covers contracts, colors, code package, versions, catalog, checks and governance. Each app has its own engineering team, which decides when to adopt a new version.
The decision. Take color out of the component. The brand became a list of 55 colors the product declares, and the component only knows its purpose: background, text, error.
Result. When Conta Bold joined the system, in July 2026, it took 3 days from the palette survey to the first build. On the old path, copying the library, my estimate was six weeks. In July one app was 176 versions behind. Today CPF Seguro is on the current version and Conta Bold is 5 behind.
Status. Live in both apps, version 1.0.2 on 23 Sep 2026. Since October it also runs on the web, in the Flash Enterprise dashboard.
02 Context
Diletta sells software to other businesses and runs its own products, with different names, brands and audiences, served by the same design and front-end team. The question was how to make each one look like its own company without keeping one library per product. The system was born from CPF Seguro. Conta Bold joined in July 2026 as the second product, and ciX, a government product and the third in line, is in progress.
03 Constraint
Small team. There weren't enough people to maintain one system per product, and no way to stop the products to rebuild the base.
The app decides when it updates. The system arrives as a versioned dependency. If upgrading breaks a screen, nobody upgrades. The consumer holds a veto, and I think that's healthy.
Real brands. Each product needs its own identity, and shifting the hue of the same blue doesn't cut it.
I ask and I judge. I own the system and I design inside one of the products that use it. Several decisions below move that judgment out of my memory and into a file.
04 The problem in numbers
Before, nobody could say whether a component was done. Done in code wasn't done in Figma, and neither matched the documentation.
The audit I ran in July measured the cost of that in one product: 176 versions published since the last one that app had adopted, with not one line written about what changed. Nobody updates a dependency without knowing what's inside. The system had stopped reaching the products because the record was missing.
05 What existed before
In 2022 I solved the same problem by hand in Diletta Pay, the white-label platform Diletta sells to banks: twelve palettes, which are twelve possible brand colors in an application example, and twenty-four screens drawn one by one.
The usual way to handle brand is theming: the component knows the colors and the values swap through configuration. It works while the brands look alike. Once they drift apart, someone copies the component to change it, and the copy never comes back. So I changed the question to "how do I make the component never need to know the color".
06 Decisions
D1 · The brand is a list of colors, and that's all
The product declares 55 required colors and 7 optional ones. From them the system derives 59 purpose colors, in both modes: background, text, error, success, raised surface. No component knows a specific color, only what it is for.
Why: while the color lives in the component, every new brand touches the component. With the color outside, a new brand means filling in a form.
Measured: between one product and another, those 55 colors change. No change in components or in tests.
D2 · Three layers, and each one declares only what is its own
Two layers were enough for two products: the design system on top, the product below. The third appeared when Conta Bold became the base of a family of products. The neutral base and Conta Bold's identity lived in the same package, so every new product in the family was born looking like Conta Bold.
The middle layer declares structure and composition. It never declares a value only the brand decides, such as a color, a text size, an image or a font. The first check I wrote for this rule searched the code for the brand's name and came back at zero, with thirteen Conta Bold text sizes sitting inside the base. A text size is a number and carries no name. Now the check looks for both.
What I gave up: a simpler design. Two layers were easier to explain, and the third exists because the business asked for it.
D3 · What the product forgets to declare, a report shows
If a product doesn't declare a color, it inherits the system's. The screen ends up wrong and nobody notices. So a report lists, per product, what was declared and what was inherited without being declared.
Why: the model is only safe if the omission shows up before someone opens the wrong screen.
D4 · Open components instead of configuration options
When a product needs a component the system doesn't have, it builds it from the system's parts, which are public. A surface splits into top, content and base, and each part can be used alone.
Why: hidden configuration is a contract nobody reads.
What I gave up: control over each product's final result. In return, nobody copies the system to change it anymore.
D5 · Done is measured in six places
A component is only done when it matches in six places: the written specification, the code, the catalog the team uses, the Figma file, the color it actually shows in each mode, and the comparison with the product's own drawing. The check returns a number.
Measured: CPF Seguro uses 85 components from the system, and all 85 pass. Of those, 38 were compared against the product's drawing. For the other 47 one of the places doesn't apply, with the reason written down.
D6 · A product's request becomes a file with a written answer
When a product needs something the system doesn't have, it writes a request in a fixed format. The request goes into a register with the answer, the reason and the version it shipped in. It holds 196 lines today.
A variant only moves into the system on the second request. Two teams asking for the same thing means the system is missing something. One team asking means that team's product is missing something.
Why: without a record of the first request, the second-request rule never fires.
What I gave up: speed. Writing the answer takes longer than replying in chat.
D7 · The same change works on any platform
Diletta also has an operations panel and an internet banking site, both on the web. A change to a system component has to be adoptable in any product, on any platform, the same way.
Measured: the 93 base colors already ship to web as 162 CSS variables. The 59 purpose colors still only exist in Flutter, and that gap is written into the decision.
How I sized the step: I counted the operations panel before proposing a timeline. There are 3,746 components in Figma, 2,689 visible, counted by component identifier. By layer name the number inflated by almost 30%.
D8 · The machine gathers and measures, and I decide
In August someone suggested splitting the checks across AI agents to go faster. I timed it first: the fourteen checks that block a release take 15.2 seconds. The time was in the judgment, and every divergence I read changes the question for the next one.
I split by the right to write. One agent gathers facts and concludes nothing. Another measures, and only goes into use after it turns red in front of a planted defect. Publishing, bumping a version and adopting it in the app are still a person's call.
What I gave up: the promised speed. The full check still takes five minutes, and I wrote that in the document.
Measured: in four days, 11 of 88 code deliveries (12.5%) were fixing a wrong measurement of mine. I caught none of them by re-reading.
07 Craft
loading the system's own pieces…
--cps-primary: #003BE0 data-theme: light tela: app
At version 0.175.0 the system had 128 written contracts, one per component or component part. CPF Seguro uses 85 of them. Every screen has a test that compares its image pixel by pixel against the approved version.
08 Result
A new product in 3 days. I counted it when Conta Bold joined the system, in July 2026: 3 days from the palette survey to the first build. One session to survey the palette, one to declare the colors and check contrast, one for the build. The old path took six weeks, by my reading of the history. The 4 days in Diletta Pay are a different thing: in 2022, a new brand on the old platform.
The update nobody saw. The system jumped thirteen versions at once, touching 1,022 files. In the app, the 24 screenshots stayed identical and the 2,062 tests passed.
Circulation. 302 versions published by 23 Sep 2026, each with a changelog. In July one app was 176 versions behind. Today CPF Seguro is on the current version and Conta Bold is 5 behind. Conta Bold chooses when to upgrade, so that number moves from one day to the next. I'd still rather show that distance than count 128 contracts, because the distance is what tells you whether the system is being used.
The web. In October the system got a second output: the same colors, type and components published as web components, now 51 pieces. The Flash Enterprise dashboard swapped Ant Design for them in one week. A defect fixed in the system reaches the app and the dashboard in the same release.
The check. Comparing CPF Seguro's drawing against the system, 33 color pairs match and 29 diverge. For 22 of those you can read which color should be there and which one is.
09 What I would do differently
I'd test the meter before publishing the measurement. The program counting done components silently skipped whatever it couldn't classify. The first total I published looked good and was wrong.
I'd test the right question. I have twenty recorded cases of a check that got it wrong: green over a defect, or red with no defect. In the first, it looked at the color declared in the component when the question was the color of the pixel. Blue at 18% opacity is not solid blue. Now I write the failing case before the check.
I'd write the changelog before I needed it. The 176 versions with no explanation were the reason the system had stopped reaching the products.