Building a Lean Design System for Your Startup
Design systems are seductive. The idea of a single source of truth for every button, every input, every modal — it sounds like engineering done right.
The problem is that most startups build their design system for the product they imagine they'll have, not the product they're building. The result is months spent on infrastructure for a product that changes direction after the first user interviews.
Here's how to build a design system that actually serves an early-stage startup.
Start with tokens, not components
Before you write a single component, define your design tokens: colours, spacing scale, typography, border radii, shadows.
In CSS, these are custom properties:
:root {
--color-brand: #2563eb;
--color-brand-dark: #1e40af;
--color-text: #111827;
--color-text-muted: #6b7280;
--space-1: 0.25rem;
--space-2: 0.5rem;
--space-4: 1rem;
--space-8: 2rem;
--radius-sm: 0.25rem;
--radius-md: 0.5rem;
--radius-lg: 1rem;
--font-size-sm: 0.875rem;
--font-size-base: 1rem;
--font-size-lg: 1.125rem;
--font-size-xl: 1.25rem;
}
With tokens defined, every component you build is automatically consistent. You don't need to coordinate colours across components — they all reference the same values.
The components you actually need first
Resist the urge to build everything. Start with what the product actually uses.
Phase 1 — Essentials:
Button(with variants: primary, secondary, ghost, destructive)InputandTextareaBadge/TagCardModal/DialogAvatar
Phase 2 — As needed:
SelectandComboboxTableToast/ notification systemTabsDropdown Menu
Don't build until you need:
DatePickerDataGridwith sorting/filteringRichTextEditorDragAndDropprimitives
The rule: build a component when you're about to use it in a second place. One-off components don't need abstraction.
Composition over configuration
Two approaches to flexible components:
Option A — Prop-driven:
<Button variant="primary" size="lg" :loading="isLoading" :disabled="!isValid">
Save changes
</Button>
Option B — Slot-driven:
<Button>
<SpinnerIcon v-if="isLoading" />
Save changes
</Button>
For early-stage products, prop-driven is usually better. It's explicit, easy to understand, and the API is self-documenting. Move to composition when the component needs to be genuinely open-ended.
Adopt a component library as a foundation
Building from scratch makes sense for a handful of truly custom components. For everything else, starting from an existing library saves weeks.
Good options for Vue/Nuxt projects:
- shadcn/vue — unstyled, copy-paste, full control
- Nuxt UI — styled, production-ready, built for Nuxt
- Radix Vue — primitives for accessibility-heavy components
The strategy: use the library for primitives (modals, dropdowns, form elements where accessibility matters), customise with your tokens, build bespoke components for your differentiated UI.
Skip Storybook until you're ready
Storybook is a powerful tool for documenting components at scale. It's also real maintenance overhead for a startup moving fast.
Skip it for your first six months. Your "documentation" at this stage is the component usage itself — good naming, sensible props, and an example in a real product page is usually enough.
Introduce Storybook when:
- You have multiple developers who need to discover what exists without reading code
- You have a designer who needs to review components in isolation
- Your component library is large enough that finding things becomes a problem
Versioning: don't bother early
Large organisations version their design system as a separate package. Startups shouldn't. It's extra overhead for zero benefit.
Keep your components in the same repo as the product. Refactor freely. Break things without ceremony. The cost of moving fast outweighs the benefit of stability when you're the only consumer.
The lean design system in practice
Here's what a lean design system looks like at a 6-month-old startup:
components/ui/— 10-15 primitive componentsassets/styles/tokens.css— design tokens- A shared Figma file with components matching the code
- No Storybook, no versioning, no changelog
- Conventions documented in a README or Notion page
That's enough to build consistent UI fast, onboard new contributors, and evolve as the product grows.
When you're ready to scale it, you'll know — because you'll feel the friction of the current approach and have concrete reasons to invest in more.