Design SystemsWriting

Designing UI Primitives That Scale

Why strong primitives do more than tidy up a component library; they shape how products scale across teams and platforms.

Primitives Are Leverage

Most UI systems do not fail because of poor styling or inconsistent spacing. They fail because the primitives are too specific.
When primitives encode product concepts instead of capabilities, the system becomes rigid. Every new requirement forces either duplication or exceptions, and over time the UI layer turns into a graveyard of one-off components.
Strong primitives are boring by design-and that is precisely why they scale.

What Makes a Good Primitive

A good primitive has three defining properties:
  • Reusable: it can appear in multiple contexts without modification
  • Composable: it gains meaning when combined with other primitives
  • Context-agnostic: it does not encode business intent
Primitives should describe what something is, not why it exists.
The moment a primitive starts answering product questions, it stops being a primitive.

The Cost of Specificity

Specific primitives feel productive at first. They move fast and read well in code.
They also lock you in.

Bad Primitives

  • HomeHeroCard
  • TrendingDestinationTile
  • PromoBannerV3
These names embed:
  • Placement
  • Intent
  • Versioning
Each of those dimensions eventually changes. When they do, the primitive becomes either misleading or unusable.
Specificity does not age well.

Boring Primitives Win

Good primitives are intentionally generic:
  • Card
  • Media
  • Title
  • Action
  • Badge
On their own, they feel underwhelming. Together, they are expressive.
Meaning emerges from composition, not specialization.
A “Trending Destination” is not a primitive. It is a Card with Media, a Title, a few Badges, and an Action. If the concept changes tomorrow, the primitives remain intact.

Primitives Enable Everything Else

Once primitives are well-designed, a surprising number of higher-level capabilities fall out naturally:
  • Server-Driven UI: primitives form a stable rendering vocabulary
  • Cross-platform rendering: primitives map cleanly to platform-specific views
  • Agent-driven interfaces: agents reason in primitives, not screens
  • Faster experimentation: composition changes without touching infrastructure
This is why primitives are not a design system concern. They are infrastructure.

Evolution Without Rewrites

One of the most important properties of a good primitive system is asymmetry:
Primitives change slowly. Composition changes fast.
This is not accidental.
When primitives are stable:
  • Experiments become cheap
  • Features evolve without rewrites
  • Old layouts can coexist with new ones
Most UI rewrites are not caused by design changes, but by primitives that were too specific to survive change.

Designing for Longevity

If you feel the need to version primitives (V2, New, Updated), that is usually a signal that the abstraction is wrong.
Primitives should be:
  • Minimal
  • Predictable
  • Hard to misuse
If they are easy to misuse, they are probably too powerful.

Key Takeaways

  • Primitives are infrastructure, not components
  • Specificity kills reuse
  • Composition creates meaning
  • Stability is what enables speed