How to Build UI Without a Design System

By Rowan Trace
June 18, 2025
3 min read

You skipped the design system.

Good. Now what?

You still need reusable components.
You still want visual consistency.
You still don’t want your app looking like it was stitched together in the dark.

Here’s how to build UI that doesn’t suck — without turning your codebase into a miniature Material UI clone.

1. Pick a Primitive Stack and Stick to It

You don’t need a design system, but you do need constraints. Choose a baseline:

  • Tailwind (or similar utility-first CSS)
  • A lightweight component lib (e.g. shadcn/ui, Radix Primitives)
  • Minimal layout patterns (Flex and Grid will take you far)

Don’t mix paradigms.
Don’t invent CSS from scratch.
Use the primitives to assemble layouts — not build a framework.

2. Build Only What You Use (Then Use It Again)

Every component should have one job: reduce repetition. But don’t abstract for potential reuse — abstract based on actual duplication.

Rule of thumb: build a component the second time you copy-paste it, not the first.

Also: live with a rough version for a while.
If you keep tweaking it, it’s worth abstracting.

3. Centralize Style, Decentralize Logic

Want visual consistency without bloat?
Centralize the visual choices:

  • One color palette
  • One spacing scale
  • One border radius
  • One font stack

Put them in a config — Tailwind theme, CSS variables, whatever.

Logic? Keep it in the component.
No need to DRY every hover state.

4. Embrace the Power of Boring

Use boring HTML.
Use native controls.
Use standard layout flows.

The fastest way to build clean UI is to stop fighting the defaults.

That means:

  • <button> over custom div + onClick
  • <label> and <input> with proper associations
  • Accessible semantics by default

You’re not building a design language. You’re building an interface.
Let HTML do the work.

5. Make Inconsistency a Design Cue

This one’s weird — but powerful:

When something looks different, it should mean something.

  • A button with a different color? It does something important.
  • A layout shift? Context has changed.
  • A bold font? Pay attention.

That’s communication.
It’s more useful than pixel-perfect sameness.

6. Document Only What You Reuse

You don’t need a full-blown design system site.

You need:

  • A README
  • A Notion doc
  • A Storybook — only if it’s actually helping

Document the handful of components you use regularly.
Everything else? Don’t document it until it earns the right.

7. Refactor Later, When It Hurts

Eventually, entropy will creep in.
You’ll want to tighten things up.
That’s when a system starts to make sense — when the pain is real.

Until then?

  • Keep it light
  • Keep it local
  • And remember: you are not IBM

Comment, Share, or Build Something With This

Found this useful? Disagree completely? Let's discuss it.

Send me a message

Related Posts