Product•2025-12-15
Design Systems for Speed: Why We Standardize UI Early
How shadcn + Tailwind patterns help us ship faster without sacrificing quality or consistency.

Every project starts the same way: we need buttons, forms, cards, modals. The question is: do we build them from scratch or use a design system?
We used to build from scratch. Now we standardize early. Here's why.
The Problem with Custom
Building custom UI components sounds flexible. In practice, it's slow:
- Every button needs styling decisions
- Every form needs validation patterns
- Every modal needs animation logic
- Every card needs layout rules
Multiply that by dozens of components, and you're spending weeks on UI before you build anything valuable.
Worse, custom components create inconsistency. Different developers make different choices. The result? A UI that looks cobbled together, even if individual components are good.
The Solution: shadcn + Tailwind
We use shadcn/ui as our base. It's not a component library you install—it's a collection of copy-paste components built on Radix UI and Tailwind.
Why this works:
- Full control: Components live in your codebase, you can modify anything
- Consistent patterns: Built on Radix UI, so accessibility is baked in
- Tailwind styling: Easy to customize, no CSS-in-JS overhead
- Fast iteration: Copy, paste, customize, ship
We start every project by copying the components we need into a /components/ui folder. Then we customize them to match the brand.
Component Tokens: The Foundation
Before we customize anything, we define design tokens:
- Colors: Primary, secondary, accent, destructive, etc.
- Typography: Font families, sizes, weights, line heights
- Spacing: Consistent spacing scale (4px, 8px, 12px, etc.)
- Border radius: Consistent rounding (sm, md, lg, xl)
- Shadows: Consistent elevation system
We put these in Tailwind config. Then every component uses the same tokens automatically.
The result: change a token once, update the entire UI.
Consistency Wins
When every component uses the same tokens, the UI feels cohesive. Buttons look like buttons. Forms look like forms. Cards look like cards.
This consistency:
- Reduces cognitive load (users know what to expect)
- Speeds up development (less decision-making)
- Makes maintenance easier (change once, update everywhere)
- Improves accessibility (consistent patterns = predictable behavior)
We enforce this with:
- ESLint rules (enforce Tailwind class usage)
- Component templates (standard patterns for common components)
- Design reviews (check for consistency before shipping)
Speed Without Sacrifice
Some teams worry that design systems limit creativity. We've found the opposite.
Standard components handle 80% of use cases. For the other 20%, we customize. But because we start with a solid foundation, customization is fast.
Example: We need a custom button style. Instead of building from scratch, we:
1. Copy the shadcn button component
2. Modify the Tailwind classes
3. Add any custom logic we need
4. Ship it
Total time: 10 minutes. If we built from scratch: 2 hours.
The same applies to forms, modals, cards, everything. Start standard, customize when needed.
The Workflow
Here's how we work:
1. Project starts: Copy shadcn components we need
2. Define tokens: Set up Tailwind config with brand colors, typography, etc.
3. Customize base: Modify shadcn components to match brand
4. Build features: Use standardized components, customize when needed
5. Maintain: Update tokens as brand evolves, components update automatically
This workflow scales. Whether we're building a landing page or a full app, the process is the same.
The Bottom Line
Design systems aren't about limiting creativity. They're about eliminating repetitive decisions so you can focus on what matters: building features that solve real problems.
shadcn + Tailwind gives us the best of both worlds: standardized patterns with full control. We ship faster, maintain consistency, and still have the flexibility to customize when needed.
The teams that standardize early ship faster. That's not a coincidence.