Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android rendered from React in an Expo or React Native app. Covers universal cross-platform components (Host, Column, Row, Button, Text, List, and more imported from @expo/ui), drop-in replacements...
.claude/skills/sickn33-expo-ui/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -14% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 63% | 0% |
@expo/ui)Use this skill when you need build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android rendered from React in an Expo or React Native app. Covers universal cross-platform components (Host, Column, Row, Button, Text, List, and more imported from @expo/ui), drop-in replacements...
@expo/ui renders real native UI from React: SwiftUI on iOS, Jetpack Compose on Android. Start with its universal components (one tree for iOS, Android, and web) and drop to platform-specific SwiftUI/Jetpack Compose only when the universal layer falls short. It also ships drop-in replacements for migrating off RN community UI libraries.
> These instructions track the latest Expo SDK. The universal layer requires SDK 56+. Drop-in replacements and the platform-specific layers also exist on SDK 55. For component details on a specific SDK, refer to the Expo UI docs for that version.
bashnpx expo install @expo/ui
On SDK 56, @expo/ui works in Expo Go, so npx expo start runs it directly — no custom build required. On older SDKs, build a dev client first (npx expo run:ios / npx expo run:android).
Every @expo/ui tree — universal or platform-specific — must be wrapped in Host.
Work down this list and stop at the first layer that meets the need:
@expo/ui root. One component tree runs unmodified on iOS, Android, and web from a single source (Compose on Android, SwiftUI on iOS, react-native-web/react-dom on web). No platform file splits. → ./references/universal.md@expo/ui/swift-ui or @expo/ui/jetpack-compose. Use only when the universal layer is missing a component or modifier you need, or when you need platform-specific behavior or optimization. Downside: you write two trees and split them into .ios.tsx / .android.tsx files (or branch on Platform.OS) — more code to maintain.> @expo/ui/swift-ui is iOS-only. @expo/ui/jetpack-compose is Android-only. Importing either in a file that runs on the other platform will crash at runtime with "Unable to get view config" errors. Isolate platform-specific trees in .ios.tsx / .android.tsx files placed in components/ (never inside app/ — Expo Router does not support platform extensions for route files), or guard with Platform.OS in a regular route file. Host must always be imported from @expo/ui (the universal package root), not from the platform-specific sub-packages. → ./references/swift-ui.md and ./references/jetpack-compose.md
Already using an RN community UI library? @expo/ui also ships drop-in replacements — API-compatible swaps for popular libraries (@gorhom/bottom-sheet, @react-native-community/datetimepicker, and more), imported from @expo/ui/community/<name>. This is a migration side-path for replacing an existing dependency, not a step in the universal-vs-platform decision above. → ./references/drop-in-replacements.md
Consult these resources as needed:
references/
universal.md Universal @expo/ui components and when to use them (SDK 56+)
drop-in-replacements.md API-compatible replacements for RN community UI libraries
swift-ui.md Platform-specific iOS UI: @expo/ui/swift-ui components, modifiers, RNHostView, useNativeState
jetpack-compose.md Platform-specific Android UI: @expo/ui/jetpack-compose components, modifiers, LazyColumn caveat, icons, useNativeState| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,562 | 6,743 | -42% | 1 | 1 | 0% | 2,177 | 2,430 | +12% | 0 | 0 | — |
case-02 | fail→pass | 21,124 | 11,768 | -44% | 1 | 1 | 0% | 4,059 | 3,479 | -14% | 0 | 0 | — |
case-03 | fail→pass | 10,416 | 6,258 | -40% | 1 | 1 | 0% | 1,844 | 2,277 | +23% | 0 | 0 | — |
case-04 | pass→pass | 26,853 | 18,341 | -32% | 1 | 1 | 0% | 4,888 | 4,396 | -10% | 0 | 0 | — |
case-05 | pass→pass | 16,912 | 11,462 | -32% | 1 | 1 | 0% | 3,166 | 3,071 | -3% | 0 | 0 | — |
case-06 | pass→pass | 12,471 | 8,492 | -32% | 1 | 1 | 0% | 2,260 | 2,541 | +12% | 0 | 0 | — |
case-07 | fail→pass | 11,045 | 8,149 | -26% | 1 | 1 | 0% | 1,735 | 2,382 | +37% | 0 | 0 | — |
case-08 | pass→pass | 9,495 | 5,509 | -42% | 1 | 1 | 0% | 1,531 | 1,944 | +27% | 0 | 0 | — |
case-09 | fail→pass | 4,799 | 2,402 | -50% | 1 | 1 | 0% | 818 | 1,331 | +63% | 0 | 0 | — |
case-10 | fail→pass | 10,982 | 3,876 | -65% | 1 | 1 | 0% | 1,392 | 1,683 | +21% | 0 | 0 | — |
case-11 | fail→pass | 6,971 | 4,182 | -40% | 1 | 1 | 0% | 1,108 | 1,720 | +55% | 0 | 0 | — |
case-12 | fail→pass | 12,875 | 7,648 | -41% | 1 | 1 | 0% | 2,245 | 2,470 | +10% | 0 | 0 | — |
case-13 | fail→pass | 9,365 | 8,063 | -14% | 1 | 1 | 0% | 1,459 | 2,604 | +78% | 0 | 0 | — |
case-14 | fail→pass | 14,806 | 6,841 | -54% | 1 | 1 | 0% | 2,352 | 2,125 | -10% | 0 | 0 | — |
case-15 | fail→pass | 5,798 | 1,957 | -66% | 1 | 1 | 0% | 1,033 | 1,332 | +29% | 0 | 0 | — |
case-16 | pass→pass | 5,058 | 1,851 | -63% | 1 | 1 | 0% | 802 | 1,273 | +59% | 0 | 0 | — |
case-17 | pass→pass | 10,703 | 3,125 | -71% | 1 | 1 | 0% | 1,708 | 1,537 | -10% | 0 | 0 | — |
case-18 | fail→pass | 11,300 | 3,949 | -65% | 1 | 1 | 0% | 1,594 | 1,532 | -4% | 0 | 0 | — |
case-19 | fail→pass | 11,327 | 4,039 | -64% | 1 | 1 | 0% | 1,862 | 1,722 | -8% | 0 | 0 | — |
case-20 | fail→pass | 12,907 | 5,649 | -56% | 1 | 1 | 0% | 2,286 | 1,825 | -20% | 0 | 0 | — |
case-21 | pass→pass | 10,535 | 4,327 | -59% | 1 | 1 | 0% | 1,634 | 1,628 | -0% | 0 | 0 | — |
case-22 | fail→pass | 11,590 | 4,894 | -58% | 1 | 1 | 0% | 1,958 | 1,838 | -6% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +68 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.