AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
EAS (Expo Application Services) provides a comprehensive pipeline for building, signing, and submitting mobile applications to the Apple App Store, TestFlight, and Google Play. This skill supports Expo and React Native projects, as well as existing native iOS and Android applications. It manages the entire release lifecycle, including configuration via eas.json, versioning, metadata management, and automated store submission workflows.
What it does
- Configures build profiles and submission settings in eas.json
- Automates the build process for iOS and Android platforms
- Handles app versioning and build number management
- Submits binary artifacts directly to App Store Connect and Google Play Console
- Manages App Store metadata and store presence via CLI
- Integrates with CI/CD pipelines for automated release workflows
When to use it
- When preparing a production release for iOS or Android
- When automating the distribution of beta builds to TestFlight
- When managing app store metadata and store listings programmatically
- When setting up CI/CD for mobile app deployments
- When needing to handle native signing and provisioning for mobile builds
Advantages
- Streamlines the complex process of mobile app store submission
- Supports both cross-platform and native-only project structures
- Reduces manual effort through automated build and submission commands
- Provides consistent versioning and build management across platforms
- Enables infrastructure-as-code for app store metadata
Usage examples
- “Build my production iOS app and submit it to the App Store automatically.”
- The agent executes the build command with the production profile and the auto-submit flag, packaging the app and pushing it to App Store Connect.
- “How do I set up my project for EAS builds?”
- The agent guides you through running eas init and configuring the build profiles in eas.json to match your project requirements.
- “Update my App Store metadata using the current configuration.”
- The agent uses the metadata push command to sync your local store.config.json settings with the App Store Connect portal.
- “Check the status of my recent build.”
- The agent lists recent builds or retrieves the specific status of a build ID, providing visibility into the CI/CD process.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/expo/eas-app-stores/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip eas-app-stores.zip -d .agents/skills
Documentation by Expo
App Store Deployment
EAS service - costs apply. Cloud builds use EAS plan resources, and EAS services have free-tier and paid-plan limits. Apple Developer and Google Play memberships are separate. Check https://expo.dev/pricing for the requested service.
This skill covers building and releasing iOS and Android apps with EAS: Expo and other React Native projects, plus existing native apps. EAS is a delivery service; native apps can use it without adding Expo or React Native to their runtime. The native setup walkthrough currently covers SwiftUI/UIKit on iOS.
Choose the project path
SwiftUI/UIKit app with no React Native runtime: read references/native-ios.md before changing its build configuration. Keep the Xcode project and Swift code as the app's source of truth. The Expo/React Native quick-start and development-client examples below do not apply to this path.
Native Android app with no React Native runtime: preserve its existing native build setup. See references/play-store.md for submission; the Swift/iOS setup instructions do not apply. A dedicated native Android setup walkthrough is not yet included.
Expo/React Native app: use the quick-start below, then the relevant store reference.
Adding React Native screens to an existing native app: use
expo-brownfieldfor that integration; return here for distribution.
Use the archive and icon checks in references/native-ios.md during initial native iOS setup, after changing versioning, bundle IDs, or icons, or when diagnosing a rejected upload. Routine releases follow the EAS build/submit flow and the processing and availability checks in references/testflight.md. A successful EAS build or a queued submission does not establish Apple acceptance, tester access, or an App Store release.
References
Consult these resources as needed:
./references/workflows.md -- CI/CD workflows for automated store releases 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
./references/native-ios.md -- Native Swift/SwiftUI/UIKit setup, versioning, and archive verification without an Expo runtime
Expo / React Native Quick Start
Install EAS CLI
npm install -g eas-cli
eas loginInitialize EAS
npx eas-cli@latest initeas init links or creates the EAS project. Run eas build:configure to create build profiles in eas.json; preserve existing project and store identifiers when a release setup already exists.
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 --auto-submit
# Android: Build and submit to Play Store
npx eas-cli@latest build -p android --profile production --auto-submit
# Expo / React Native shortcut for iOS TestFlight
npx testflightWeb & API Route Hosting
Deploying an Expo website or Expo Router API routes to EAS Hosting (npx expo export -p web then eas deploy) is covered by the eas-hosting skill. This skill focuses on native app store releases.
EAS Configuration
Example for an Expo / React Native project (native Swift profiles are in references/native-ios.md):
{
"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
For native Swift apps, use the explicit build/submit flow in
references/native-ios.mdFor Expo / React Native apps,
npx testflightprovides a quick TestFlight flowConfigure Apple credentials via
eas credentialsSee ./references/testflight.md for credential setup
See ./references/ios-app-store.md for App Store submission
Android
Set up Google Play Console service account
Configure tracks: internal → closed → open → production
See ./references/play-store.md for detailed setup
Automated Releases
EAS Workflows automate the build → submit → update pipeline for CI/CD. See ./references/workflows.md for store-release examples. To author or validate workflow YAML, use the eas-workflows skill - it works from the live workflow schema.
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 iosThe version-set command prompts for the value. When setting up or changing native iOS versioning, or diagnosing a duplicate build number, inspect the archived CFBundleVersion: the remote counter alone does not prove that Xcode used it.
Monitoring
# List recent builds
eas build:list
# Check build status
eas build:view BUILD_ID
# Inspect submissions (verified with EAS CLI 23.2.0)
eas submit:list -p ios --json
eas submit:view SUBMISSION_ID --jsonCheck the CLI version before interpreting a missing command: these submission commands are available in 23.2.0 but not in the tested 18.6.0 installation. A pinned npx [email protected] invocation can use them without changing the global installation. See references/testflight.md for live Apple status and retry guidance. Follow the returned log URLs when the JSON result omits the underlying failure. Report the exact build ID/version and the furthest verified release state.
Submitting Feedback
If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
npx --yes @expo/agent-cli@latest feedback --category skills --subject "eas-app-stores" "<actionable feedback>"Only submit when you have something specific and actionable to report. Include as much relevant context as possible.
If an agent repeatedly fails at an Expo task or the user has to step in, submit a brief report of the task, expected result, and what went wrong using --category evals and the relevant Expo package or command as --subject.
Files
- ATTRIBUTION.mdAdded by AutoGineer815 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md7.3 KiB
- agents/openai.yaml343 B
- references/app-store-metadata.md13.6 KiB
- references/ios-app-store.md11.3 KiB
- references/native-ios.md9.9 KiB
- references/play-store.md5.7 KiB
- references/testflight.md5.8 KiB
- references/workflows.md2.1 KiB
references/ios-app-store.md
Submitting to iOS App Store
For native SwiftUI/UIKit apps without a React Native runtime, configure the Xcode/EAS path in native-ios.md first. The signing, App Store Connect, and review stages below apply to both native Swift and Expo/React Native apps.
Contents
Prerequisites
Credential Setup
Submission Commands
App Store Connect Configuration
TestFlight vs App Store
Complete the Public Release
App Review Process
Version and Build Numbers
Release Options
Certificates and Provisioning
App Store Metadata
Troubleshooting
CI/CD Integration
Tips
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:
Use eas credentials -p ios to select the build profile and configure its App Store Connect API key. Reuse a working managed key when one already exists. For an existing local team API key, configure the submit profile explicitly:
Configure in eas.json:
{
"submit": {
"production": {
"ios": {
"ascApiKeyPath": "./AuthKey_XXXXX.p8",
"ascApiKeyIssuerId": "xxxxx-xxxx-xxxx-xxxx-xxxxx",
"ascApiKeyId": "XXXXXXXXXX"
}
}
}
}Keep private key material outside version control. Use the installed CLI's credential flow and current documentation when setting up a different key type.
Apple ID Authentication (Alternative)
For manual submissions, you can use Apple ID:
[email protected]
EXPO_APPLE_TEAM_ID=XXXXXXXXXX
EXPO_APPLE_APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxxThe app-specific password is for the upload flow. Interactive Apple Developer signing setup has a separate authentication flow.
Submission Commands
# Build and submit to App Store Connect
eas build -p ios --profile production --auto-submit
# Submit the verified build
eas submit -p ios --profile production --id BUILD_ID
# Expo / React Native TestFlight shortcut
npx testflightApp Store Connect Configuration
First-Time Setup
Before submitting, complete in App Store Connect:
App Information
Primary language
Bundle ID (must match the archive; Xcode is authoritative for checked-in native projects)
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 appear after Apple processing; compliance and group assignment may still need attention
Internal testers (up to 100) - verify the build is available to the intended group
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)
Complete the Public Release
EAS Submit uploads the binary to App Store Connect. Public distribution continues through the app version's App Review and release flow, as described in the EAS Submit guide.
Open the correct app and iOS version in App Store Connect. In its Build section, select the exact processed version/build you verified. Reuse an eligible TestFlight build when its code, icon, and configuration are ready for production; build again when those must change. Confirm the build is selectable for the App Store version. See Apple's build-selection guide.
Complete the required listing and review information: screenshots, description, support/privacy URLs, age rating, privacy declarations, export compliance, reviewer contact/login, and pricing/availability as applicable. Resolve the version's outstanding requirements before submission.
Choose the requested release timing: manual release, automatic release after approval, or automatic release no earlier than a chosen date. Approval is still required for the date-based option.
Click Add for Review, inspect the draft submission, then Submit for Review. Adding to a draft alone does not send it to Apple. Handle review messages and verify the resulting status. See Apple's submission steps.
After approval, follow the selected release timing. For manual release, the version waits in Pending Developer Release until Release This Version is completed. Verify availability in the intended storefronts before reporting it live. See Apple's release options.
Perform these publication steps only within the requested release scope. Preparing documentation or uploading a TestFlight beta does not itself request a public launch. Report the exact version/build and distinguish uploaded, submitted for review, approved, and publicly available.
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
For Expo projects whose native files are generated from app config, configure in app.json:
{
"expo": {
"version": "1.2.3",
"ios": {
"buildNumber": "1"
}
}
}With autoIncrement: true and remote versioning, EAS increments its counter and writes native version metadata during the build. When setting up or changing native Swift versioning, or diagnosing a duplicate build number, verify the archive's CFBundleVersion as described in native-ios.md. A changing remote counter does not prove Xcode used it.
Release Options
These JSON examples are fragments of store.config.json for EAS Metadata. They configure release timing; uploading with EAS Submit still requires selecting the processed build and completing App Review before a public release.
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 iosApp 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"
Compare the number inside the rejected archive with EAS's remote counter. For native Swift, check the plist/build-setting ownership described in native-ios.md, then rebuild and submit the corrected artifact.
"Missing compliance information"
Review the app's actual encryption use and complete Apple's export-compliance requirements. For an Expo app generated from app config, an exempt app can declare:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}For a checked-in Swift app, the equivalent declaration belongs in its native Info.plist as ITSAppUsesNonExemptEncryption. Use the value appropriate to the app; changing app.json alone does not update its native plist.
"Invalid provisioning profile"
eas credentials -p iosBuild 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: Upload production iOS build
on:
push:
tags: ['v*']
jobs:
build:
type: build
params:
platform: ios
profile: production
submit:
type: submit
needs: [build]
params:
build_id: ${{ needs.build.outputs.build_id }}
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
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
- Published by
- Expo
- Publisher
- Expo (Official)
- Source
- expo/skills · plugins/expo/skills/eas-app-stores · commit a9e5bd3
- 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 or Expo.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download eas-app-stores.zip