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_TOKENlives in CI secrets, masked.
Tracks
- Submit to
internalor 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
autoIncrementin the production build profile. Stores reject duplicates *after* the upload finishes, wasting an entire build cycle.
In CI
--non-interactivealways.- Prefer an explicit build
--idover--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.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.