EAS Submit

eas-submitDeployment33 lines

Upload builds to the App Store and Play Store from CI.

Current — as published in v1.3.2. Written by hand for EAS Submit, not generated.

The rule

Credentials

  • The Play service account JSON is never committed. Store it as an EAS secret or a CI file variable, and keep the path in .gitignore.
  • Use an App Store Connect API key, not an Apple ID and password — CI cannot answer a 2FA prompt.
  • EXPO_TOKEN lives in CI secrets, masked.

Tracks

  • Submit to internal or a beta track, then promote in the store console. Submitting straight to production removes the step where someone confirms the build is the intended one.
  • Submitted is not released. The build sits in a track until a human publishes.

Build numbers

  • autoIncrement in the production build profile. Stores reject duplicates *after* the upload finishes, wasting an entire build cycle.

In CI

  • --non-interactive always.
  • Prefer an explicit build --id over --latest, so a concurrent build cannot be submitted by mistake.

Never

  • Never commit store credentials of any kind.
  • Never submit from a local machine for a release the team relies on — it is unreproducible.

As each tool receives it

The same guidance, in the shape each editor reads. Cursor and Claude Code are written separately by hand; the rest are derived from the Cursor rule.

.cursor/rules/eas-submit.mdchand-written for this tool
.cursor/rules/eas-submit.mdc
---
description: EAS Submit conventions
globs: ["eas.json", ".github/workflows/**", ".gitlab-ci.yml"]
alwaysApply: false
---

# EAS Submit

## Credentials

- The Play service account JSON is **never committed**. Store it as an EAS
  secret or a CI file variable, and keep the path in `.gitignore`.
- Use an App Store Connect API key, not an Apple ID and password — CI cannot
  answer a 2FA prompt.
- `EXPO_TOKEN` lives in CI secrets, masked.

## Tracks

- Submit to `internal` or a beta track, then promote in the store console.
  Submitting straight to production removes the step where someone confirms the
  build is the intended one.
- Submitted is not released. The build sits in a track until a human publishes.

## Build numbers

- `autoIncrement` in the production build profile. Stores reject duplicates
  *after* the upload finishes, wasting an entire build cycle.

## In CI

- `--non-interactive` always.
- Prefer an explicit build `--id` over `--latest`, so a concurrent build cannot
  be submitted by mistake.

## Never

- Never commit store credentials of any kind.
- Never submit from a local machine for a release the team relies on — it is
  unreproducible.

What else this module writes

Selecting EAS Submit contributes more than a rule file — all of it merged with every other module you pick, with conflicts resolved rather than duplicated.

Environment
EXPO_TOKENrequiredAuthenticates EAS in CI. Never in a local `.env` that could be committed.
GOOGLE_SERVICE_ACCOUNT_KEY_PATHoptionalPath to the Play service account JSON, provided by CI at runtime.
ASC_APP_IDoptionalApp Store Connect app id used by the submit profile.
Checklists
checklists/store-submission.md

Related

Put this in your repo

Adds EAS Submit to a project this tool generated, without starting over. Files you have hand-edited are left alone.