otf-kit vs Tamagui — primitives vs full design system
Pick Tamagui if you want raw primitives and full control to design every component yourself. Pick otf-kit if you want Tamagui's cross-platform engine plus 80 designed native components, web parity, and a full-stack kit.
TL;DR
Tamagui is the engine behind otf-kit's React Native side. It's the cross-platform styling system that solved the "Tailwind for React Native" problem before NativeWind existed — single style API, true compile-time optimization, parity primitives across web and native.
The honest comparison isn't "Tamagui or otf-kit" — it's "do you want to assemble the design layer yourself, or use one we already shipped?" Tamagui gives you the engine and ~30 unstyled primitives. otf-kit ships 80 designed components on top, plus 17 themes, plus web parity via Radix, plus paid kits.
Feature matrix
| otf-kit | Tamagui | |
|---|---|---|
| Layer | Full design system | Engine + primitives only |
| Platforms | Web + iOS + Android | Web + iOS + Android |
| Component count | 198+ web · 80+ native | ~30 primitives |
| Designed themes | 17 picker-driven themes | Theme system + a single starter |
| Compile-time optimization | Inherits Tamagui's static extraction | Yes — the original implementation |
| Web rendering | Radix primitives where useful | Tamagui primitives |
| Full-stack kits | SaaS Dashboard ($149) · Fitness ($149) | None |
| Pricing | SDK free · Kits $149 each | Free, MIT |
When Tamagui wins
- You want to build your own design system from scratch on the cross-platform engine. Tamagui's
createTokens+styled()API is the canonical path. - You want the smallest possible runtime — using just Tamagui's primitives gives you the leanest universal RN+web bundle.
- You're a library author building reusable cross-platform components.
- You don't need themes or kits — engine + primitives is enough.
When otf-kit wins
- You want 80+ designed native components out of the box, not just primitives. We did the design work.
- You want 17 swappable themes picker-driven (Linear, Glass, Midnight, etc.), not a tokens object you fill in yourself.
- You want web-and-native parity via Radix on the web side. Tamagui can render to web but Radix is more battle-tested for web accessibility.
- You want a full-stack starting point — our paid kits include Hono server + Drizzle ORM + Better Auth + Stripe + demo data.
What's identical
The React Native side of otf-kit IS Tamagui under the hood. Every native component uses styled() from @tamagui/core, the theme system is Tamagui's, the cross-platform compilation is Tamagui's. If you've used Tamagui, the otf-kit native API will feel native within minutes.
If you need to drop down to raw Tamagui for something custom, you can — @tamagui/core is a peer dependency.
Code comparison — Button on native
// Tamagui — primitive, you bring the design
import { Button } from 'tamagui'
<Button size="$4" theme="active">Click me</Button>// otf-kit — Tamagui primitive + designed shell
import { Button } from '@otfdashkit/ui-native'
<Button variant="default" size="md">Click me</Button>The web side trades Tamagui for Radix:
// otf-kit on web
import { Button } from '@otfdashkit/ui'
<Button variant="default" size="md">Click me</Button>Same prop API across platforms.
When you want both
It's not "either-or" — most teams use otf-kit's designed components for the 80% case and drop to raw Tamagui when they need a custom interaction. Both ship side by side and share the same theme tokens.
FAQ
Why Radix on web instead of Tamagui's web target? Tamagui can render to web, but Radix has been the accessibility/keyboard-nav standard for years on web specifically. Using Radix on web + Tamagui on native gets us the best-of-both — Radix's web pedigree, Tamagui's RN pedigree.
Can I write Tamagui styled() components alongside otf-kit?
Yes — they share the same theme tokens. You can wrap otf-kit components in Tamagui's styled() factory.
Does otf-kit's themes work with raw Tamagui components?
Yes — both consume the same createTokens() output. Drop a <Theme> from @tamagui/core and otf-kit components inherit it.
Try otf-kit
The free SDK works for unlimited components on web + native.