Expo Deployment
OpenAIOfficialCreated by Expo TeamDistributed by OpenAI
- Skill
- Tool integration
- Cloud and DevOps
- MIT
- Low risk
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
Download the skill as a ZIP:
https://autogineer.com/agent-skills/openai/expo-deployment/downloadUnzip 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 loginInitialize EAS
npx eas-cli@latest initThis 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 productionSubmit 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 testflightWeb 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 deployEAS 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 testflightfor quick TestFlight submissionsConfigure Apple credentials via
eas credentialsSee ./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: productionSee ./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 42Monitoring
# List recent builds
eas build:list
# Check build status
eas build:view
# View submission status
eas submit:listFiles
- ATTRIBUTION.mdAdded by AutoGineer820 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md3.6 KiB
- agents/openai.yaml368 B
- references/app-store-metadata.md13.0 KiB
- references/ios-app-store.md6.9 KiB
- references/play-store.md5.1 KiB
- references/testflight.md1.6 KiB
- references/workflows.md3.0 KiB
references/ios-app-store.md
Submitting to iOS App Store
Prerequisites
Apple Developer Account - Enroll at developer.apple.com
App Store Connect App - Create your app record before first submission
Apple Credentials - Configure via EAS or environment variables
Credential Setup
Using EAS Credentials
eas credentials -p iosThis interactive flow helps you:
Create or select a distribution certificate
Create or select a provisioning profile
Configure App Store Connect API key (recommended)
App Store Connect API Key (Recommended)
API keys avoid 2FA prompts in CI/CD:
Go to App Store Connect → Users and Access → Keys
Click "+" to create a new key
Select "App Manager" role (minimum for submissions)
Download the
.p8key 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=XXXXXXXXXXApple ID Authentication (Alternative)
For manual submissions, you can use Apple ID:
[email protected]
EXPO_APPLE_TEAM_ID=XXXXXXXXXXNote: 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 testflightApp Store Connect Configuration
First-Time Setup
Before submitting, complete in App Store Connect:
App Information
Primary language
Bundle ID (must match
app.json)SKU (unique identifier)
Pricing and Availability
Price tier
Available countries
App Privacy
Privacy policy URL
Data collection declarations
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
Functionality - App works as described
UI/UX - Follows Human Interface Guidelines
Content - Appropriate and accurate
Privacy - Data handling matches declarations
Legal - Complies with local laws
Common Rejection Reasons
| Issue | Solution |
|---|---|
| Crashes/bugs | Test thoroughly before submission |
| Incomplete metadata | Fill all required fields |
| Placeholder content | Remove "lorem ipsum" and test data |
| Missing login credentials | Provide demo account |
| Privacy policy missing | Add 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 --syncApp Store Metadata
Use EAS Metadata to manage App Store listing from code:
# Pull existing metadata
eas metadata:pull
# Push changes
eas metadata:pushSee ./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 --syncBuild 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: productionTips
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