expo-native-ui
Skill1 starsChanged 19 days agoMITView on GitHub
Framework (OSS). Build beautiful, native-feeling Expo screens. Covers Apple HIG styling, semantic colors, native controls, SF Symbols, media, animations, visual effects, gradients, storage, and responsive layout. For routing and navigation, use the expo-router skill.
- Reads credentials
5 other projects use a version of this, 4 of them edited.
Adopted by
Most recently taken up by
- dalonga-kohi/mawledited, first seen Nov 8, 2026
- deonmenezes/mobile-app-skilledited, first seen Nov 1, 2026
- tradernetwork/etf-holdings-trackeredited, first seen Oct 13, 2026
- arcboxlabs/linkcodeedited, first seen Jul 21, 2026
- wpank/aitheir own version, first seen Feb 10, 2026
Used with
Projects with it also use expo-ui.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
CaiZongyuanSkillexpo-ui
This skill should be used when users need to work with Expo UI (@expo/ui) for integrating SwiftUI components into React Native applications. It provides comprehensive guidance on installation, Host component, SwiftUI primitives, layouts, modifiers, native tabs navigation, and v10 preview features.
Also in 3 projects that use this
Other versions5 projects use a version of this.
Word for word · 0
None found.
Edited · 4
- arcboxlabs/linkcode★ 147100% same
- deonmenezes/mobile-app-skill★ 459% same
- dalonga-kohi/mawl★ 257% same
- tradernetwork/etf-holdings-tracker★ 159% same
Wrote their own version · 1
- wpank/ai★ 11same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository67 other files it gives its agents.
- AGENTS.mdAGENTS.md
- skills/humanizer/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- agent-reachSkill
- animateSkill
- backend-architectureSkill
- ci-security-scanning-with-strixSkill
- diagram-generatorSkill
- eas-app-storesSkill
- emil-design-engSkill
- expo-data-fetchingSkill
- expo-dev-clientSkill
- expo-project-structureSkill
- expo-routerSkill
- expo-upgradeSkill
- final-showcaseSkill
- fix-security-vulnerabilities-with-strixSkill
- fresh-context-reviewSkill
- gsap-coreSkill
- gsap-performanceSkill
- gsap-reactSkill
- gsap-scrolltriggerSkill
- gsap-timelineSkill
- hallmarkSkill
- humanizerSkill
- impeccableSkill
- ml-experimentSkill
- obsidian-markdownSkill
- orchestra-conductorSkill
- orchestra-docsSkill
- orchestra-shipSkill
- orchestra-vaultSkill
- penetration-testing-with-strixSkill
- ponytail-auditSkill
- ponytail-reviewSkill
- ponytailSkill
- postgres-best-practicesSkill
- pretty-mermaidSkill
- prompt-forgeSkill
- r3f-shadersSkill
- react-best-practicesSkill
- reaSkill
- refero-designSkill
- research-paperSkill
- resource-scoutSkill
- review-animationsSkill
- semgrep-adapterSkill
- ship-safeSkill
- skill-security-checkSkill
- stitch::code-to-designSkill
- stitch::extract-design-mdSkill
- stitch::extract-static-htmlSkill
- stitch::generate-designSkill
- stitch::manage-design-systemSkill
- stitch::react-componentsSkill
- stitch::upload-to-stitchSkill
- store-releaseSkill
- supabaseSkill
- systematic-debuggingSkill
- taste-designSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
34 rules. 16 are common, 4 are distinctive, and 14 are very specific to this project.
16
Common
Most of the 5 edited versions we read keep these.
4
Distinctive
This author's own choices. Worth a look.
14
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 34
Start with Expo Go: Run npx expo start and scan the QR code with Expo Go
- Common: line 35
Check if features work: Test your app thoroughly in Expo Go
- Common: line 44
Third-party native modules: not included in Expo Go
- Common: line 61
Always use import statements at the top of the file.
- Very specific: line 62
Always use kebab-case for file names, e.g.
- Common: line 63
Never use special characters in file names
- Common: line 68
Never use modules removed from React Native such as Picker, WebView, SafeAreaView, or AsyncStorage
- Common: line 69
Never use legacy expo-permissions
- Distinctive: line 83
Always wrap root component in a scroll view for responsiveness
- Very specific: line 84
Use <ScrollView contentInsetAdjustmentBehavior="automatic" /> instead of <SafeAreaView> for smarter safe area insets
- Common: line 86
Use flexbox instead of Dimensions API
- Very specific: line 87
ALWAYS prefer useWindowDimensions over Dimensions.get() to measure screen size
- Common: line 91
Use expo-haptics conditionally on iOS to make more delightful experiences
- Very specific: line 92
Use views with built-in haptics like <Switch /> from React Native and @react-native-community/datetimepicker
- Very specific: line 93
When a route belongs to a Stack, its first child should almost always be a ScrollView with contentInsetAdjustmentBehavior="automatic" set
- Very specific: line 94
When adding a ScrollView to the page it should almost always be the first component inside the route component
- Very specific: line 95
Use the <Text selectable /> prop on text containing data that could be copied
- Common: line 96
Consider formatting large numbers like 1.4M or 38k
- Common: line 97
Never use intrinsic elements like 'img' or 'div' unless in a webview or Expo DOM component
- Distinctive: line 101
Follow Apple Human Interface Guidelines.
- Common: line 105
Prefer flex gap over margin and padding styles
- Common: line 106
Prefer padding over margin where possible
- Very specific: line 107
Always account for safe area, either with stack headers, tabs, or ScrollView/FlatList contentInsetAdjustmentBehavior="automatic"
- Common: line 108
Ensure both top and bottom safe area insets are accounted for
- Distinctive: line 110
Add entering and exiting animations for state changes
- Very specific: line 111
Use { borderCurve: 'continuous' } for rounded corners unless creating a capsule shape
- Common: line 112
ALWAYS use a navigation stack title instead of a custom text element on the page
- Very specific: line 113
When padding a ScrollView, use contentContainerStyle padding and gap instead of padding on the ScrollView itself (reduces clipping)
- Very specific: line 165
Don't pass Color / PlatformColor values into Reanimated styles — use static colors there (see references/animations.md).
- Very specific: line 170
Add the selectable prop to every <Text/> element displaying important data or error messages
- Very specific: line 175
Use CSS boxShadow style prop.
- Common: line 184
If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
- Common: line 188
Only submit when you have something specific and actionable to report.
- Distinctive: line 189
If an AI agent repeatedly failed or the user had to take over an Expo task, load the expo-skill-feedback skill and follow its …
“Common” is measured: kept by at least 6 in 10 of the 5 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Expo Native UI Guidelines
For routes, links, stacks, tabs, modals, sheets, and headers, use the expo-router skill.
References
Consult these resources as needed:
references/
animations.md Reanimated: entering, exiting, layout, scroll-driven, gestures
controls.md Native iOS: Switch, Slider, SegmentedControl, DateTimePicker, Picker
gradients.md CSS gradients via experimental_backgroundImage (New Arch only)
icons.md SF Symbols via expo-image (sf: source), names, animations, weights
media.md Camera, audio, video, and file saving
storage.md SQLite, AsyncStorage, SecureStore
visual-effects.md Blur (expo-blur) and liquid glass (expo-glass-effect)
webgpu-three.md 3D graphics, games, GPU visualizations with WebGPU and Three.jsRunning the App
CRITICAL: Always try Expo Go first before creating custom builds.
Most Expo apps work in Expo Go without any custom native code. Before running npx expo run:ios or npx expo run:android:
- Start with Expo Go: Run
npx expo startand scan the QR code with Expo Go - Check if features work: Test your app thoroughly in Expo Go
- Only create custom builds when required - see below
When Custom Builds Are Required
You need npx expo run:ios/android or eas build ONLY when using:
- Local Expo modules (custom native code in
modules/) - Apple targets (widgets, app clips, extensions via
@bacons/apple-targets) - Third-party native modules not included in Expo Go
- Custom native configuration that can't be expressed in
app.json
When Expo Go Works
Expo Go supports a huge range of features out of the box:
- All
expo-*packages (camera, location, notifications, etc.) - Expo Router navigation
- Most UI libraries (reanimated, gesture handler, etc.)
- Push notifications, deep links, and more
If you're unsure, try Expo Go first. Creating custom builds adds complexity, slower iteration, and requires Xcode/Android Studio setup.
Code Style
- Be cautious of unterminated strings. Ensure nested backticks are escaped; never forget to escape quotes correctly.
- Always use import statements at the top of the file.
- Always use kebab-case for file names, e.g.
comment-card.tsx - Never use special characters in file names
- Configure tsconfig.json with path aliases, and prefer aliases over relative imports for refactors.
Library Preferences
- Never use modules removed from React Native such as Picker, WebView, SafeAreaView, or AsyncStorage
- Never use legacy expo-permissions
expo-audionotexpo-avexpo-videonotexpo-avexpo-imagewithsource="sf:name"for SF Symbols, notexpo-symbolsor@expo/vector-iconsreact-native-safe-area-contextnot react-native SafeAreaViewprocess.env.EXPO_OSnotPlatform.OSReact.usenotReact.useContextexpo-imageImage component instead of intrinsic elementimgexpo-glass-effectfor liquid glass backdropsColorfromexpo-routerfor native semantic colors, not rawPlatformColor(type-safe, auto-adapts to light/dark)- In SDK 56+, never import from
@react-navigation/*directly — useexpo-router/react-navigationinstead (covers@react-navigation/native,/core,/elements,/routers)
Responsiveness
- Always wrap root component in a scroll view for responsiveness
- Use
<ScrollView contentInsetAdjustmentBehavior="automatic" />instead of<SafeAreaView>for smarter safe area insets contentInsetAdjustmentBehavior="automatic"should be applied to FlatList and SectionList as well- Use flexbox instead of Dimensions API
- ALWAYS prefer
useWindowDimensionsoverDimensions.get()to measure screen size
Behavior
- Use expo-haptics conditionally on iOS to make more delightful experiences
- Use views with built-in haptics like
<Switch />from React Native and@react-native-community/datetimepicker - When a route belongs to a Stack, its first child should almost always be a ScrollView with
contentInsetAdjustmentBehavior="automatic"set - When adding a
ScrollViewto the page it should almost always be the first component inside the route component - Use the
<Text selectable />prop on text containing data that could be copied - Consider formatting large numbers like 1.4M or 38k
- Never use intrinsic elements like 'img' or 'div' unless in a webview or Expo DOM component
Styling
Follow Apple Human Interface Guidelines.
General Styling Rules
- Prefer flex gap over margin and padding styles
- Prefer padding over margin where possible
- Always account for safe area, either with stack headers, tabs, or ScrollView/FlatList
contentInsetAdjustmentBehavior="automatic" - Ensure both top and bottom safe area insets are accounted for
- Inline styles not StyleSheet.create unless reusing styles is faster
- Add entering and exiting animations for state changes
- Use
{ borderCurve: 'continuous' }for rounded corners unless creating a capsule shape - ALWAYS use a navigation stack title instead of a custom text element on the page
- When padding a ScrollView, use
contentContainerStylepadding and gap instead of padding on the ScrollView itself (reduces clipping) - CSS and Tailwind are not supported - use inline styles
Colors
Use the Color API from expo-router for native semantic colors. It is a type-safe wrapper over PlatformColor that exposes iOS UIKit colors through Color.ios.* and Android Material 3 colors through Color.android.material.* (static) or Color.android.dynamic.* (adapts to the user's wallpaper on Android 12+). These resolve on-device and automatically adapt to light/dark mode and accessibility settings, so you no longer maintain separate light/dark hex tables or a colors.web.ts file.
Color is platform-specific, so wrap each value in Platform.select with a default hex fallback for web. Centralize the palette in theme/colors.ts and import colors everywhere:
// theme/colors.ts
import { Platform } from "react-native";
import { Color } from "expo-router";
export const colors = {
label: Platform.select({
ios: Color.ios.label,
android: Color.android.dynamic.onSurface,
default: "#000000",
})!,
secondaryLabel: Platform.select({
ios: Color.ios.secondaryLabel,
android: Color.android.dynamic.onSurfaceVariant,
default: "#3c3c43",
})!,
separator: Platform.select({
ios: Color.ios.separator,
android: Color.android.dynamic.outlineVariant,
default: "#c6c6c8",
})!,
systemBackground: Platform.select({
ios: Color.ios.systemBackground,
android: Color.android.dynamic.surface,
default: "#ffffff",
})!,
systemBlue: Platform.select({
ios: Color.ios.systemBlue,
android: Color.android.dynamic.primary,
default: "#007aff",
})!,
};import { colors } from "@/theme/colors";
<View style={{ backgroundColor: colors.systemBackground }}>
<Text style={{ color: colors.label }}>Title</Text>
</View>;- iOS re-resolves these colors automatically when the system theme changes. On Android, call
useColorScheme()inside any component that renders them so it re-renders when the theme flips (required when React Compiler memoizes the component). - Don't pass
Color/PlatformColorvalues into Reanimated styles — use static colors there (seereferences/animations.md). Platform.select({...})!returnsstring | OpaqueColorValue. Most React Native style props acceptColorValue(string | OpaqueColorValue) so this works fine. But some third-party props only acceptstring(e.g.tintColoronexpo-image). Cast when needed:colors.label as string.
Text Styling
- Add the
selectableprop to every<Text/>element displaying important data or error messages - Counters should use
{ fontVariant: 'tabular-nums' }for alignment
Shadows
Use CSS boxShadow style prop. NEVER use legacy React Native shadow or elevation styles.
<View style={{ boxShadow: "0 1px 2px rgba(0, 0, 0, 0.05)" }} />'inset' shadows are supported.
Submitting Feedback
If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
npx --yes submit-expo-feedback@latest --category skills --subject "expo-native-ui" "<actionable feedback>"Only submit when you have something specific and actionable to report. Include as much relevant context as possible. If an AI agent repeatedly failed or the user had to take over an Expo task, load the expo-skill-feedback skill and follow its eval-candidate flow instead of reusing the command above.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

