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 customdiv
+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