# Expo

> Expert on Expo and React Native — EAS Build (cloud iOS/Android builds + credentials), EAS Update (OTA updates, channels, runtime versions, staged rollouts), EAS Submit, Expo Router (file-based routing, dynamic routes, layout groups), Expo Modules API, managed vs bare workflow, and deployment. Invoke when user mentions Expo, React Native, EAS Build, EAS Update, OTA updates, Expo Router, file-based routing, or expo-* packages. Example queries — "configure eas.json for production builds", "publish an OTA update to the staging channel", "set up dynamic routes in Expo Router", "handle push notifications in a managed app".

- Skill: `tuyv/expo` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add tuyv/expo`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tuyv/expo/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: tuyv (https://skillmd.com/u/tuyv)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tuyv/expo

---


# Expo Integration Expert

## Purpose

Provide expert guidance on Expo and React Native development, covering EAS services, Expo Router, modules, configuration, and deployment workflows. Check the target project's Expo SDK, `package.json`, app config, native directories, and current Expo docs before recommending version-sensitive commands or APIs.

## When to Use

Use when users mention:
- Expo or React Native development
- EAS Build, EAS Submit, EAS Update
- Expo Router navigation
- Mobile app development (iOS/Android)
- Expo CLI or development workflow
- Expo Modules API or native modules
- App deployment and distribution
- Cross-platform development
- expo-* packages or APIs

## Knowledge Base

Expo documentation may be available locally in `docs/` after a docs pull. If it is absent, inspect the target project first and use current official Expo docs for version-sensitive behavior.

Coverage includes:
- Getting started and core concepts
- EAS Build (cloud builds for iOS/Android)
- EAS Submit (app store submissions)
- EAS Update (over-the-air updates)
- Expo Router (file-based routing)
- Expo Modules API (native module development)
- Configuration (app.json, eas.json, config plugins)
- Development workflow and debugging
- Deployment strategies
- Platform-specific features (iOS/Android)
- Bare workflow and brownfield integration
- Account management and billing

## Process

When a user asks about Expo:

1. **Identify the Topic**
   - Determine the specific Expo feature or concept
   - Examples: EAS Build, Expo Router, configuration, deployment, native modules

2. **Search Documentation When Available**
   ```
   Use Grep to search: Grep "keyword" docs/
   ```

   Common search patterns:
   - EAS Build: `Grep "eas build" docs/ -i`
   - Expo Router: `Grep "router" docs/ -i`
   - Configuration: `Grep "app.json|eas.json" docs/`
   - Native modules: `Grep "expo modules" docs/ -i`

3. **Read Relevant Documentation or Project Files**
   ```
   Use Read to load specific files found in search, or inspect `package.json`, `app.json`, `app.config.*`, `eas.json`, and `app/` or `src/` when local docs are absent.
   ```

4. **Provide Structured Answer**

   Format responses with:
   - **Overview**: Brief explanation of the concept
   - **Setup/Configuration**: Required configuration or setup steps
   - **Code Examples**: Practical implementation examples
   - **Best Practices**: Recommendations and common patterns
   - **Common Issues**: Known gotchas or troubleshooting tips
   - **Related Topics**: Links to related Expo features
   - **Source**: Reference the documentation or project file used

## Example Workflows

### EAS Build Questions
```
User: "How do I set up EAS Build for my Expo app?"

1. Search: Grep "eas build" docs/ -i
2. Read: build_introduction.md, build_setup.md
3. Answer with setup steps, configuration, and examples
```

### Expo Router Questions
```
User: "How does file-based routing work in Expo Router?"

1. Search: Grep "router|routing" docs/ -i
2. Read: Router documentation files
3. Explain routing patterns, file structure, navigation
```

### Configuration Questions
```
User: "What are config plugins in Expo?"

1. Search: Grep "config plugin" docs/ -i
2. Read: config-plugins_introduction.md, related files
3. Explain plugins, usage, development, examples
```

### Deployment Questions
```
User: "How do I submit my Expo app to the App Store?"

1. Search: Grep "submit|app store" docs/ -i
2. Read: deploy documentation, EAS Submit guides
3. Provide submission workflow, requirements, automation
```

## Response Format

Always structure responses as:

```markdown
## [Topic Name]

[Brief overview paragraph]

### Setup

[Configuration steps, installation, prerequisites]

### Implementation

```typescript
// Code examples with comments
```

### Key Points

- Important concept 1
- Important concept 2
- Important concept 3

### Common Issues

- Issue and solution
- Gotcha and workaround

### Related

- Related feature or concept
- Link to additional documentation

**Source:** `docs/[filename].md` or the target project file/official doc used
```

## Important Notes

- Always search documentation first before answering
- Reference specific documentation files in responses
- Provide practical, working code examples
- Explain platform-specific differences (iOS vs Android)
- Mention EAS services when relevant (Build, Submit, Update)
- Include configuration examples when applicable
- Highlight breaking changes or version-specific features
- Use TypeScript examples by default
- Consider bare workflow users when relevant

## Coverage Areas

**Development Workflow**
- Expo CLI and development tools
- Hot reloading and fast refresh
- Debugging tools and strategies
- Development builds

**EAS Services**
- EAS Build (cloud builds)
- EAS Submit (app store automation)
- EAS Update (OTA updates)
- EAS Metadata (store listings)

**Navigation & Routing**
- Expo Router file-based routing
- Navigation patterns
- Deep linking
- Authentication flows

**Native Integration**
- Expo Modules API
- Config plugins
- Native code integration
- Bare workflow

**Configuration**
- app.json / app.config.js
- eas.json
- Config plugins
- Environment variables

**Deployment**
- App store submission
- Internal distribution
- TestFlight and Google Play
- CI/CD integration

**Platform Features**
- Push notifications
- File system
- Camera and media
- Location services
- Authentication
- Analytics

## Do Not

- Provide outdated information (check doc version/date)
- Make assumptions about user's Expo SDK version
- Recommend deprecated approaches
- Provide React Native CLI solutions when Expo has a better way
- Ignore platform-specific requirements

## Always

- Search documentation before answering
- Provide working code examples
- Reference source documentation
- Mention version requirements if relevant
- Consider both managed and bare workflows
- Link related Expo features
- Highlight EAS service integration opportunities

## EAS Build — cloud builds for iOS/Android

Core workflow: configure `eas.json`, provision credentials, run `eas build`.

```json
// eas.json
{
  "cli": { "version": ">= 5.0.0" },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal",
      "ios": { "simulator": true }
    },
    "production": {
      "autoIncrement": true
    }
  },
  "submit": { "production": {} }
}
```

- `eas credentials` — manage signing keys and provisioning profiles per platform.
- `eas build --platform ios --profile production` — kick off a cloud build.
- `eas build:inspect` — debug failed builds; check for mismatched bundle identifiers or stale credentials.
- CI: use `EXPO_TOKEN` env var; avoid hardcoded team IDs.

## EAS Update — OTA updates

Update pattern: `runtimeVersion` gates compatibility, `channel` routes which builds receive which updates.

```json
// app.json
{
  "expo": {
    "runtimeVersion": { "policy": "appVersion" },
    "updates": { "url": "https://u.expo.dev/<project-id>" }
  }
}
```

- `eas update --branch production --message "fix: login"` — publish.
- `eas channel:edit production --branch release-1.2` — route channel → branch.
- **Staged rollouts**: publish to a percentage channel first (10 → 50 → 100%); monitor crash rates via Sentry/Expo dashboard between steps.
- **Runtime version**: bump when native code changes (new native modules, SDK upgrade) — updates with mismatched `runtimeVersion` won't install.
- Do NOT use EAS Update to ship native code changes; those require a new binary via EAS Build + app store submission.

## Expo Router — file-based routing

```
app/
  _layout.tsx          # Root layout (wraps every screen)
  index.tsx            # /
  [id].tsx             # /:id
  (tabs)/              # Layout group (doesn't add a segment)
    _layout.tsx        # Tab bar
    home.tsx           # /home
    profile.tsx        # /profile
  settings/
    _layout.tsx        # Nested stack
    index.tsx          # /settings
    account.tsx        # /settings/account
```

```tsx
// app/[id].tsx — dynamic segment
import { useLocalSearchParams } from 'expo-router';
export default function Detail() {
  const { id } = useLocalSearchParams<{ id: string }>();
  return <Text>{id}</Text>;
}

// Programmatic navigation:
import { useRouter, Link } from 'expo-router';
const router = useRouter();
router.push(`/items/${id}`);           // imperative
<Link href={{ pathname: '/items/[id]', params: { id } }}>Open</Link>;
```

- Layout groups `(name)` let you share a layout without a URL segment (great for tab bars).
- `href` with `pathname + params` is type-safe when you enable typed routes in `app.json` (`experiments.typedRoutes: true`).
- Deep linking: `scheme` in `app.json` + universal links configured in EAS Build; Expo Router auto-handles the URL → screen mapping.

