expo-local-shiplisted
Install: claude install-skill RonenMars/threadbase-mobile
# Expo Local Build & Ship (CLI-only)
Every step is non-interactive shell. No Xcode windows, no App Store
Connect website. Apple talks to us via the ASC REST API and `xcodebuild`'s
API-key flags.
## Contents
- [Quick start](#quick-start)
- [Architecture](#architecture)
- [One-time setup](#one-time-setup)
- [The ship pipeline](#the-ship-pipeline)
- [Local dev iteration](#local-dev-iteration)
- [Expo gotchas](#expo-gotchas)
- [Anti-patterns](#anti-patterns)
- [CI variant](#ci-variant)
- [Troubleshooting](#troubleshooting)
- [Rules](#rules)
## Quick start
```bash
./scripts/ship.sh # → TestFlight (default)
./scripts/ship.sh --target production --release-notes "Fixes login bug" \
--release-type AFTER_APPROVAL # → App Store
```
That's the whole flow. No simulator, no UI clicks. The script:
1. **Preflight** — runs every prerequisite check, fails loud if anything is off.
2. **Install deps** — npm / yarn / pnpm / bun, auto-detected from lockfile.
3. **Prebuild** — runs `npx expo prebuild` only if `ios/` is missing.
4. **Bootstrap signing** — skipped automatically if `.env.signing` and the `.p8` key are already on disk. On a fresh machine, pulls ASC API key + Team ID from 1Password (requires `eval "$(op signin)"` or `OP_SERVICE_ACCOUNT_TOKEN`), renders `ExportOptions.plist`, writes `.env.signing`.
5. **Git sync check** — `git fetch origin` then refuses to ship if local `main` is behind `origin/main` (someone else may have pushed an `app.jso