Editorial illustration for "The One-Person Design System Is a Real Thing (Here's How It Actually Works)"

The One-Person Design System Is a Real Thing (Here's How It Actually Works)


Most design system advice assumes you have a team. A dedicated engineer. A design systems lead. Maybe a Figma specialist. The implicit audience is always some company large enough to staff the work properly.

That's not most companies. Most companies have one frontend engineer who also maintains the component library between feature sprints, or a designer who built a token system that nobody's adopted, or a team that decided to "invest in the design system" and then got pulled back into product work two weeks later.

The question isn't whether small teams should build design systems. It's how they build ones that don't collapse under their own weight.

The Coverage Trap

Here's the pattern that kills small-team design systems: they try to ship everything.

An analysis of 158 public design systems found that 89% include code examples — that's the first layer teams build. After that, each subsequent layer drops off sharply. Only 37% add usage guidelines. Only 21% document accessibility. Only 13% include content guidelines. Three systems scored a perfect seven-layer coverage: Shopify Polaris, Twilio Paste, and eBay Playbook. The gap between them and the average is not small.

The lesson most teams take from this: we need to do better. The lesson they should take: Shopify has a dedicated design infrastructure team. You don't. Stop competing with Shopify.

A small team that ships a solid token layer, a handful of well-documented components, and consistent code examples is more useful than a team that attempts all seven layers and maintains none of them. Coverage is a vanity metric when you're under-resourced. Depth on the things you actually ship is what creates adoption.

Primitives Do the Heavy Lifting You Can't Afford

The other thing small teams can't afford is building accessibility from scratch. Keyboard navigation, ARIA attributes, focus management — this is genuinely hard, and getting it wrong has real consequences. The good news is that the primitive layer has gotten good enough that you don't have to.

The current ecosystem gives you real options. Radix UI still pulls around 130M monthly npm downloads, but active development has slowed since the WorkOS acquisition — complex components like Combobox and multi-select have lagged. Base UI, backed by the MUI team with full-time engineering, has cleaner APIs for those interaction patterns and better TypeScript types. shadcn/ui now supports both as its primitive layer, which means you can pick your foundation without locking in your component API.

For a small team, this matters because it changes what you're actually building. You're not building a component library from scratch — you're building a design layer on top of primitives that handle the hard parts. That's a fundamentally different scope of work, and it's one a single engineer can actually maintain.

The copy-paste distribution model that shadcn popularized is also worth taking seriously here. When components live in your repo rather than in a dependency, there's no upgrade path to manage, no breaking changes to absorb, no version drift between teams. The February 2026 Visual Builder reduces setup friction further — configure visually, copy the exact code. For a team without dedicated staffing, eliminating maintenance surface area is a legitimate architectural decision, not a shortcut.

What "Viable" Actually Means at Small Scale

Here's a concrete example of the tradeoff in practice:

// Over-engineered for a 3-person team
<Button
  variant="primary"
  size="md"
  iconLeft={<Icon name="arrow" />}
  iconRight={null}
  loading={false}
  disabled={false}
  fullWidth={false}
  onClick={handleClick}
>
  Submit
</Button>

// Viable for a 3-person team
<Button variant="primary" onClick={handleClick}>
  Submit
</Button>

The first API looks professional. It also means someone has to document every prop, test every combination, and update the Storybook story when iconLeft behavior changes. The second API ships in an afternoon and covers 90% of actual usage. The remaining 10% gets handled with className overrides or a one-off component that doesn't pretend to be part of the system.

I'd argue the instinct to build comprehensive APIs is the single biggest velocity killer in small-team design systems. You're not building for unknown future consumers — you're building for three engineers you can walk over to. Optimize for that.

The Decision Heuristic

Before adding any new layer, component, or prop to your system, ask: who maintains this when I'm heads-down on a feature sprint?

If the answer is "nobody," that's your scope limit. Build to the edge of what your team can actually maintain at half-attention, then stop. A system that stays current with minimal effort will get used. A comprehensive system that goes stale in six months will get worked around — and that's how you end up with four different button implementations and a design system that exists only in documentation.

Ship less. Maintain it. That's the whole strategy.