doodleui-react vs shadcn/ui
This is not a “better than” page. shadcn/ui and doodleui-react solve different visual jobs. One leans formal and invisible; the other leans sketchy and characterful. The useful question is when a hand-drawn aesthetic is the right choice — and when it isn't.
When a hand-drawn UI kit fits
Reach for sketch chrome when the product should feel provisional, playful, or educational — closer to a whiteboard than a bank statement:
- Whiteboarding, brainstorming, and mind-mapping tools
- Educational platforms, tutorials, and interactive learning
- Playful consumer apps, journals, and hobbyist tools
- Prototyping, wireframing, and design-sprint surfaces
- Creative portfolios and design showcases
- Kids' products, casual games, and light quizzes
When it usually doesn't
Prefer a conventional kit (shadcn/ui or similar) when trust, density, and a formal visual tone matter more than personality:
- Enterprise dashboards, ERPs, and mission-critical admin consoles
- Fintech, banking, trading, and other high-trust money UIs
- Regulated healthcare or legal workflows
- Any product that needs to look solid, precise, and institutional
Wobbly borders on a balance sheet read as unfinished, not friendly. That mismatch is the most common adoption miss — not missing features.
Side-by-side
A handful of substantive distinctions — not a feature checklist war:
| Dimension | shadcn/ui | doodleui-react |
|---|---|---|
| Visual philosophy | Neutral modernism — solid lines, crisp edges, designed to disappear into product chrome. | Sketch / organic — rough.js wobble, hachure fills, and draw-in strokes that read as hand-drawn. |
| Theming | CSS variables mapped to Tailwind tokens (--background, --primary, --border, and friends). | CSS variables for sketch + palette (--doodle-ui-roughness, --doodle-ui-stroke-color, …), with optional DoodleUIProvider defaults. |
| Accessibility | Built on Radix UI primitives — keyboard nav, focus management, and WAI-ARIA patterns come with the headless layer. | Same foundation: Radix UI for behavior, real HTML text (not SVG glyphs). A shared strength, not a trade-off. |
| Installation | CLI copies component source into your repo (npx shadcn add …). You own the code. | Same model via CLI (npx doodleui-react add …), plus an optional npm package (doodleui-react) if you prefer a dependency. |
| Bundle & runtime | CSS borders and utilities — no sketch engine. Lean for dense, high-frequency UI. | rough.js generates SVG chrome at runtime. Honest overhead vs solid CSS; mitigated with seed caching and prefers-reduced-motion. |
Using both in one app
Because both libraries lean on Radix UI and CSS variables, they can sit side by side. You do not have to rip out shadcn/ui to try a sketch section.
A common pattern: keep shadcn for the dense shell (nav, tables, settings) and use doodleui-react for a playful slice — onboarding, empty states, milestone modals, or a brainstorming canvas. Scope the sketch tree with DoodleUIProvider:
import { DoodleUIProvider, Button, Card } from "doodleui-react";
import "doodleui-react/styles.css";
export function OnboardingStep() {
return (
<DoodleUIProvider>
<Card title="Welcome">
<p>Sketch UI for this flow only.</p>
<Button>Continue</Button>
</Card>
</DoodleUIProvider>
);
}Install either as a package or via the CLI (npx doodleui-react add …), the same source-copy idea as shadcn. Then tune sketch tokens under Theming.