Generated banner for Expo Deployment
Generated logo for Expo Deployment

Expo Deployment

OpenAIOfficialCreated by Expo TeamDistributed by OpenAI

  • Skill
  • Tool integration
  • Cloud and DevOps
  • MIT
  • Low risk

From the author

Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes
— the description by Expo Team

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a comprehensive guide for using Expo Application Services (EAS) to build, manage, and deploy Expo applications. It covers the configuration of build profiles, automated submission to the Apple App Store and Google Play Store, and web hosting deployment. The skill also includes instructions for managing app metadata, handling credentials, and integrating CI/CD workflows for automated release pipelines.

What it does

  • Configures build profiles for iOS, Android, and web platforms
  • Automates the submission of application binaries to app stores
  • Manages App Store metadata and store configuration
  • Provides commands for TestFlight beta distribution
  • Enables web hosting deployment and PR preview generation
  • Supports CI/CD integration for automated build and release workflows

When to use it

  • When preparing an Expo application for release to mobile app stores
  • When setting up automated deployment pipelines for mobile or web
  • When managing App Store metadata and store presence
  • When distributing beta builds to testers via TestFlight
  • When deploying web versions of an Expo project

Advantages

  • Centralizes build and submission processes
  • Reduces manual effort for store metadata management
  • Supports automated versioning and build tracking
  • Facilitates consistent deployment workflows across platforms

Usage examples

“How do I build and submit my iOS app to the App Store?”
The agent provides the command 'npx eas-cli build -p ios --profile production --submit' and explains the necessary credential configuration.
“How can I automate my release process?”
The agent provides a sample YAML workflow configuration for CI/CD to automate building and submitting apps upon pushing to the main branch.
“How do I update my App Store metadata?”
The agent explains how to use 'eas metadata:pull' to generate a config file and 'eas metadata:push' to update store information.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/openai/expo-deployment/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip expo-deployment.zip -d .agents/skills

Documentation by Expo Team

Deployment

This skill covers deploying Expo applications across all platforms using EAS (Expo Application Services).

References

Consult these resources as needed:

  • ./references/workflows.md -- CI/CD workflows for automated deployments and PR previews

  • ./references/testflight.md -- Submitting iOS builds to TestFlight for beta testing

  • ./references/app-store-metadata.md -- Managing App Store metadata and ASO optimization

  • ./references/play-store.md -- Submitting Android builds to Google Play Store

  • ./references/ios-app-store.md -- iOS App Store submission and review process

Quick Start

Install EAS CLI
npm install -g eas-cli
eas login
Initialize EAS
npx eas-cli@latest init

This creates eas.json with build profiles.

Build Commands

Production Builds
# iOS App Store build
npx eas-cli@latest build -p ios --profile production

# Android Play Store build
npx eas-cli@latest build -p android --profile production

# Both platforms
npx eas-cli@latest build --profile production
Submit to Stores
# iOS: Build and submit to App Store Connect
npx eas-cli@latest build -p ios --profile production --submit

# Android: Build and submit to Play Store
npx eas-cli@latest build -p android --profile production --submit

# Shortcut for iOS TestFlight
npx testflight

Web Deployment

Deploy web apps using EAS Hosting:

# Deploy to production
npx expo export -p web
npx eas-cli@latest deploy --prod

# Deploy PR preview
npx eas-cli@latest deploy

EAS Configuration

Standard eas.json for production deployments:

{
  "cli": {
    "version": ">= 16.0.1",
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true,
      "ios": {
        "resourceClass": "m-medium"
      }
    },
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    }
  },
  "submit": {
    "production": {
      "ios": {
        "appleId": "[email protected]",
        "ascAppId": "1234567890"
      },
      "android": {
        "serviceAccountKeyPath": "./google-service-account.json",
        "track": "internal"
      }
    }
  }
}

Platform-Specific Guides

iOS
  • Use npx testflight for quick TestFlight submissions

  • Configure Apple credentials via eas credentials

  • See ./reference/testflight.md for credential setup

  • See ./reference/ios-app-store.md for App Store submission

Android
  • Set up Google Play Console service account

  • Configure tracks: internal → closed → open → production

  • See ./reference/play-store.md for detailed setup

Web
  • EAS Hosting provides preview URLs for PRs

  • Production deploys to your custom domain

  • See ./reference/workflows.md for CI/CD automation

Automated Deployments

Use EAS Workflows for CI/CD:

# .eas/workflows/release.yml
name: Release

on:
  push:
    branches: [main]

jobs:
  build-ios:
    type: build
    params:
      platform: ios
      profile: production

  submit-ios:
    type: submit
    needs: [build-ios]
    params:
      platform: ios
      profile: production

See ./reference/workflows.md for more workflow examples.

Version Management

EAS manages version numbers automatically with appVersionSource: "remote":

# Check current versions
eas build:version:get

# Manually set version
eas build:version:set -p ios --build-number 42

Monitoring

# List recent builds
eas build:list

# Check build status
eas build:view

# View submission status
eas submit:list

Files

references/ios-app-store.md

Submitting to iOS App Store

Prerequisites

  1. Apple Developer Account - Enroll at developer.apple.com

  2. App Store Connect App - Create your app record before first submission

  3. Apple Credentials - Configure via EAS or environment variables

Credential Setup

Using EAS Credentials
eas credentials -p ios

This interactive flow helps you:

  • Create or select a distribution certificate

  • Create or select a provisioning profile

  • Configure App Store Connect API key (recommended)

API keys avoid 2FA prompts in CI/CD:

  1. Go to App Store Connect → Users and Access → Keys

  2. Click "+" to create a new key

  3. Select "App Manager" role (minimum for submissions)

  4. Download the .p8 key file

Configure in eas.json:

{
  "submit": {
    "production": {
      "ios": {
        "ascApiKeyPath": "./AuthKey_XXXXX.p8",
        "ascApiKeyIssuerId": "xxxxx-xxxx-xxxx-xxxx-xxxxx",
        "ascApiKeyId": "XXXXXXXXXX"
      }
    }
  }
}

Or use environment variables:

EXPO_ASC_API_KEY_PATH=./AuthKey.p8
EXPO_ASC_API_KEY_ISSUER_ID=xxxxx-xxxx-xxxx-xxxx-xxxxx
EXPO_ASC_API_KEY_ID=XXXXXXXXXX
Apple ID Authentication (Alternative)

For manual submissions, you can use Apple ID:

[email protected]
EXPO_APPLE_TEAM_ID=XXXXXXXXXX

Note: Requires app-specific password for accounts with 2FA.

Submission Commands

# Build and submit to App Store Connect
eas build -p ios --profile production --submit

# Submit latest build
eas submit -p ios --latest

# Submit specific build
eas submit -p ios --id BUILD_ID

# Quick TestFlight submission
npx testflight

App Store Connect Configuration

First-Time Setup

Before submitting, complete in App Store Connect:

  1. App Information

    • Primary language

    • Bundle ID (must match app.json)

    • SKU (unique identifier)

  2. Pricing and Availability

    • Price tier

    • Available countries

  3. App Privacy

    • Privacy policy URL

    • Data collection declarations

  4. App Review Information

    • Contact information

    • Demo account (if login required)

    • Notes for reviewers

EAS Configuration
{
  "cli": {
    "version": ">= 16.0.1",
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "ios": {
        "resourceClass": "m-medium",
        "autoIncrement": true
      }
    }
  },
  "submit": {
    "production": {
      "ios": {
        "appleId": "[email protected]",
        "ascAppId": "1234567890",
        "appleTeamId": "XXXXXXXXXX"
      }
    }
  }
}

Find ascAppId in App Store Connect → App Information → Apple ID.

TestFlight vs App Store

TestFlight (Beta Testing)
  • Builds go to TestFlight automatically after submission

  • Internal testers (up to 100) - immediate access

  • External testers (up to 10,000) - requires beta review

  • Builds expire after 90 days

App Store (Production)
  • Requires passing App Review

  • Submit for review from App Store Connect

  • Choose release timing (immediate, scheduled, manual)

App Review Process

What Reviewers Check
  1. Functionality - App works as described

  2. UI/UX - Follows Human Interface Guidelines

  3. Content - Appropriate and accurate

  4. Privacy - Data handling matches declarations

  5. Legal - Complies with local laws

Common Rejection Reasons
IssueSolution
Crashes/bugsTest thoroughly before submission
Incomplete metadataFill all required fields
Placeholder contentRemove "lorem ipsum" and test data
Missing login credentialsProvide demo account
Privacy policy missingAdd URL in App Store Connect
Guideline 4.2 (minimum functionality)Ensure app provides value
Expedited Review

Request expedited review for:

  • Critical bug fixes

  • Time-sensitive events

  • Security issues

Go to App Store Connect → your app → App Review → Request Expedited Review.

Version and Build Numbers

iOS uses two version identifiers:

  • Version (CFBundleShortVersionString): User-facing, e.g., "1.2.3"

  • Build Number (CFBundleVersion): Internal, must increment for each upload

Configure in app.json:

{
  "expo": {
    "version": "1.2.3",
    "ios": {
      "buildNumber": "1"
    }
  }
}

With autoIncrement: true, EAS handles build numbers automatically.

Release Options

Automatic Release

Release immediately when approved:

{
  "apple": {
    "release": {
      "automaticRelease": true
    }
  }
}
Scheduled Release
{
  "apple": {
    "release": {
      "automaticRelease": "2025-03-01T10:00:00Z"
    }
  }
}
Phased Release

Gradual rollout over 7 days:

{
  "apple": {
    "release": {
      "phasedRelease": true
    }
  }
}

Rollout: Day 1 (1%) → Day 2 (2%) → Day 3 (5%) → Day 4 (10%) → Day 5 (20%) → Day 6 (50%) → Day 7 (100%)

Certificates and Provisioning

Distribution Certificate
  • Required for App Store submissions

  • Limited to 3 per Apple Developer account

  • Valid for 1 year

  • EAS manages automatically

Provisioning Profile
  • Links app, certificate, and entitlements

  • App Store profiles don't include device UDIDs

  • EAS creates and manages automatically

Check Current Credentials
eas credentials -p ios

# Sync with Apple Developer Portal
eas credentials -p ios --sync

App Store Metadata

Use EAS Metadata to manage App Store listing from code:

# Pull existing metadata
eas metadata:pull

# Push changes
eas metadata:push

See ./app-store-metadata.md for detailed configuration.

Troubleshooting

"No suitable application records found"

Create the app in App Store Connect first with matching bundle ID.

"The bundle version must be higher"

Increment build number. With autoIncrement: true, this is automatic.

"Missing compliance information"

Add export compliance to app.json:

{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
"Invalid provisioning profile"
eas credentials -p ios --sync
Build stuck in "Processing"

App Store Connect processing can take 5-30 minutes. Check status in App Store Connect → TestFlight.

CI/CD Integration

For automated submissions in CI/CD:

# .eas/workflows/release.yml
name: Release to App Store

on:
  push:
    tags: ['v*']

jobs:
  build:
    type: build
    params:
      platform: ios
      profile: production

  submit:
    type: submit
    needs: [build]
    params:
      platform: ios
      profile: production

Tips

  • Submit to TestFlight early and often for feedback

  • Use beta app review for external testers to catch issues before App Store review

  • Respond to reviewer questions promptly in App Store Connect

  • Keep demo account credentials up to date

  • Monitor App Store Connect notifications for review updates

  • Use phased release for major updates to catch issues early

Requirements and compatibility

Written for: OpenAI Codex

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Node.js

Security

What our scanner noticed· Low risk

  • Instructions that use the network

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Expo Team
Publisher
OpenAI (Official)
Distributed by
OpenAI
Source
openai/plugins · plugins/expo/skills/expo-deployment · commit d420d13
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from plugins/expo/LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Expo Team or OpenAI.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download expo-deployment.zip