Why Styling Matters More Than Ever in React Native
Styling in React Native has quietly gone through a revolution. For years, we relied on the built-in StyleSheet.create API and just accepted its limitations — no media queries, no CSS variables, no pseudo-classes, and no shared styling language between web and native. In 2026, that's completely changed.
Three libraries have emerged as the dominant forces shaping how teams style their React Native apps: NativeWind, which brings Tailwind CSS to mobile; Unistyles, which supercharges the native StyleSheet with a C++ engine; and Tamagui, which offers a full universal design system with an optimizing compiler.
Each takes a fundamentally different approach, and honestly, choosing the right one can dramatically affect your developer experience, app performance, and code maintainability.
This guide gives you a hands-on comparison of all three with real code examples, performance insights, and practical advice on when to reach for each one. Whether you're starting a new project or migrating an existing codebase, you'll walk away knowing exactly which styling solution fits your needs.
The Foundation: React Native's Built-In StyleSheet
Before diving into third-party solutions, it's worth understanding what the built-in StyleSheet API provides and where it falls short. This context makes the value of each library much clearer.
import { StyleSheet, View, Text } from 'react-native';
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#ffffff',
},
title: {
fontSize: 24,
fontWeight: 'bold',
color: '#1a1a2e',
},
});
export function HomeScreen() {
return (
<View style={styles.container}>
<Text style={styles.title}>Welcome</Text>
</View>
);
}
StyleSheet.create() registers styles once and returns stable references, avoiding object recreation on every render. It validates property names at creation time and gives you clean separation between structure and styling. With the New Architecture now mandatory in React Native 0.82+, StyleSheet objects communicate through JSI rather than the old JSON bridge, making style resolution noticeably faster.
But the built-in API has some real gaps:
- No media queries or breakpoints — responsive design requires manual
Dimensionslisteners - No CSS variables — theming demands custom context providers and re-renders
- No pseudo-classes — hover, focus, and active states need event handlers
- No dark mode primitives — toggling themes forces full component tree re-renders
- No utility-first workflow — every style needs a named object and a separate declaration
These limitations are precisely what NativeWind, Unistyles, and Tamagui set out to solve — each in their own way.
NativeWind: Tailwind CSS for React Native
NativeWind brings the utility-first workflow of Tailwind CSS to React Native. If your team already uses Tailwind on the web, NativeWind lets you use the exact same class names across platforms. With over 500,000 weekly npm downloads, it's easily the most widely adopted styling library in the React Native ecosystem right now.
How NativeWind Works
NativeWind operates in two phases. At build time, it compiles your Tailwind CSS utility classes into StyleSheet.create objects and figures out the conditional logic for responsive styles. At runtime, a minimal engine applies reactive styles — things like device orientation changes, color scheme switches, or container dimension updates — without recompiling anything.
On the web, NativeWind skips injecting a JavaScript-based stylesheet entirely. It reuses the existing Tailwind CSS stylesheet instead, which enables server-side rendering and faster initial page loads. Pretty clever.
Setting Up NativeWind v4 with Expo
Install NativeWind and its peer dependencies:
npx expo install nativewind tailwindcss react-native-reanimated react-native-safe-area-context
Configure your metro.config.js:
const { getDefaultConfig } = require('expo/metro-config');
const { withNativeWind } = require('nativewind/metro');
const config = getDefaultConfig(__dirname);
module.exports = withNativeWind(config, { input: './global.css' });
Create a global.css file with your Tailwind directives:
@tailwind base;
@tailwind components;
@tailwind utilities;
Initialize your tailwind.config.js:
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./app/**/*.{js,jsx,ts,tsx}', './components/**/*.{js,jsx,ts,tsx}'],
presets: [require('nativewind/preset')],
theme: {
extend: {},
},
plugins: [],
};
And finally, import the global CSS in your root layout:
// app/_layout.tsx
import '../global.css';
import { Stack } from 'expo-router';
export default function RootLayout() {
return <Stack />;
}
Using NativeWind in Components
With NativeWind configured, you style components using the familiar className prop:
import { View, Text, Pressable } from 'react-native';
export function ProductCard({ title, price, onPress }) {
return (
<Pressable
onPress={onPress}
className="bg-white rounded-2xl p-4 shadow-md active:scale-95 active:opacity-80"
>
<View className="flex-row justify-between items-center">
<Text className="text-lg font-semibold text-gray-900">
{title}
</Text>
<Text className="text-base font-bold text-blue-600">
${price}
</Text>
</View>
</Pressable>
);
}
NativeWind supports pseudo-classes like active:, hover:, and focus:, media queries via standard Tailwind breakpoints (sm:, md:, lg:), container queries, and CSS variables — all compiled at build time for optimal performance.
Dark Mode and Theming with NativeWind
NativeWind really excels at theming through CSS variables. Define your design tokens in global.css:
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
--color-background: 255 255 255;
--color-surface: 245 245 245;
--color-text-primary: 26 26 46;
--color-text-secondary: 107 114 128;
--color-accent: 0 122 255;
}
@media (prefers-color-scheme: dark) {
:root {
--color-background: 28 28 30;
--color-surface: 44 44 46;
--color-text-primary: 255 255 255;
--color-text-secondary: 174 174 178;
--color-accent: 10 132 255;
}
}
Then map these variables in tailwind.config.js:
module.exports = {
content: ['./app/**/*.{js,jsx,ts,tsx}', './components/**/*.{js,jsx,ts,tsx}'],
presets: [require('nativewind/preset')],
theme: {
extend: {
colors: {
background: 'rgb(var(--color-background) / <alpha-value>)',
surface: 'rgb(var(--color-surface) / <alpha-value>)',
'text-primary': 'rgb(var(--color-text-primary) / <alpha-value>)',
'text-secondary': 'rgb(var(--color-text-secondary) / <alpha-value>)',
accent: 'rgb(var(--color-accent) / <alpha-value>)',
},
},
},
plugins: [],
};
Now your components automatically adapt to the system color scheme:
export function SettingsScreen() {
return (
<View className="flex-1 bg-background p-4">
<Text className="text-2xl font-bold text-text-primary mb-2">
Settings
</Text>
<Text className="text-base text-text-secondary">
Manage your preferences
</Text>
<Pressable className="mt-6 bg-accent rounded-xl py-3 px-6">
<Text className="text-white text-center font-semibold">
Save Changes
</Text>
</Pressable>
</View>
);
}
No dark: prefix clutter. No conditional logic. The design tokens resolve automatically based on the user's system preference, and NativeWind handles the switch without triggering re-renders in the JavaScript layer. It's the kind of thing that just works once you set it up.
NativeWind v5 Preview
NativeWind v5 is currently in preview and brings several improvements. The cssInterop and remapProps APIs have been replaced with a unified styled API, setup is simpler with fewer required Metro and Babel configurations, and Tailwind features like spacing, rem scaling, transitions, and theme functions align more closely with their browser counterparts. You can try it today with npx rn-new@next --nativewind, though it's not yet recommended for production use.
Unistyles 3: The C++ Styling Engine
Unistyles 3 takes a completely different approach. Rather than bringing a web styling paradigm to native, it enhances React Native's own StyleSheet API with a high-performance C++ core. The result is a styling system that feels instantly familiar to React Native developers while delivering features that previously required complex workarounds.
The Zero Re-Render Architecture
The headline feature of Unistyles 3 is its ability to update styles without triggering React re-renders. When you reference a theme or responsive value in a style, Unistyles stores that dependency at the C++ level. When something relevant changes — a theme toggle, orientation shift, or screen resize — Unistyles recomputes and updates only the affected styles directly on the native shadow tree, completely bypassing the React reconciler.
Think of it like how CSS works in a browser: changing a CSS variable updates all elements that reference it without re-executing JavaScript. In benchmarks, Unistyles can render 1,000 themed views in roughly 46.5 milliseconds. That's seriously fast.
Requirements and Installation
Unistyles 3 requires the New Architecture (Fabric) and React Native 0.78 or later. It depends on react-native-nitro-modules for its C++ bridge and react-native-edge-to-edge for immersive UI support.
npx expo install react-native-unistyles react-native-nitro-modules react-native-edge-to-edge
Unlike many styling libraries, Unistyles 3 requires no React Provider, no wrapper components, and no hooks to consume styles. It integrates at the native level and works immediately after installation. I've gotta say, this is one of the smoothest setup experiences you'll find.
Configuring Themes
Define your themes in a configuration file:
// styles/unistyles.ts
import { StyleSheet } from 'react-native-unistyles';
const spacing = (size: number) => size * 4;
const radius = (size: number) => size * 4;
const utils = { spacing, radius };
export const lightTheme = {
colors: {
primary: '#007AFF',
background: '#ffffff',
surface: '#f5f5f5',
textPrimary: '#1a1a2e',
textSecondary: '#6b7280',
error: '#ed3e3e',
},
utils,
};
export const darkTheme = {
colors: {
primary: '#4da6ff',
background: '#1c1c1e',
surface: '#2c2c2e',
textPrimary: '#ffffff',
textSecondary: '#aeaeb2',
error: '#fa645c',
},
utils,
};
StyleSheet.configure({
themes: {
light: lightTheme,
dark: darkTheme,
},
settings: {
adaptiveThemes: true,
},
});
// Type augmentation for full IntelliSense
type AppThemes = {
light: typeof lightTheme;
dark: typeof darkTheme;
};
declare module 'react-native-unistyles' {
export interface UnistylesThemes extends AppThemes {}
}
With adaptiveThemes: true, Unistyles automatically syncs with the OS appearance setting. No extra wiring needed.
Writing Styles with Theme Access
Unistyles uses the same StyleSheet.create API you already know, but with an enhanced callback signature:
import { View, Text, Pressable } from 'react-native';
import { StyleSheet } from 'react-native-unistyles';
export function ProfileCard({ name, email, onEdit }) {
return (
<View style={styles.card}>
<Text style={styles.name}>{name}</Text>
<Text style={styles.email}>{email}</Text>
<Pressable onPress={onEdit} style={styles.button}>
<Text style={styles.buttonText}>Edit Profile</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create((theme, rt) => ({
card: {
backgroundColor: theme.colors.surface,
borderRadius: theme.utils.radius(4),
padding: theme.utils.spacing(4),
marginHorizontal: theme.utils.spacing(4),
},
name: {
fontSize: 20,
fontWeight: '700',
color: theme.colors.textPrimary,
},
email: {
fontSize: 14,
color: theme.colors.textSecondary,
marginTop: theme.utils.spacing(1),
},
button: {
backgroundColor: theme.colors.primary,
borderRadius: theme.utils.radius(3),
paddingVertical: theme.utils.spacing(3),
marginTop: theme.utils.spacing(4),
alignItems: 'center',
},
buttonText: {
color: '#ffffff',
fontSize: 16,
fontWeight: '600',
},
}));
The callback receives the current theme and a rt (runtime) object that gives you access to screen dimensions, orientation, insets, pixel ratio, and other device metadata. When the user toggles dark mode, the card's colors update instantly — directly in C++ — without the React component re-rendering at all.
Responsive Styles and Breakpoints
Unistyles provides orientation-based responsive values out of the box:
const styles = StyleSheet.create((theme, rt) => ({
grid: {
flexDirection: {
portrait: 'column',
landscape: 'row',
},
padding: theme.utils.spacing(4),
gap: theme.utils.spacing(2),
},
sidebar: {
width: {
portrait: '100%',
landscape: 280,
},
backgroundColor: theme.colors.surface,
},
}));
You can also define custom breakpoints for finer-grained control. Each breakpoint triggers a recalculation at the C++ level — no React re-render involved.
Variants and Compound Variants
Unistyles supports style variants, letting you define multiple visual states for a component:
const styles = StyleSheet.create((theme) => ({
badge: {
paddingVertical: theme.utils.spacing(1),
paddingHorizontal: theme.utils.spacing(3),
borderRadius: theme.utils.radius(4),
variants: {
type: {
success: { backgroundColor: '#34C759' },
warning: { backgroundColor: '#FF9500' },
error: { backgroundColor: theme.colors.error },
},
size: {
small: { paddingVertical: 2, paddingHorizontal: 8 },
large: { paddingVertical: 8, paddingHorizontal: 16 },
},
},
compoundVariants: [
{
type: 'error',
size: 'large',
styles: { borderWidth: 2, borderColor: '#ff0000' },
},
],
},
}));
Compound variants let you apply additional styles only when specific variant combinations are active. This is excellent for building sophisticated component libraries where you need that level of granularity.
Tamagui: The Universal Design System
Tamagui is the most ambitious of the three. Rather than just solving styling, it provides a complete ecosystem: a universal style engine, an optimizing compiler, and a library of pre-built UI components that work identically across iOS, Android, and the web.
It's a lot. But if your project needs it, nothing else comes close.
The Three Pillars
Tamagui is built around three core packages:
- @tamagui/core — A universal style system providing a typed superset of the React Native style API, weighing roughly 24KB with no external dependencies
- @tamagui/static — An optimizing compiler that extracts styles into atomic CSS on the web, flattens component trees, and eliminates dead code
- @tamagui/ui — A suite of composable, accessible UI components (buttons, dialogs, sheets, forms, and more) that render natively on every platform
Setting Up Tamagui
The fastest way to start is with the official template:
npm create tamagui@latest
For an existing project, install the core packages:
npx expo install @tamagui/core @tamagui/config
Create your Tamagui configuration:
// tamagui.config.ts
import { createTamagui } from '@tamagui/core';
import { config } from '@tamagui/config/v3';
const tamaguiConfig = createTamagui(config);
export default tamaguiConfig;
export type Conf = typeof tamaguiConfig;
declare module '@tamagui/core' {
interface TamaguiCustomConfig extends Conf {}
}
Wrap your app in the Tamagui provider:
// app/_layout.tsx
import { TamaguiProvider } from '@tamagui/core';
import tamaguiConfig from '../tamagui.config';
export default function RootLayout() {
return (
<TamaguiProvider config={tamaguiConfig}>
<Stack />
</TamaguiProvider>
);
}
Styling with Tamagui's Core API
Tamagui extends React Native's style properties with web-inspired shortcuts and powerful responsive tokens:
import { styled, View, Text } from '@tamagui/core';
const Card = styled(View, {
backgroundColor: '$surface',
borderRadius: '$4',
padding: '$4',
marginHorizontal: '$4',
shadowColor: '$shadowColor',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 8,
elevation: 3,
variants: {
elevated: {
true: {
shadowOpacity: 0.2,
shadowRadius: 16,
elevation: 6,
},
},
},
});
const Title = styled(Text, {
fontSize: '$6',
fontWeight: '700',
color: '$textPrimary',
});
const Subtitle = styled(Text, {
fontSize: '$3',
color: '$textSecondary',
marginTop: '$1',
});
export function EventCard({ title, date, elevated = false }) {
return (
<Card elevated={elevated}>
<Title>{title}</Title>
<Subtitle>{date}</Subtitle>
</Card>
);
}
The $ prefix references tokens from your theme configuration. Tamagui resolves these at compile time when possible, eliminating runtime lookups entirely.
Responsive and Platform-Specific Styles
Tamagui uses a consistent pattern for all conditional styles with the $ prefix:
import { styled, View, Text } from '@tamagui/core';
const ResponsiveContainer = styled(View, {
padding: '$4',
flexDirection: 'column',
// Screen-size-based responsive styles
$gtMd: {
flexDirection: 'row',
padding: '$6',
},
// Platform-specific styles
$platform-ios: {
shadowColor: '#000',
shadowOpacity: 0.1,
shadowRadius: 8,
},
$platform-android: {
elevation: 4,
},
// Theme-specific styles
'$theme-dark': {
borderWidth: 1,
borderColor: '$borderColorDark',
},
});
This unified pattern — screen size, platform, theme, and group context all sharing the same $ prefix syntax — makes Tamagui's responsive API surprisingly consistent and readable once you get used to it.
The Optimizing Compiler
Tamagui's compiler (@tamagui/static) is what really separates it from the pack. During the build step, it performs four key optimizations:
- Atomic CSS extraction — Converts styles into atomic CSS classes on the web, minimizing stylesheet size
- Partial evaluation — Evaluates style expressions at build time and hoists them out of the render path
- Tree flattening — Replaces deeply nested styled components with flat
divorViewprimitives - Dead code elimination — Removes unused style branches and variant code from the final bundle
In real-world benchmarks, apps built with Tamagui's compiler load 30–40% faster than those using traditional React Native UI libraries. The gains are most noticeable on the web, where atomic CSS and tree flattening drastically reduce both download size and rendering time.
Pre-Built Components
Unlike NativeWind and Unistyles, Tamagui ships a full component library. Components like Button, Dialog, Sheet, Select, Tabs, and Toast are available out of the box — fully themed and accessible:
import { Button, H2, Paragraph, YStack } from 'tamagui';
export function WelcomeScreen({ onGetStarted }) {
return (
<YStack flex={1} justifyContent="center" alignItems="center" padding="$6" backgroundColor="$background">
<H2 color="$textPrimary">Welcome</H2>
<Paragraph color="$textSecondary" textAlign="center" marginTop="$3">
Build beautiful cross-platform apps with Tamagui
</Paragraph>
<Button
size="$5"
theme="blue"
marginTop="$6"
onPress={onGetStarted}
>
Get Started
</Button>
</YStack>
);
}
This is a huge advantage for teams that want to move fast without building every component from scratch. You get a solid foundation to build on (and customize) from day one.
Head-to-Head Comparison
Now that you've seen each library in action, let's break down how they compare across the dimensions that matter most.
Developer Experience
NativeWind wins for teams already using Tailwind CSS. The learning curve is nearly flat — you write the same utility classes you use on the web. IntelliSense via the Tailwind CSS VS Code extension works seamlessly too.
Unistyles wins for React Native purists. Its API is a direct superset of StyleSheet.create, so there's really nothing new to learn beyond the theme callback and the runtime object. If your team already writes idiomatic React Native styles, Unistyles enhances that workflow without replacing it.
Tamagui has the steepest learning curve, no question. The extensive token system, compiler configuration, and styled() factory pattern take time to internalize. But the payoff is substantial: a complete design system with typed tokens, responsive utilities, and pre-built components.
Performance Characteristics
NativeWind compiles Tailwind utilities into StyleSheet.create objects at build time, resulting in minimal runtime overhead. On the web, it reuses the Tailwind CSS stylesheet directly — no JavaScript style injection needed. The runtime layer is small and only kicks in for reactive styles like dark mode or orientation changes.
Unistyles runs its core logic in C++ through Nitro Modules, making style computations extremely fast. Its zero re-render architecture means theme changes, breakpoint shifts, and orientation updates happen entirely outside React's reconciliation cycle. This gives it a measurable edge in scenarios with frequent style updates.
Tamagui achieves its performance primarily through compile-time optimizations. The static compiler eliminates runtime style computation wherever possible. On the web, atomic CSS extraction produces tiny stylesheets. On native, tree flattening reduces the number of native views the renderer has to manage.
Ecosystem and Integration
NativeWind integrates cleanly with the broader Tailwind ecosystem. Libraries like gluestack UI v3 and React Native Reusables provide pre-built accessible components styled with NativeWind, so you get component library productivity without being locked into a specific design system.
Unistyles is designed to mix with React Native's built-in StyleSheet — you can adopt it incrementally on a per-screen basis. Its plugin system allows extending styling behavior, and its web support generates real CSS classes, making it viable for universal apps.
Tamagui provides the most complete out-of-the-box experience with its component library, but this comes with tighter coupling. Migrating away from Tamagui is more involved than migrating from NativeWind or Unistyles because your components, styles, and tokens are all part of Tamagui's abstraction. It's something worth thinking about upfront.
Summary Table
| Criteria | NativeWind | Unistyles 3 | Tamagui |
|---|---|---|---|
| Paradigm | Utility classes (Tailwind) | Enhanced StyleSheet | CSS-in-JS + UI Kit |
| NPM Downloads | ~517K/week | ~69K/week | ~75K/week |
| Minimum RN Version | 0.72+ | 0.78+ (New Arch required) | 0.72+ |
| Pre-Built Components | No (use ecosystem libraries) | No | Yes (comprehensive UI kit) |
| Re-Render on Theme Change | Minimal (CSS variables) | None (C++ engine) | Minimal (compiler optimized) |
| Compiler Optimization | Build-time (LightningCSS) | C++ native engine | Babel static compiler |
| Web Support | Yes (native CSS) | Yes (CSS classes) | Yes (atomic CSS) |
| Learning Curve | Low (if you know Tailwind) | Low (if you know StyleSheet) | Medium-High |
| Dark Mode | CSS variables / media query | Adaptive themes (C++) | Theme provider / tokens |
| Variants | Via class composition | Built-in + compound | Built-in via styled() |
Choosing the Right Library for Your Project
With a clear picture of each library's strengths and trade-offs, here are some practical recommendations based on common scenarios.
Choose NativeWind If:
- Your team already uses Tailwind CSS on the web and wants a consistent styling language across platforms
- You're building a mobile-first app and want rapid prototyping with utility classes
- You prefer a lightweight styling layer and want to pick your own component library
- You want the largest community and the most third-party resources available
Choose Unistyles If:
- You want maximum performance with zero re-renders on style changes
- You prefer the familiar
StyleSheet.createAPI without learning a new paradigm - You're building a highly customized UI and need fine-grained control over every style
- Your project already runs on the New Architecture and you want deep native integration
- You want to adopt a styling library incrementally, mixing it with existing styles
Choose Tamagui If:
- You're building a truly universal app targeting iOS, Android, and web from one codebase
- You want a complete design system with pre-built, accessible components out of the box
- Web performance is critical and you need atomic CSS extraction and tree flattening
- Your team has the bandwidth to learn a more complex (but more powerful) abstraction
Can You Combine Them?
In practice, it's uncommon to use more than one of these libraries in the same project. Each provides a comprehensive styling solution, and mixing them adds complexity without clear benefits. That said, Unistyles 3 is explicitly designed to coexist with StyleSheet.create, making it the easiest to adopt incrementally. Tamagui and NativeWind each expect to be the primary styling solution in your project.
Migrating from Built-In StyleSheet
If you've got an existing app using the built-in StyleSheet API, here's how each library handles the transition.
NativeWind requires the most significant rewrite. You're replacing style={styles.container} with className="flex-1 p-4 bg-white". While the mental model shift is real, the resulting code is typically more concise. My suggestion: start with new components and screens, then migrate existing ones as you touch them.
Unistyles offers the smoothest migration path, hands down. Replace your import from react-native to react-native-unistyles, add a theme callback to your StyleSheet.create calls, and you're done. Existing styles continue to work. You can enhance them with theme access and responsive features one file at a time.
Tamagui requires replacing both your styling approach and your component primitives. Instead of View and Text from react-native, you use Tamagui's versions. This is a deeper migration — best suited for new projects or major refactors where you're already planning to rethink your component architecture.
Looking Ahead: What to Watch
The React Native styling ecosystem continues to evolve at a rapid pace. Here are a few developments worth keeping an eye on:
- NativeWind v5 is in preview with a simplified setup and tighter Tailwind alignment. Its new
styledAPI replacescssInteropandremapProps, and shadow styles now use theboxShadowproperty. A stable release is expected sometime in 2026. - Uniwind, an upcoming project from the creator of Unistyles, aims to combine Unistyles' C++ performance engine with Tailwind's utility-first syntax. If it delivers on this promise, it could bridge the two most popular approaches in the ecosystem — which would be pretty exciting.
- StyleX, Meta's own styling solution originally built for Facebook and Instagram, is gaining traction across the React ecosystem. Its React Native integration is still maturing, but the atomic CSS-in-JS approach and build-time compilation make it a potential long-term contender.
- React Native's New Architecture (now mandatory in 0.82+) enables all three libraries to deliver better performance through JSI-based style resolution and direct shadow tree access. Libraries that lean into this architecture — like Unistyles with its C++ core — will keep pushing the performance envelope.
Conclusion
React Native styling in 2026 isn't about working around limitations anymore — it's about choosing the right tool for your team and your project.
NativeWind brings the web's most popular styling framework to mobile. Unistyles pushes the boundaries of native performance. And Tamagui delivers a complete cross-platform design system.
The best choice really depends on your team's existing skills, your app's platform targets, and how much of the styling stack you want your library to own. If your team thinks in Tailwind, go with NativeWind. If your team thinks in React Native StyleSheet and wants raw speed, Unistyles is your pick. If you want a full design system with compiler-level optimizations, Tamagui's the answer.
Whichever you choose, you're working with mature, well-supported tools that understand the modern React Native architecture. Start with a small prototype, validate the developer experience with your team, and scale from there.