Design System for Indie Hackers: Choosing the Right Approach
Indie hackers rarely fail because they lack features. They often fail because they cannot keep quality stable while moving fast. UI drift is one of the first places this shows up—and it gets worse when you add contributors or rely on AI-generated code.
The answer is not "use the most popular component library." The answer is choosing an approach that matches your current stage, available time, and growth expectations. This post lays out three realistic paths and the questions that should determine which one you pick.
Four Questions Before You Choose
How much time can you actually spend on UI infrastructure?
Not how much time you think you should spend—how much you realistically can. If the honest answer is two to four hours per month, a highly customized system will become technical debt before it delivers value.
How much does brand differentiation matter right now?
At validation stage, baseline consistency is often enough. Once you are competing on user trust and product polish, generic UI hurts. Knowing which stage you are in changes the calculus significantly.
How often does your product surface change?
Products that are still finding product-market fit change frequently. A configuration-heavy design system adds friction to every iteration. Token-based systems tolerate change better because updates happen in one place and propagate automatically.
Will you use AI to generate UI code?
If yes, this is now a first-class requirement for your design system, not an afterthought. AI tools generate plausible but off-brand UI when they have no structured token data to reference. If you plan to use AI coding tools regularly, token clarity is non-negotiable.
Three Paths
Path A: Utility Classes Directly
You style every component with utility classes and no token abstraction.
This works for very early experiments. Iteration is fast, setup is zero, and there is nothing to maintain. The cost arrives when the product starts growing: inconsistency compounds quickly, repeated style logic spreads everywhere, and AI-generated code drifts further from your visual language with every generation.
Pick this path if you are validating an idea this month and expect to rebuild UI later.
Path B: Component Library With Local Conventions
You adopt a component library and layer lightweight local rules on top—custom colors in the config, a few documented naming decisions.
This gives you better baseline accessibility, faster initial shipping, and easier onboarding for new contributors. The downside is that conventions often stay undocumented and unenforceable. When a second developer or an AI tool joins, the conventions degrade unless they are written down and structurally reinforced.
Pick this path if you need reliable output now and can accept moderate visual similarity with other products using the same library.
Path C: Token-First Design System
You define tokens first—color, spacing, type, radius—and build components as implementations of those token semantics.
This approach costs more upfront but scales substantially better. Global changes take one edit. Theming and rebranding become routine. AI-generated code can reference tokens directly, which keeps it consistent with human-written components. The tradeoff is that you need a clear migration plan for existing UI, and the initial setup requires discipline.
Pick this path if your product is growing in surfaces and complexity, or if you are generating meaningful amounts of UI with AI tools.
Most serious indie products eventually move to Path C regardless of where they start. The question is whether you arrive there by design or by necessity after a painful refactor.
What to Evaluate in Any Option
Token model quality. Look for semantic tokens with clear naming—button.primary.bg, not blue-500. Check for theme support, dark mode handling, and a stable extension strategy. Without this, you will fight drift indefinitely.
Primitive API constraints. If a component accepts raw style overrides by default, your consistency is fragile. Good primitive APIs limit unsafe customization without requiring workarounds for legitimate use cases.
Documentation and operational clarity. A design system is an operational tool, not just a visual one. Can you explain when to use each variant? Is there a clear process for adding a new component? If the answer is no, the system will degrade under normal usage.
AI workflow compatibility. Can AI tools consume your system through structured token data and explicit component contracts? This is relevant now, not in a future roadmap item.
Migrating an Existing Product
Most indie products are not greenfield. A practical migration sequence that does not require stopping feature work:
Phase 1: Define core tokens. Start with color, spacing, type, and radius. Keep the first version intentionally small—ten color tokens and five spacing values is a better starting point than fifty tokens you are not sure you will use.
Phase 2: Refactor high-usage primitives. Prioritize Button, Input, Card, Badge. Replace raw styling patterns with token-based variants. These four components appear on nearly every screen.
Phase 3: Migrate revenue-critical flows. Apply new primitives to onboarding, checkout, billing, and settings before working through long-tail pages. High-traffic screens benefit most from consistency improvements.
Phase 4: Add governance. Set lint rules: no hardcoded brand colors in components, token usage required for new UI, variant additions require a rationale. This step prevents silent regression.
To set up FramingUI as your token foundation:
pnpm add @framingui/ui @framingui/core @framingui/tokens tailwindcss-animate
For MCP integration with AI tools:
npx -y @framingui/mcp-server@latest init
The init command sets up the full runtime contract—provider bootstrap, CSS imports, MCP config for Claude Code—in one step.
Common Selection Mistakes
Choosing by aesthetics. A polished component screenshot tells you almost nothing about how maintainable the system is six months from now.
Underestimating maintenance cost. The real cost of a design system is not setup—it is the ongoing work to keep it consistent with a changing product. If the system requires constant manual cleanup, it is too expensive for a small team.
Deferring token decisions. "We will standardize later" almost always means compounding inconsistency. Later has a higher cost than now.
Ignoring AI compatibility. If you use AI coding tools regularly, a design system without machine-readable tokens multiplies inconsistency with every generation.
The Decision in Practice
Before committing, verify you can answer these clearly: Can you explain your token model in one page? Are primitive APIs constrained enough to enforce consistency? Can migration happen incrementally? Does the system support your AI coding workflow? Is ongoing maintenance feasible with your real team capacity?
Indie hackers do not need the most feature-complete platform. They need a design system that preserves shipping speed while preventing visual entropy. A token-first approach provides the best long-term leverage once a product is past the pure validation stage—and the sooner it is in place, the smaller the migration cost.