expo-mobile
Best practices for Expo mobile projects using React Native, NativeWind, and Supabase.
Install
mkdir -p .claude/skills/expo-mobile && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/15536" && unzip -o skill.zip -d .claude/skills/expo-mobile && rm skill.zipInstalls to .claude/skills/expo-mobile
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Expo and React Native patterns for Halvy. Triggers: "component", "screen", "navigation", "expo", "NativeWind", "mobile", "React Native".Key capabilities
- →Set up Expo SDK managed workflow with Expo Router v3
- →Configure NativeWind v4 for Tailwind CSS syntax
- →Manage explicit dependencies for Expo SDK 54+
- →Verify builds across iOS, Android, and web platforms
- →Structure feature files with components, hooks, and utils
- →Implement Supabase Realtime patterns for data synchronization
How it works
This skill defines project structure, dependency management, and configuration patterns for Expo SDK 54+ managed workflows.
Inputs & outputs
When to use expo-mobile
- →Setting up a new Expo mobile project
- →Configuring NativeWind in Expo
- →Structuring mobile features
About this skill
Expo / React Native Development — Halvy Patterns
Project Setup
- Expo SDK managed workflow with Expo Router v3
- NativeWind v4 (Tailwind CSS syntax)
- Supabase backend
- TypeScript strict mode
- FlashList (not FlatList) for all scrollable lists
Explicit Dependencies (SDK 54 — must be listed, never assume transitive)
These are NOT guaranteed as transitive installs — add them explicitly in package.json:
babel-preset-expoas a devDependency (pin to~54.0.xmatching SDK version)react-native-worklets— required peer dep of[email protected]; install vianpx expo install react-native-workletsreact-native-web,react-dom,@expo/metro-runtime— required for web platform support
babel.config.js — Critical Pattern
nativewind/babel returns { plugins: [...] } — it is a preset, not a plugin.
Place it in presets[] or Metro will throw: .plugins is not a valid Plugin property
// CORRECT
presets: ['babel-preset-expo', 'nativewind/babel']
plugins: [['module-resolver', { alias: { '@': './src' } }]]
// WRONG — causes silent build failures
plugins: ['nativewind/babel']
Build Verification
tsc and jest do NOT validate Metro/Babel transforms. Always run before merging:
npx expo export --platform ios
npx expo export --platform android
npx expo export --platform web
Zero test files → jest exits 0. This is NOT a build confirmation.
Feature File Structure
src/features/{name}/ components/ — Feature-specific UI components hooks/ — TanStack Query hooks and local state hooks utils/ — Pure functions (no React) tests/ — Integration tests
Critical Rules
- No window or document — not available in React Native
- No div/span/p — use View, Text, Pressable from react-native
- Always handle keyboard avoidance on input screens
- Always handle safe area insets
- Always use deep linking for navigable screens
- Use expo-image over Image for performance
- FlashList over FlatList for long lists — always
- All monetary amounts in integer cents — never floats
NativeWind Rules
- className with Tailwind utilities on all RN components
- Platform-specific: className="ios:pt-2 android:pt-4"
- Dark mode: className="bg-white dark:bg-gray-900"
- Never mix StyleSheet.create with className in the same component
- Use design tokens from tailwind.config.ts
Screen Pattern
import { ScrollView } from 'react-native' import { Stack } from 'expo-router' import { ErrorBoundary } from '@/components/ErrorBoundary'
export default function FeatureScreen() { return ( <ErrorBoundary> <Stack.Screen options={{ title: 'Feature' }} /> <ScrollView className="flex-1 bg-background"> {/* content */} </ScrollView> </ErrorBoundary> ) }
Supabase Realtime Pattern (Chat)
useEffect(() => { const channel = supabase .channel('chat:' + groupId) .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages', filter: 'group_id=eq.' + groupId, }, handleNewMessage) .subscribe() return () => { supabase.removeChannel(channel) } }, [groupId])
Monetary Arithmetic
// ALWAYS: convert to cents on entry, format on display only const amountCents = Math.round(parseFloat(input) * 100) // NEVER: parseFloat('1.10') + parseFloat('2.20') — float errors
When not to use it
- →When working with React Native without Expo
- →When using FlatList for long lists
- →When mixing StyleSheet.create with className in the same component
Limitations
- →This skill does not support `window` or `document` objects.
- →This skill does not use `div`, `span`, or `p` elements.
- →This skill does not use `FlatList` for long lists.
How it compares
This approach provides specific patterns for Expo development, including NativeWind and Supabase, which is more prescriptive than general React Native guidance.
Compared to similar skills
expo-mobile side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| expo-mobile (this skill) | 0 | 4mo | Review | Intermediate |
| react-native-architecture | 55 | 2mo | Review | Advanced |
| react-native-design | 33 | 2mo | No flags | Intermediate |
| heroui-native | 5 | 4mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
react-native-architecture
wshobson
Build production React Native apps with Expo, navigation, native modules, offline sync, and cross-platform patterns. Use when developing mobile apps, implementing native integrations, or architecting React Native projects.
react-native-design
wshobson
Master React Native styling, navigation, and Reanimated animations for cross-platform mobile development. Use when building React Native apps, implementing navigation patterns, or creating performant animations.
heroui-native
heroui-inc
HeroUI Native component library for React Native (Tailwind v4 via Uniwind). Use when working with HeroUI Native components, installing HeroUI Native, customizing themes, or accessing component documentation. Keywords: HeroUI Native, heroui-native, React Native UI, Uniwind.
react-native
alinaqi
React Native mobile patterns, platform-specific code
json-render-react-native
vercel-labs
React Native renderer for json-render that turns JSON specs into native mobile UIs. Use when working with @json-render/react-native, building React Native UIs from JSON, creating mobile component catalogs, or rendering AI-generated specs on mobile.
frontend-mobile-development-component-scaffold
sickn33
You are a React component architecture expert specializing in scaffolding production-ready, accessible, and performant components. Generate complete component implementations with TypeScript, tests, s