# iOS + Android with Expo

> If you're targeting both stores with a small team, native-per-platform is usually the wrong tradeoff. Expo's tooling has gotten good enough that you write TypeScript once, EAS Build compiles native bundles, and OTA updates ship JS-only fixes without re-submitting. Pair with Cursor + Claude and the loop is faster than either native track.

Source: https://aistack.sh/stack/cross-platform-mobile
Category: Code · Mobile
Level: Intermediate
Last verified by a human: 2026-05-05

## The tools

### Claude — Product + native-vs-cross decisions

- Pricing: Free · $20/mo Pro · $100/mo Max 5x · $200/mo Max 20x · Sonnet API $2/$10 per M tokens (input/output)
- Site: https://claude.ai
- Why this one: Cross-platform tradeoffs are real (animations, deep platform integrations). Use Claude up front to mark which features genuinely need native vs which can ride on Expo's SDK.
- Swap in instead: ChatGPT
- More: https://aistack.sh/tool/claude

### Cursor — TypeScript + React Native editing

- Pricing: Free Hobby · $20/mo Pro · $60/mo Pro+ · $200/mo Ultra · $40/seat Teams · $120/seat Teams Premium
- Site: https://cursor.com
- Why this one: Cursor is great at TypeScript. React Native ecosystems are well-trained-on, so suggestions are reliable. Composer covers cross-file refactors when you change a navigation pattern or auth provider.
- Swap in instead: Claude Code, Codex
- More: https://aistack.sh/tool/cursor

### Expo — Build infra + OTA updates

- Pricing: Free · $19/mo Starter · $199/mo Production · Enterprise from $1,999/mo
- Site: https://expo.dev
- Why this one: Expo Router for navigation, EAS Build for managed native compiling, EAS Update for shipping JS fixes without store review, EAS Submit for one-command store uploads. The infra you'd otherwise rebuild every project.
- More: https://aistack.sh/tool/expo

## Monthly cost

### $28/mo — Solo, first app (small)

- Claude: Free tier
- Cursor: $20
- Expo: Free Hobby
- + stores: $8 ($99 + $25, annualized)

### $67/mo — Solo, multiple apps + EAS Production (medium)

- Claude: $20
- Cursor: $20
- Expo: $19 Production
- + stores: $8

### $319/mo — Small team (heavy)

- Claude: $20
- Cursor: $200
- Expo: $99 Enterprise
- + stores: $0 (org-wide)

## Workflow

### 1. Decide cross-platform vs native (Claude)

Some apps shouldn't be Expo (heavy AR, custom video pipelines, deep iOS WidgetKit). Use Claude to audit upfront.

**Prompt: Cross-platform fitness audit**

```
Audit whether the idea below is a good fit for Expo + React Native, or whether it should be native (Swift / Kotlin) per platform.

Idea:
"""
{{1-line description + the 5 most-important features}}
"""

Output:
1. **Verdict**: Expo / Native iOS / Native Android / Both native — and a 1-sentence "why".
2. **The 3 features that drive the verdict** — and which side they push toward.
3. **Mitigations** — if Expo, are there config-plugins or community modules that close the native gap? Be specific.
4. **Costs of the wrong call** — what does this app look like in 12 months if I pick the other path?

Be honest. The answer "this should be native" is allowed.
```

### 2. Scaffold with Cursor + Expo Router (Cursor)

`npx create-expo-app`, then Cursor's Composer to scaffold tabs + screens. The Expo Router file-based routing makes the screen layout legible in one folder.

### 3. Iterate with Expo Go on a real device (Expo)

Expo Go on your phone for the inner loop. EAS Build only when you need a real native build (signing, native modules, store submission).

### 4. EAS Build for store builds (Expo)

`eas build --profile production --platform all` builds both iOS and Android binaries in the cloud. ~15 min the first time, faster after caching.

### 5. EAS Submit + EAS Update (Expo)

`eas submit` uploads to TestFlight + Play Console in one command. `eas update` ships JS fixes after launch without re-submitting (within Apple's policy boundary).

## What it produced

**Two-person startup, ship to both stores in 5 weeks**

Could not have justified two native codebases. Expo + Cursor put the team at parity with native-only competitors on screens-shipped-per-week. The only feature they had to drop was a custom haptic pattern that wasn't in expo-haptics; they shipped without it and added a config plugin in v2.

## Pitfalls

- **Picking Expo for the wrong app** — If your app's core is AR, custom audio, or watchOS / Wear OS companions, Expo will fight you. The 'fitness audit' step exists to catch this before you've written 10k lines.
- **Skipping EAS Update planning** — OTA updates are the killer Expo feature, but they live inside Apple's policy boundary (no major feature changes via JS). Plan from day one which features are JS-only and which need a native build + submission.
- **Native module rabbit holes** — When a native module isn't in expo-* or doesn't have a config plugin, the temptation is to eject to a bare workflow. Don't, unless you're sure. Expo's prebuild + config plugins almost always cover it.

## Recent changes affecting this stack

- **Cursor launches Projects to coordinate large bodies of work with subagent delegation** (2026-09-10, feature) — Projects enables managing feature development, migrations, and full apps with a coordinator agent that plans work, delegates to subagents, and maintains context over months. The coordinator runs agents in parallel and can watch Slack channels or run on schedules to automatically pick up work without explicit prompting. Source: https://cursor.com/changelog
- **Cursor launches Projects for coordinating multi-month work across thousands of subagents** (2026-09-10, feature) — Projects maintain context over months of work, with a coordinator agent that plans work and delegates to subagents running in parallel. Projects can watch Slack channels or run on schedules to take action without being prompted, keeping shared context across all agents involved. Source: https://cursor.com/changelog
- **Cursor launches Projects for coordinating large bodies of work with multiple subagents** (2026-09-10, feature) — Projects is a new feature that maintains context over months of work and delegates tasks to thousands of subagents. A coordinator agent plans the work and delegates to implementation agents that run in parallel. Projects can watch Slack channels, follow PRs, or run on a schedule to take action automatically without prompting. Source: https://cursor.com/changelog
- **Expo added one-command PostHog integration for analytics and error tracking** (2026-09-09, feature) — Developers can connect PostHog to Expo apps in a single command to set up analytics, session replay, and error tracking. Events are automatically tagged with the EAS update version, allowing correlation of app behavior with specific deployments. Source: https://expo.dev/changelog
- **Expo adds one-command PostHog integration** (2026-09-09, feature) — Expo now includes built-in PostHog integration that sets up analytics, session replay, and error tracking in one command. Events are automatically tagged with the corresponding EAS update version for better correlation between app behavior and deployments. Source: https://expo.dev/changelog

---

Curated by alex-w on aistack.sh. Last updated 2026-05-05.
