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/testflight.md
TestFlight
For a SwiftUI/UIKit app with no React Native runtime, start with native-ios.md. EAS can build and submit it without adding Expo or React Native. For an established Expo/React Native app, npx testflight is also a convenient setup flow.
Submit an identified build
Use a store-distribution profile and record the source revision and returned build ID:
eas build --platform ios --profile testflight --no-wait --non-interactive
# After checking that build's result:
eas submit --platform ios --profile testflight --id BUILD_ID --non-interactiveUse the project's actual profile name. If --non-interactive exposes missing first-time credentials, configure them with eas credentials -p ios; repeated noninteractive retries will not complete that setup. Keep an existing EAS project, Apple team, bundle ID, and App Store Connect app record aligned.
eas build --auto-submit can submit the finished build with its matching submit profile. For separate jobs, pass the explicit build ID rather than selecting whichever unrelated build is newest.
Read status without reopening a submission
The following commands were verified with EAS CLI 23.2.0, including read-only checks of a completed iOS submission and its actual TestFlight state:
eas submit:list --platform ios --json
eas submit:view SUBMISSION_ID --json
eas submit:status --platform ios --profile testflight --json --non-interactiveUse the project's actual profile. submit:view reports the EAS job; submit:status reads App Store Connect and reports App Store versions and TestFlight processing/internal/external states. The latter needs an App Store Connect API key from the selected profile, environment, or existing EAS credentials. In noninteractive mode, a missing key is a setup error; it does not mean the build failed or does not exist. A beta state alone does not establish that a particular tester has access.
Older CLIs such as 18.6.0 lack these commands. Check eas --version and command help, or use a pinned npx [email protected] invocation. Prefer the supported CLI over importing its internal Node modules or writing private GraphQL queries. An errored submit:view --json result can still omit the underlying error; follow its log URLs to diagnose it.
Track the release state
| Verified state | What it establishes | Next check |
|---|---|---|
| EAS build finished | An artifact was produced | Confirm the intended build ID, source revision and store-distribution profile |
| Submission queued | EAS scheduled an upload | Follow the returned submission URL and worker logs |
| Apple upload/processing succeeded | Apple accepted the binary | Check TestFlight availability and any export-compliance work |
| Build assigned and available to testers | The intended testers can install it | Verify the beta app on a device |
| App Review approved and released | Public App Store distribution | Only part of an authorized production release |
Do not report an upload as finished based only on --no-wait returning successfully. If a submission fails with an empty summary, inspect its worker logs; the underlying Apple error may be there. Report the exact version/build and the furthest state actually verified.
Apple's TestFlight overview describes tester limits and beta review. Processing, compliance, group assignment and invitations affect availability; do not promise immediate installation. Internal testing and external beta review are separate from public App Review. Add builds to existing requested groups when authorized; do not create invitations or expand distribution implicitly.
Troubleshooting
| Symptom | Action |
|---|---|
| Required agreement missing or expired | The Account Holder must resolve it for the app's Apple team. Retrying or rebuilding does not accept an agreement. |
| App missing in App Store Connect | Check the selected organization and ascAppId against the native bundle identifier. One login may belong to several teams. |
| Duplicate build number despite EAS auto-increment | Inspect the archive's CFBundleVersion; for native Swift, check explicit versus generated plist configuration in native-ios.md. |
| Invalid large app icon / alpha channel | For the default (Any/light) AppIcon PNG, remove the alpha channel and rebuild. Even an all-opaque RGBA file can fail. Check the icon selected by that profile; preserve transparency in dark variants and Icon Composer layers. See the icon checks in native-ios.md. |
| Upload accepted but no installable build | Check processing/compliance state and the intended tester group's build assignment in App Store Connect. |
| Optional release-notes feature rejected by the EAS plan | Complete the required upload without that optional parameter and use App Store Connect for notes. Do not rebuild a valid binary or change the account plan for this. |
After an archive-content failure, fix the cause, validate the new artifact and submit its exact ID. After an account/submission-only failure, reuse the valid existing artifact once the account issue is resolved. Keep the requested release scope; uploading a beta does not authorize a public App Store release.
EAS CLI 23.2.0 also provides eas submit:retry SUBMISSION_ID --json --non-interactive. Check submit:view for retry eligibility and diagnose the cause first. Retrying an unchanged archive cannot fix its build number or icon; submit the corrected build instead. Use retry only when repeating the existing authorized upload is appropriate.
Use EAS Submit for iOS for current CLI/configuration guidance, and Apple's internal-tester guide for group setup. EAS upload success alone does not show that a particular tester has access.
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