Generated banner for Eas App Stores
Generated logo for Eas App Stores

Eas App Stores

ExpoOfficialPublished by Expo

  • Skill
  • Workflow
  • Software development
  • MIT
  • Low risk

From the author

Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play. Supports Expo and other React Native projects, plus existing native apps. Use for eas.json setup, release pipelines, signing, app versions and build numbers, store submissions, and listing metadata. For Expo websites and API routes, use eas-hosting; for adding React Native screens to a native app, use expo-brownfield.
— the description by Expo

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

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/expo/eas-app-stores/download
  2. Unzip 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-brownfield for 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 login
Initialize EAS
npx eas-cli@latest init

eas 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 production
Submit 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 testflight

Web & 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.md

  • For Expo / React Native apps, npx testflight provides a quick TestFlight flow

  • Configure Apple credentials via eas credentials

  • See ./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 ios

The 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 --json

Check 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

references/native-ios.md

Native Swift iOS apps on EAS

Use this path when the app runs SwiftUI or UIKit and the task is to build or distribute it with EAS. Adding React Native screens is a different task. EAS Build supports native projects without Expo or React Native, but the main setup tutorials assume a React Native project.

Keep the delivery wrapper small

Inspect the Xcode project, shared scheme, Swift entry point, dependencies, signing settings, and current release configuration first. Keep hand-maintained native code checked in. Running expo prebuild --clean would regenerate native directories; it is not a setup step for this path.

The default EAS iOS pipeline expects a project beneath ios/. A typical layout is:

app.json
eas.json
package.json
package-lock.json
ios/
  Podfile
  MyApp.xcodeproj/
  MyApp/
    MyApp.swift
    Info.plist

The package file is tooling metadata, not a JavaScript app. A project with no Node dependencies can use:

{
  "name": "my-app",
  "version": "1.0.0",
  "private": true
}

Keep a matching lockfile for the chosen package manager. Do not add expo, react, react-native, an index.js, Metro, or expo-dev-client merely to use EAS. Preserve those dependencies if the app actually uses them. EAS CLI can read a minimal app.json without an installed Expo SDK:

{
  "expo": {
    "name": "My App",
    "slug": "my-app",
    "ios": { "bundleIdentifier": "com.example.myapp" }
  }
}

eas init links the project and writes extra.eas.projectId. Reuse the existing ID when one exists. The expo JSON key is EAS configuration here, not evidence of an Expo runtime. Xcode's bundle identifier is authoritative for a checked-in native project; keep any duplicate app-config identifier consistent, particularly for GitHub-triggered builds.

The default iOS worker skips prebuild for checked-in native projects but still runs pod install. For an app with no pods, a minimal Podfile can serve as an adapter:

platform :ios, '17.0'

target 'MyApp' do
end

Use the app's real deployment target and target name. This does not add React Native pods. If the project must avoid CocoaPods or has a different layout, use a custom EAS build or archive/export with Xcode and submit the resulting IPA. Do not relocate an established native project just to match this example.

Build and submit profiles

Select the actual shared scheme. Set ios.image from the current build-image list when a particular Xcode/SDK is required. Use explicit build configurations; developmentClient: true configures Expo's development client, not generic Swift debugging.

{
  "cli": { "appVersionSource": "remote" },
  "build": {
    "base": { "ios": { "scheme": "MyApp" } },
    "simulator": {
      "extends": "base",
      "ios": { "simulator": true, "buildConfiguration": "Debug" }
    },
    "testflight": {
      "extends": "base",
      "distribution": "store",
      "autoIncrement": true,
      "ios": { "buildConfiguration": "Release" }
    },
    "production": {
      "extends": "base",
      "distribution": "store",
      "autoIncrement": true,
      "ios": { "buildConfiguration": "Release" }
    }
  },
  "submit": {
    "testflight": { "ios": { "ascAppId": "1234567890" } },
    "production": { "ios": { "ascAppId": "1234567890" } }
  }
}

The IDs and target names above are examples. ascAppId is the numeric App Store Connect app ID, not the EAS project UUID, bundle ID, or Apple team ID. Verify the selected Apple team, the native bundle ID, and the app record together; one Apple login may belong to multiple organizations.

A pure Swift wrapper with neither Expo dependencies nor Expo SDK metadata needs no Expo Doctor or JavaScript-bundling skip flags. Existing native build phases and actual dependency integrations still need inspection. Avoid carrying unexplained environment overrides from a React Native template; keep native compiler settings in the Xcode project or xcconfig and retain Release debug symbols for crash reports.

For icon selection or other native build preparation, use an EAS lifecycle hook such as eas-build-post-install when necessary. An Expo config/prebuild plugin will not run on this native path. Preserve an existing hook rather than replacing its other work.

Versioning and icon troubleshooting

These checks address two failures encountered while testing a SwiftUI release: a stale archive build number and a default icon with an alpha channel. Use the relevant check during initial setup, after changing versioning, bundle IDs, or icons, or to diagnose a rejected upload. Routine releases use the EAS build/submit flow below.

EAS remote versioning increments a counter. The native version updater writes CFBundleVersion to the target's explicit INFOPLIST_FILE. A generated plist with a fixed CURRENT_PROJECT_VERSION can leave every archive reporting build 1 even while the EAS dashboard reports increasing numbers.

For the default pipeline, an explicit app plist is a tested approach:

GENERATE_INFOPLIST_FILE = NO
INFOPLIST_FILE = MyApp/Info.plist
MARKETING_VERSION = 1.0.0

Include these entries in the complete app plist:

<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>1</string>

That local build number is a starting value; EAS writes the remote value during the store build. Apply the settings to the app's relevant configurations and preserve the rest of its metadata: identity, privacy usage descriptions, scene/launch configuration, orientations and supported devices. Do not replace a full plist with this excerpt or change test targets indiscriminately. Review extension targets' version synchronization separately.

An existing generated-plist setup can also work if its build process explicitly sets CURRENT_PROJECT_VERSION before archiving. Keep it when verified; do not migrate every native project automatically. Changing only app.json or observing an incremented remote counter is insufficient evidence.

When setting up or changing versioning or the bundle ID, or diagnosing a rejected upload, inspect the built app's plist with macOS's built-in tools:

plutil -p "/path/to/MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist"

For a downloaded .ipa, unzip it into a temporary directory and inspect Payload/MyApp.app/Info.plist; for a built .app, inspect its Info.plist directly. Compare CFBundleIdentifier, CFBundleShortVersionString, and CFBundleVersion with the intended release. Values must be resolved strings, and CFBundleSupportedPlatforms must contain iPhoneOS, not iPhoneSimulator. eas build:view BUILD_ID --json provides build details and the artifact URL; its reported version is not a substitute for checking the archive.

When adding or changing a default (Any/light) 1024px AppIcon PNG, or diagnosing an icon rejection, inspect the source selected by that build profile:

sips -g pixelWidth -g pixelHeight -g hasAlpha "/path/to/AppIcon.appiconset/icon.png"

The default icon should be 1024×1024 with no alpha channel, even if every pixel looks opaque. Preserve transparency in dark variants and Icon Composer layers; follow Apple's guidance for each appearance. These local checks help diagnose the artifact; use the EAS submission logs and Apple processing status to verify acceptance.

Check privacy usage descriptions against the features used by the app. Set the encryption declaration according to the app's actual encryption use; do not copy false solely to suppress an export-compliance prompt.

Ship the exact build

Reuse established EAS/Apple credentials. For a new setup, configure signing with eas credentials -p ios and select the correct team. An App Store Connect API key supports unattended submission without changing the app's owner or bundle ID.

eas build --platform ios --profile testflight --no-wait --non-interactive
# Record the returned build ID; verify its result and source revision.
eas submit --platform ios --profile testflight --id BUILD_ID --non-interactive

For an IPA exported elsewhere:

eas submit --platform ios --profile testflight --path /path/to/MyApp.ipa

Use the explicit ID when multiple builds exist. Keep the distribution scope the user requested. Follow the submission's worker logs through Apple processing, then check tester availability in App Store Connect. A successful upload does not create tester access or release the app publicly.

For production, reuse an eligible uploaded build when it already has the intended release code, icon, configuration, and version. If the beta build uses a preview icon or different configuration, create and verify a production-profile build, then upload that exact archive. A second upload is not required solely to move an eligible tested build into App Review.

Complete the public release steps in App Store Connect: select the processed build, finish the listing/privacy/review information, submit for App Review, and apply the requested release timing. The official EAS Submit guide describes this handoff. TestFlight distribution alone does not authorize publishing an App Store release.

Verification scope

This approach was exercised with a SwiftUI app on EAS CLI 18.6.0 and Xcode 26.2: an isolated default-pipeline simulator build succeeded without Expo/React/React Native dependencies or skip flags. The explicit-plist and opaque-icon fixes were also verified by a signed device build accepted by Apple. Recheck worker/CLI behavior when updating tooling; project layout, custom hooks, extensions and signing requirements can differ.

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.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download eas-app-stores.zip