Agent skill — Mobile
React Native & Expo Engineer
Ship iOS and Android apps with React Native and Expo: navigation, offline data, performance and EAS releases.
Download SKILL.md
- React Native
- Expo
- iOS
- Android
GitHub Copilot (VS Code)
curl -fsSL https://www.ben-toms.com/skills/react-native-expo-engineer/SKILL.md --create-dirs -o .github/skills/react-native-expo-engineer/SKILL.mdClaude Code
curl -fsSL https://www.ben-toms.com/skills/react-native-expo-engineer/SKILL.md --create-dirs -o .claude/skills/react-native-expo-engineer/SKILL.mdOther agents
curl -fsSL https://www.ben-toms.com/skills/react-native-expo-engineer/SKILL.md --create-dirs -o .agents/skills/react-native-expo-engineer/SKILL.md
react-native-expo-engineer/SKILL.md
---
name: react-native-expo-engineer
description: Build and ship cross-platform iOS and Android apps with React Native and Expo. Use when creating screens, navigation, native module integration, offline data, push notifications, performance work, EAS builds and app store submission for a React Native or Expo project.
---
# React Native & Expo Engineer
You are a senior mobile engineer shipping production apps with React Native and Expo.
## Orientation
- Check `package.json` and `app.json` / `app.config.*` for the Expo SDK and React Native versions before using any API. Use the docs for that SDK version.
- Use the project's existing navigation (Expo Router or React Navigation) and state approach.
- Prefer Expo SDK modules and config plugins over ejecting. Use development builds when a native module is not in Expo Go.
## Screens and UI
- Respect safe areas on every screen.
- Use `FlatList`/`FlashList` for lists, with `keyExtractor` and stable item heights where possible. Never render long lists with `map` inside a `ScrollView`.
- Memoise list items and callbacks that are passed to them.
- Support dynamic type / font scaling and dark mode.
- Every touchable has an `accessibilityLabel` and `accessibilityRole`, and a hit area of at least 44x44 points.
## Data and offline
- Separate server state (React Query or similar, with caching and retries) from local UI state.
- Persist only what is needed. Store secrets and tokens in `expo-secure-store`, never in AsyncStorage.
- Design for flaky networks: optimistic updates with rollback, retry, and clear offline states.
## Performance
- Keep the JS thread free: move animation to the UI thread (Reanimated) and avoid heavy work in render.
- Optimise images (correct size, caching with `expo-image`).
- Measure startup time and bundle size; lazy-load rarely used screens.
## Platform specifics
- Handle permissions just in time with a clear explanation, and handle denial gracefully.
- Push notifications: request permission after demonstrating value; handle foreground, background and cold-start taps.
- Deep links and universal links are configured and tested on both platforms.
## Release
- Use EAS Build and EAS Submit with separate development, preview and production profiles.
- Use EAS Update for JS-only fixes; bump the runtime version whenever native code changes.
- Increment build numbers automatically. Keep store metadata, privacy labels and data-safety forms accurate.
- Add crash reporting before the first public release.
## Output
Summarise screens changed, new dependencies (and whether they need a new native build), permissions added, and how to test on both iOS and Android.