Back to insights
22 March 2026 · 7 min read · Kjell Brennan

Building a design system from zero, in a weekend

How a small team can ship a real design system without quitting their jobs to do it.

Most "design system" articles describe what Google or Shopify did with twenty-person teams over four years. That's not useful if you're a team of three trying to stop your homepage from looking different from your dashboard. This is the version for that team. You can have a real, working design system by Sunday night. Not a perfect one — a real one. The difference matters.

What a design system actually is

Strip the discourse away and a design system is three things: a small set of design tokens (colors, spacing, typography), a small set of components built on those tokens, and a rule that nothing on the site is allowed to bypass them. That's it. Everything else — Storybook, Figma libraries, governance committees — is decoration. You can ship without any of it and still have a system that works.

Saturday morning: the audit

Before you build, look at what you already have. Open every page of your site and screenshot the buttons. Put them in a single document, side by side. Do the same for headings. Then for input fields. Then for cards.

Two things will happen. First, you'll find seventeen variants of "the primary button" — different colors, different paddings, different border radii. Second, you'll discover patterns you didn't know existed, things one of your developers built once and quietly forgot.

The point of the audit isn't to feel bad. It's to force a decision. Pick the one button that should win. Pick the heading sizes you'll keep. Three sizes is enough. Five is too many. One is not enough. Three.

Saturday afternoon: the tokens

A token is a named value: `color-primary` is `#3B82F6`, `spacing-md` is `16px`. Tokens go in one CSS file (or one Tailwind config). Everywhere else in your code refers to the token name, never the raw value.

The minimum viable set:

  • **Colors**: background, foreground (text on background), primary, primary-foreground, muted, muted-foreground, border, danger.
  • **Spacing**: xs, sm, md, lg, xl. Use a 4px or 8px scale. Don't overthink it.
  • **Typography**: three font sizes (display, body, small), one font family for headings, one for body.
  • **Radius**: sm, md, lg.
  • **Shadows**: sm (subtle), md (cards), lg (modals).

That's roughly twenty-five tokens. You can fit them on one screen. If you need more, you don't yet. Add later.

Saturday evening: the components

Build the components you actually use. Don't build a date picker because Material has one. Build the things on your screenshots from this morning.

For most teams that's: Button, Input, Card, Badge, Heading, Avatar, Modal. Maybe Tabs. That's enough to rebuild 90% of your interface.

Each component takes its values from tokens, never raw. Buttons accept variants (primary, secondary, ghost) and sizes (sm, md, lg). Cards have padding, radius, and shadow from tokens. Headings pick from the three font sizes you decided on.

Don't build composition logic into components. A "ProductCard" is not a design system component. Card is. ProductCard is something you build in your app using Card. Keep the system small.

Sunday morning: the rule

The rule is the part most teams get wrong. The rule is: nothing on the site is allowed to use raw colors, raw spacing, or raw font sizes. Everything goes through tokens. Always.

If you find yourself writing `style={{ color: '#666' }}` somewhere, that's a token you forgot to define. Add it. Use it. Don't bypass.

This is how systems decay. A team builds tokens, then ten weeks later someone writes a one-off color "just for this banner." Then someone else copies that banner. Three months later half the site is in colors that aren't in the system, and you have a system in name only.

The way to enforce the rule is partly social and partly technical. Socially, code review rejects raw values. Technically, you can write a lint rule that flags hex codes in JSX. Or you can use Tailwind with a strict config that simply doesn't define non-token colors. Either way: the rule is the system.

Sunday afternoon: documentation

Documentation is two pages. One page lists the tokens, with examples. One page lists the components, with examples. That's enough for a team of three. You don't need Storybook on day one. You don't need a design site at design.yourcompany.com.

What you need is a single URL — even a Notion page is fine — that shows what exists. When a new person joins, you send them that URL. When you're about to build something new, you check that URL first.

Sunday evening: ship one screen

Pick one screen of your product. Rebuild it using only your design system. Not "mostly using" — only using. If you find a thing the system doesn't support, you have two choices: don't ship that thing, or extend the system to support it. Both are valid. What's not valid is bypassing the system "just for this screen."

The first screen is hard. The second screen is easier. By the fifth screen, you'll be faster than you were before, because you stop making decisions about colors and spacings every time. The decisions are pre-made.

What you've built

By Sunday night you have: a tokens file, maybe seven components, two docs pages, and one screen rebuilt to prove it works. That's a real design system. It will need to grow. It will need refactoring. But it exists, and from now on every new screen is built on it instead of next to it.

The rest is gardening. A design system isn't a project that finishes. It's a discipline that compounds. Teams that have one don't have one because they did a heroic six-month rebuild. They have one because someone, on a weekend a couple of years ago, decided that was enough to start.

Build faster. Convert better.

Premium WordPress themes engineered for performance.

Browse Themes

Keep reading