Uniwind skills
Uniwind
Two skills for React Native with Tailwind v4: Uniwind styling rules and a step-by-step move of a project off NativeWind
- 1,740 ★ on the repository
- Last commit
- MIT
Broad access
Why this level
- The migration skill removes NativeWind packages, the tailwind.config file and type declarations, and changes the Metro and Babel configurations
- The agent runs the package manager and a code search across the project, and clears the Watchman cache when resetting caches
- Installing Uniwind Pro requires logging in through a GitHub account and a paid license
Install
- Works in
Manual install
bun add uniwind tailwindcssThis installs the library itself, as the project description gives it, followed by the installation guides in the docs. It does not install the skills.
Access and checks
How we reviewBroad accessThe tool can change data, run commands or handle secrets.
- The migration skill removes NativeWind packages, the tailwind.config file and type declarations, and changes the Metro and Babel configurations
- The agent runs the package manager and a code search across the project, and clears the Watchman cache when resetting caches
- Installing Uniwind Pro requires logging in through a GitHub account and a paid license
This is third-party code. Review the repository files before installing.
What it does
The Uniwind repository, Tailwind CSS v4 bindings for React Native from the authors of Unistyles, holds a skills folder with two skills for an agent working in projects on this library. The uniwind skill identifies the task type: setup, styling, themes, variants, third-party components, React Navigation or diagnostics. It then opens the right one of nine reference files and checks 14 critical rules. Among them: Tailwind version 4 only, no dynamically built class names, setup in `global.css` in place of `tailwind.config.js`, and `withUniwindConfig` wrapping the Metro configuration on the outside. The migrate-nativewind-to-uniwind skill moves a project off NativeWind in 15 steps. First it reads `package.json`, `tailwind.config`, `metro.config.js`, `babel.config.js` and `global.css`. Then it removes `nativewind` and `react-native-css-interop`, installs Uniwind with Tailwind 4, drops the Babel preset, rewrites the Metro configuration and CSS, removes `cssInterop` and `remapProps`, converts theme variables and checks safe area insets. It ends with a checklist for iOS and Android: themes, fonts and no leftover NativeWind imports. When the agent is unsure about an API, both skills send it to the Uniwind docs in llms-full.txt format instead of guessing.
Who it is for. For mobile developers on React Native and Expo who style screens with Tailwind classes or are moving to Uniwind from NativeWind.
Good fit when
- The agent adds a new screen to an Expo app and must write Uniwind classes by the library's rules
- The project runs on NativeWind and has to move wholly to Uniwind and Tailwind 4
- The color of an `ActivityIndicator` or `Switch` does not change with a class and you need the cause
- You need light, dark and custom themes with the same set of CSS variables
- A third-party component such as expo-image has to get `className` support through `withUniwind`
Not a fit when
- The project is on Tailwind 3: the skill supports version 4 only
- The app is built on React Native below 0.81 or Expo SDK below 54: the skill advises updating first
- The main skill does not handle NativeWind migration: a separate skill in the same repository does
- You need web styling without React Native: the rules cover only mobile components and the Metro bundler
- The app styles already live in Unistyles: the catalog has a React Native Unistyles v3 skill for that
Example request
Move my Expo app from NativeWind to Uniwind and Tailwind 4, and after each step tell me which files changedLimitations
The skill targets Uniwind 1.7.0 and newer, Uniwind Pro 1.2.1 and newer, Tailwind CSS 4, React Native 0.81 and newer and Expo SDK 54 and newer. The `LayoutDirection` component arrived in version 1.8.0, and `ScopedVariables` in 1.11.0.
The repository does not say how to install the skills themselves: you copy the folders from `skills` into the agent's skills directory by hand.
Uniwind Pro is paid: a separate uniwind-pro package with GitHub login, pricing starts at 99 dollars per seat a year, a native rebuild is needed and Expo Go is not supported.
The NativeWind migration changes many files at once: it removes packages, the Tailwind config and type declarations. Start from a clean git branch.
Uniwind has a separate MCP server, but it is not in this repository: the skill only suggests connecting it by the documentation.
How to disable. Delete the uniwind and migrate-nativewind-to-uniwind folders from the agent's skills directory, for example `.claude/skills/`. If you no longer need the library itself, remove `uniwind` from the project dependencies with your package manager.
FAQ
Why does the skill forbid building class names from variables?
Tailwind looks for classes at build time, not while the app runs. A string like `bg-${color}-500` does not exist for the scanner, so the skill requires full strings, lookup objects or ternaries.
What is the accent- prefix for in component colors?
The `color` prop of a button and `ActivityIndicator`, `tintColor` of an image and `thumbColor` of a `Switch` are not part of the style object. They need a prop like `colorClassName` with a class such as `accent-blue-500`, while a plain `text-blue-500` works only on `className`.
Can I wrap View or Pressable in withUniwind?
No, the skill forbids it for react-native and react-native-reanimated components: they already have `className` support built in, and a wrapper breaks behavior. `withUniwind` is for third-party components such as expo-image, expo-blur and moti.
What does the skill say about rem size when migrating from NativeWind?
NativeWind's base size was 14 pixels and Uniwind's default is 16. To keep the old sizes, the skill suggests setting `polyfills: { rem: 14 }` in the Metro configuration.
Why is global.css not imported in index.js?
An import in the entry point breaks hot reload. The file is imported in the app component, for example `App.tsx` or `app/_layout.tsx`, and the folder with this file counts as the app root for the Tailwind scanner.
Do themes need a ThemeProvider component?
No: the theme is changed by calling `Uniwind.setTheme()`. All themes must define the same set of CSS variables, or the app fails at run time.
Discussion
No questions or reviews yet.
Related
SkillsReact Native Unistyles v3 skill
react-native-unistyles-v3
A skill for styling React Native with Unistyles v3: setup, themes, responsive layout, variants and v2 migration
Callstack agent skills for React Native
Callstack Agent Skills
Callstack's React Native skills: performance, version upgrades, native app migration, testing and CI
SwiftUI Design Skill
swiftui-design-skill
A SwiftUI interface design skill: compilable code, tokens, patterns and six rules against AI sloppiness. One-command installation through npx skills
A set of skills for iOS 26+, Swift 6.3 and SwiftUI that gives the agent knowledge of modern Apple frameworks
Buoy MCP lets an agent read a running React Native or Flutter app, tap its screen and inspect the network
Three skills for Claude Code and Cursor: add Storybook v10 to React Native, write CSF stories and upgrade one version step at a time
Comparison with similar tools
Entries that share the main search query, and how they differ.
| Entry | Official | Repository stars | Main difference |
|---|---|---|---|
| Uniwind skills (this entry) | yes | 1,740 | |
| React Native Unistyles v3 skill | no | 2,973 | React Native styling through Unistyles v3: themes, responsive layout, variants and migration from v2 |
| Expo Skills | no | 3,744 | official Expo skills: building, deploying, updating and debugging apps on Expo and EAS |
README in short
The project description is short: a banner, npm badges, the `bun add uniwind tailwindcss` command and links to documentation on themes and the list of supported classes. The feature list covers `className` bindings for every React Native component, styles computed at build time, dark and custom themes, pseudo-classes, responsive media queries and custom CSS properties. The skills folder holds both skills with nine reference files, with AGENTS.md and CONTEXT.md alongside for those working on the library itself, and the contribution rules come down to discussing larger changes first.
README badge
Original SKILL.md
---
name: uniwind
description: >
Uniwind — Tailwind CSS v4 styling for React Native. Use when adding, building,
or debugging components in a React Native project that uses Uniwind classNames.
Covers setup, Metro config, global.css, theming, className props, accent-* color
props, platform/data/state/responsive variants, CSS variables, custom utilities,
withUniwind for third-party components, cn/tailwind-merge, tailwind-variants,
safe area utilities, ScopedVariables, LayoutDirection, gradients, fonts, React Navigation,
UI kits, diagnostics, troubleshooting, and Uniwind Pro features. Does not
cover NativeWind migration.
---
# Uniwind
> Uniwind 1.7.0+ / Uniwind Pro 1.2.1+ / Tailwind CSS v4 / React Native 0.81+ / Expo SDK 54+
If user has lower version, recommend updating to 1.7.0+ (free) / 1.2.1+ (Pro) for best experience.
`LayoutDirection` is available from Uniwind 1.8.0+.
`ScopedVariables` scopes CSS variable overrides to a component subtree and is available from Uniwind 1.11.0+ / Uniwind Pro 1.6.0+.
Uniwind brings Tailwind CSS v4 to React Native. All core React Native components support the `className` prop out of the box. Styles are compiled at build time — no runtime overhead.
## Critical Rules
1. **Tailwind v4 only** — Use `@import 'tailwindcss'` not `@tailwind base`. Tailwind v3 is not supported.
2. **Never construct classNames dynamically** — Tailwind scans at build time. `bg-${color}-500` will NOT work. Use complete string literals, mapping objects, or ternaries.
3. **Never use `cssInterop` or `remapProps`** — Those are NativeWind APIs. Uniwind does not override global components.
4. **No `tailwind.config.js`** — All config goes in `global.css` via `@theme` and `@layer theme`.
5. **No ThemeProvider required** — Use `Uniwind.setTheme()` directly.
6. **`withUniwindConfig` must be the outermost** Metro config wrapper.
7. **NEVER wrap `react-native` or `react-native-reanimated` components with `withUniwind`** — `View`, `Text`, `Pressable`, `Image`, `TextInput`, `ScrollView`, `FlatList`, `Switch`, `Modal`, `Animated.View`, `Animated.Text`, etc. already have full `className` support built in. Wrapping them with `withUniwind` will break behavior. Only use `withUniwind` for **third-party** components (e.g., `expo-image`, `expo-blur`, `moti`).
8. **Font families: single font only** — React Native doesn't support fallbacks. Use `--font-sans: 'Roboto-Regular'` not `'Roboto', sans-serif`.
9. **All theme variants must define the same set of CSS variables** — If `light` defines `--color-primary`, then `dark` and every custom theme must too. Mismatched variables cause runtime errors.
10. **`accent-` prefix is REQUIRED for non-style color props** — This is crucial. Props like `color` (Button, ActivityIndicator), `tintColor` (Image), `thumbColor` (Switch), `placeholderTextColor` (TextInput) are NOT part of the `style` object. You MUST use the corresponding `{propName}ClassName` prop with `accent-` prefixed classes. Example: `<ActivityIndicator colorClassName="accent-blue-500" />` NOT `<ActivityIndicator className="text-blue-500" />`. Regular Tailwind color classes (like `text-blue-500`) only work on `className` (which maps to `style`). For non-style color props, always use `accent-`.
11. **rem default is 16px** — NativeWind used 14px. Set `polyfills: { rem: 14 }` in metro config if migrating.
12. **`cssEntryFile` must be a relative path string** — Use `'./global.css'` not `path.resolve(__dirname, 'global.css')`.
13. **Deduplicate with `cn()` when mixing custom CSS classes and Tailwind** — Uniwind does NOT auto-deduplicate. If a custom CSS class (`.card { padding: 16px }`) and a Tailwind utility (`p-6`) set the same property, both apply with unpredictable results. Always wrap with `cn('card', 'p-6')` when there's overlap.