A scalable design system is one that keeps working as the product, the team and the number of brands grow. Most design systems start well. A team builds buttons, inputs and a colour palette, publishes a Figma library and a component package, and things feel organised for a while. Then the product doubles. New teams join. A second brand appears. An Arabic version is needed. Someone asks if AI agents can generate screens from it. That is when you find out whether the system was built to scale.
I have worked on design systems for enterprise and UAE government products for many years, including work aligned with AEGOV, the UAE Government Design System. This guide covers what I have learned about the parts that matter: foundations, components, patterns, documentation, governance, versioning, theming, design-to-code parity, and making the system readable by machines.
What makes a scalable design system
A design system does not scale because it has many components. It scales because it has clear rules about how things are named, built, changed and used. Size is a result. Structure is the cause.
In my experience, a scalable design system has five qualities:
- Layered: foundations, components and patterns are separate, and each layer only depends on the one below it.
- Token driven: visual decisions live in design tokens, not in hard coded values inside components.
- Documented: every component explains when to use it, when not to use it, and what it replaces.
- Governed: there is a known path for proposing, reviewing and releasing changes.
- In parity: what designers see in Figma matches what developers ship in code.
Brad Frost’s atomic design article is still a good mental model for the layering idea. You do not need to use his exact vocabulary, but the principle of building small pieces into larger ones holds up well.
Foundations: design tokens as the base of a scalable design system
Tokens are named values for design decisions: colours, spacing, type sizes, radii, shadows, motion durations. Instead of writing #1A5FD1 in twenty places, you write color.action.primary. When the value changes, it changes everywhere.
The key to scale is having more than one tier of tokens:
- Primitive tokens: raw values such as blue.600 or space.4. These describe what a value is.
- Semantic tokens: meaning based names such as color.text.danger or space.inline.md. These describe what a value is for.
- Component tokens (optional): values scoped to one component, such as button.primary.background.
Components should only use semantic or component tokens, never primitives. That one rule is what makes theming, dark mode and multi-brand support possible later. If a component points to blue.600 directly, you will have to edit the component to rebrand it. If it points to color.action.primary, you only edit the token.
The Design Tokens Community Group is working on a shared format for tokens. Following it, or something close to it, makes your tokens easier to move between Figma, code and build tools.
Figure 1 · The layers of a scalable design system
Primitive tokens
blue.600, space.4, radius.2. Raw values only.
Semantic tokens
color.text.danger, space.inline.md. Meaning, not value.
Components
Button, Input, Table. Built only from semantic tokens.
Patterns
Filtering, forms, empty states. Components combined with rules.
Products
Screens and flows that consume patterns, not raw values.
Components: fewer, better, and clearly named
The fastest way to break a design system is to say yes to every component request. Within a year you have three card components, two date pickers and a “SpecialButton” that only one team uses.
A few rules that help:
- One component per concern. If two components do the same job, merge them or deprecate one.
- Variants over copies. A button with size, tone and icon options is better than five button components.
- Clear props. Name properties by intent. tone=”danger” is clearer than color=”red”.
- States are part of the component. Hover, focus, disabled, loading and error are not optional extras.
- Accessibility is built in. Focus management, labels and keyboard support belong in the component, so product teams get them for free. The WCAG guidelines are the baseline.
I prefer a smaller library that is fully specified over a large one that is half finished. Product teams trust a small, solid library. They work around a large, unreliable one.
Patterns: where a scalable design system pays off
Components answer “what is this thing?”. Patterns answer “how do we solve this problem?”. A table is a component. “How we filter, sort, paginate and bulk edit a table of records” is a pattern.
Patterns are where most of the consistency in a large product comes from. Without them, every team assembles the same components in slightly different ways, and users notice. Useful patterns to document early include:
- Filtering and search
- Forms and validation
- Empty, loading and error states
- Confirmation and undo
- Navigation and page layout
- Notifications and status messages
Each pattern should include a short description of the problem, the recommended solution, the components it uses, and examples of what not to do.
Documentation people actually read
Documentation is often the weakest part of a design system, and it is the part that decides whether people use it correctly. Long essays get skipped. What works is short, structured and consistent.
For each component I document the same sections:
- What it is, in one sentence.
- When to use it.
- When not to use it, and what to use instead.
- Anatomy and variants.
- Props or properties, with defaults.
- Accessibility notes.
- RTL notes.
- Do and don’t examples.
The “when not to use it” section is the most valuable one. It prevents misuse more than any amount of guidance on correct use. Keep the docs next to the code if you can, so they change in the same pull request as the component.
Governance and contribution
Governance sounds heavy, but it just means answering a few questions in writing. Who owns the system? How does a team request a new component? Who reviews it? How long does that take? What happens if a team needs something urgently?
A simple contribution model works for most organisations:
- Request: a team describes the problem, not the solution, and shows where existing components fall short.
- Review: the system team checks whether an existing component or pattern can solve it.
- Build: either the system team or the requesting team builds it, following the system’s standards.
- Release: it ships in a versioned release with documentation and a changelog entry.
I also like having a clear “local first” option. A team can build something inside their product, and if two or more teams need it, it gets promoted into the system. This keeps the system from blocking delivery while still protecting its quality.
One idea I rely on heavily is giving each concern a single legal path. One way to show a toast. One way to build a form field. One way to define spacing. When there is only one correct option, both people and AI tools make fewer mistakes, and reviews get faster.
Versioning a scalable design system
When many products depend on your system, every change is a potential breaking change. Semantic versioning helps: patch releases for fixes, minor releases for new features, major releases for breaking changes.
Practical habits that keep versioning calm:
- Write a changelog entry for every release, in plain language.
- Deprecate before you remove. Mark a component as deprecated, give a replacement and a timeline, then remove it in a later major version.
- Provide migration notes, and codemods where the change is mechanical.
- Version the Figma library and the code package together, so designers and developers talk about the same release.
Multi-brand and RTL theming
This is where tiered tokens prove their value. If components use semantic tokens, a new brand is mostly a new set of token values. The components stay the same. Dark mode works the same way.
For products in the UAE and the region, Arabic and RTL support is not a theme. It is a direction, and it affects layout, icons, typography and even motion. To support it properly:
- Use logical properties such as padding-inline-start in components, never left and right.
- Mark which icons should mirror, such as arrows and chevrons, and which should not, such as logos, checkmarks and media controls.
- Define Arabic type tokens separately. Arabic fonts often need different sizes and line heights to feel balanced with Latin text.
- Test every component in both directions as part of the release process, not as a separate project.
The UAE Government Design System (AEGOV) is a good public example of a system that treats bilingual support as a core requirement. Studying how it structures its components is useful even if you are not building for government.
Figure 2 · One component, many contexts
Brand A, light
Same Button, brand A token set.
Brand B, dark
Same Button, brand B dark token set.
English, LTR
Icon after label, Latin type tokens.
Arabic, RTL
Mirrored layout, Arabic type tokens.
Design-to-code parity
A design system has two sources: the design library and the code library. When they drift apart, designers design things that cannot be built easily, and developers build things that do not match the designs. Trust in the system drops quickly.
Ways to keep parity:
- Same names in both places. If Figma calls it “Alert” and code calls it “Notification”, people will get confused. Pick one.
- Same properties. Figma component properties should map to code props, with the same names and options.
- One token source. Generate both Figma variables and code tokens from the same token files.
- Visual regression tests. Catch unintended changes in code before they ship.
- Parity reviews. Before a release, compare each changed component in Figma and in code.
Design-to-code work is a large part of what I do day to day. The teams that get parity right are the ones that treat the design library and code library as one product with two outputs.
Making your scalable design system machine-readable for AI agents
More teams now use AI tools to generate code and screens. Those tools are only as good as the context they get. A design system that lives only in Figma and a wiki is hard for an AI agent to use correctly. A system that is structured and machine-readable gives the agent clear rules to follow.
What helps:
- Tokens in a structured format such as JSON, with clear semantic names.
- Component specs that list props, allowed values, defaults and usage rules in a consistent format.
- Explicit “do not” rules, such as “never use primitive tokens in components” or “always use the Field component for form inputs”.
- Examples of correct composition for common patterns.
- A short rules file that an agent reads before generating anything.
This is the same “single legal path” idea from governance, applied to machines. When the system defines one correct way to do each thing, an agent has far less room to invent its own. I go deeper into this in my posts on AI-native design and generative UI design.
Scalable design system checklist
Use this to review where your current system stands.
- Tokens are split into primitive and semantic tiers.
- Components only reference semantic or component tokens.
- Each concern has one component, with variants instead of copies.
- Every component includes all states and meets WCAG basics.
- Common patterns such as filtering, forms and empty states are documented.
- Docs include “when not to use” and RTL notes for every component.
- There is a written contribution process with an owner.
- Releases follow semantic versioning with a changelog.
- Deprecations have a replacement and a timeline.
- New brands and dark mode are token swaps, not component edits.
- Every component is tested in LTR and RTL.
- Figma and code share names, properties and one token source.
- Tokens and component specs are available in a machine-readable format.
If you can tick most of these, you have a scalable design system. If you can tick only a few, pick the foundations first. Tokens and naming are the hardest things to change later and the easiest things to get right early.
Need help with your design system?
If you are planning, auditing or scaling a design system for an enterprise or government product, especially one that needs Arabic and RTL support, I would be glad to talk. You can get in touch through chandrajith.in.
Frequently asked questions
What is a scalable design system?
It is a design system built with clear layers, tokens, documentation and governance, so it keeps working as the product, team and number of brands grow, without each new need forcing a rewrite.
When should a team start building a scalable design system?
As soon as more than one team or more than one product shares UI. Start small with tokens and a few core components, then grow based on real needs instead of building everything up front.
How do design tokens help a design system scale?
Tokens separate design decisions from components. When components use semantic tokens, you can change brands, add dark mode or adjust spacing by editing token values instead of editing every component.
How do you support Arabic and RTL in a design system?
Use logical CSS properties, define which icons mirror, create separate Arabic type tokens, and test every component in both directions as part of each release.
Read next
- Design System Implementation Challenges and Solutions
- Design Tokens and Component Library Architecture
- UI Component Library Development for Scalable Apps
