Part 05 of 14 · · 4 min read
Governing a design system at scale
Who runs a design system and how it changes: team models, a contribution process, semantic versioning and deprecation, and the signals that show adoption.
Governance answers three questions: who runs the system, how it changes, and how you know people are using it well. Without answers, a system either freezes, because nobody may touch it, or splinters, because everyone does.
Governance sounds like bureaucracy, but done well it is mostly a few clear habits. This part covers the ones most teams end up needing.
Team models
Nathan Curtis of EightShapes described the common ways a design system team is organised. They remain a useful map:
| Model | How it works | Strength and weakness |
|---|---|---|
| Solitary | One person or one product team builds a system for its own use | Fast, but other teams rarely adopt it |
| Centralized | A dedicated system team builds for everyone | High quality, but the team can become a bottleneck |
| Federated | Designers from several product teams contribute together | Grounded in real needs, but hard to coordinate |
| Hybrid | A small core team plus contributors from product teams | Balances ownership with real needs; common in larger organisations |
A contribution process
People will ask for new components and changes. A visible process turns those requests into improvements instead of side forks:
- Request. An issue or form: what problem it solves and where it is needed.
- Triage. Does something similar already exist? Is this for one product or for many?
- Design and proposal. Use cases, variants and accessibility, written up as an RFC that others can comment on.
- Review by the system team, an engineer and someone focused on accessibility.
- Build in Figma and in code.
- Document and release: version, changelog and an announcement.
- Follow up on adoption. Check that the teams who asked for it actually use it.
System component or local snowflake?
Not every request belongs in the system. A common rule of thumb: when a pattern is needed in about three places or more, bring it into the system. If only one screen needs it, let it live in that product as a local component. It can be promoted later if others start to need it.
Versioning and releases
Most systems use Semantic Versioning: MAJOR.MINOR.PATCH. The number tells consumers how careful they need to be when they update.
| Bump | Example | Meaning |
|---|---|---|
| Patch | 1.4.2 | Bug fixes and visual corrections |
| Minor | 1.5.0 | New components or variants, backward compatible |
| Major | 2.0.0 | Breaking changes: a renamed prop or token, a removed component |
- Changelog. Group every release under Added, Changed, Deprecated, Removed and Fixed, the categories from Keep a Changelog.
- Deprecation, not deletion. Mark the old part deprecated, publish a migration guide, and remove it a release or two later.
- A predictable cadence. Small, regular minor releases with major releases spaced further apart, so teams can plan upgrades.
text
## 2.0.0
### Changed
- Button: prop `type` renamed to `variant`
### Removed
- LegacyTag (deprecated in 1.8.0, use Badge)
## 1.9.0
### Added
- Button: `loading` state
### Deprecated
- Token color.brand-blue, use color.bg.brandMeasuring adoption and health
A system nobody uses has failed, however polished it is. These signals show how it is doing:
| Signal | What it tells you |
|---|---|
| Component coverage | How much of the product UI is built from system components |
| Detach rate | How often Figma instances are detached. A high rate suggests a component is not flexible enough |
| Library usage | Which components are inserted, in which files, how often (Figma’s library analytics, on plans that include it) |
| Hard-coded values | Raw hex and pixel values in code where a token should be, found with a linter |
| Time to ship | Whether new screens take less time to design and build |
| Satisfaction | How designers and developers feel about the system, from a short survey |
When a team keeps detaching components
A product team detaching components is a signal, not a crime. Treat it as research:
- Find out why, through a short conversation or the usage data.
- Look for the gap. The component may be too rigid, or there may be a use case it never covered.
- Close it by bringing the case in through the contribution process, or by documenting the right alternative.
- Keep tracking the detach rate to see whether the change worked.
Habits that help at scale
- Linting. A Figma plugin flags colours and spacing that don’t come from tokens; in code, Stylelint rules do the same.
- Office hours. A regular slot where anyone can bring questions about the system.
- Design critique with a system review before large features ship.
- A single source of truth. Token JSON in Git, with Figma and code both built from it.
- Theming through semantic tokens and modes, for several brands or products from one system.
- A documentation site, built with a tool such as Zeroheight or Supernova, or your own, for example Storybook with MDX.
Try this
Write the changelog for a release you invent: one new component, one renamed token and one bug fix. Decide which version number it gets, and write the one-line migration note for the renamed token. If the note is hard to write, the change may need a deprecation step first.
Next in the series
Governance keeps a system healthy, but the system exists to serve users. Part 6 turns to UX principles, starting with Nielsen’s usability heuristics, which give you reasons for a design decision rather than taste.
Sources and further reading
See a design system in practice: the AppsCode Design System case study