google-play-setup — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited google-play-setup (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
npm install -g eas-cli && eas loginRequired reading — Expo official guides:
Set the package name in app.json before the first build — it cannot be changed after the app is published:
{
"expo": {
"android": {
"package": "com.yourorg.appname"
}
}
}Use reverse domain notation. Must be globally unique on Play Store.
Note the Application ID from the URL: play.google.com/console/u/0/developers/.../app/XXXXXXXXXXXXXXXXXX/
Google requires these before you can upload any build:
App content declarations (Play Console → Policy → App content):
Store listing (Play Console → Grow → Store presence → Main store listing):
None of this blocks the first upload but it does block publishing to users.
"Finish setting up your app" banner — Play Console shows this dashboard banner after app creation. It lists required items before you can publish. Work through them in order — all must be green before the app goes live. This is separate from the store listing itself.
cd mobile
eas credentialsSelect Android → production → Let EAS manage the keystore (recommended).
EAS generates and stores the Android signing keystore. Never lose this keystore — you cannot update your app without it. EAS stores it encrypted.
To verify:
eas credentials --platform androidGoogle requires the very first AAB to be uploaded manually via Play Console. Subsequent uploads work via eas submit.
# Build the AAB
cd mobile
eas build --platform android --profile production
# Download the AAB when done
eas build:list --platform android
# Click the download link from the output, or:
eas build:download --platform android --latestUpload manually:
.aab fileAfter this first manual upload, eas submit will work for all future releases.
Sharing the internal testing link — Unlike TestFlight (email invites), Google Play internal testing uses a shareable opt-in link. After rollout:
They won't find the app by searching — they must use the link.
Required for non-interactive submissions from GitHub Actions.
Create service account:
eas-submitGrant Play Console permissions:
Add to EAS:
# Option A: Store in eas.json (committed, less secure)
# Point eas.json submit profile to the file path
# Option B: Upload to EAS secrets (recommended for CI)
eas secret:create --scope project --name GOOGLE_SERVICE_ACCOUNT_KEY --value "$(cat service-account.json)"Or store locally and reference in eas.json:
{
"submit": {
"production": {
"android": {
"serviceAccountKeyPath": "./google-services.json",
"track": "internal",
"releaseStatus": "draft"
}
}
}
}After the first manual upload and service account setup:
eas submit --platform android --profile production --latestThis uploads to the internal testing track with draft status by default. You manually promote to production in Play Console.
| Track | Who sees it | When to use |
|---|---|---|
| Internal | Up to 100 testers (your team) | Every build for QA |
| Closed testing (Alpha) | Invited users | Beta before launch |
| Open testing (Beta) | Anyone who opts in | Public beta |
| Production | All users | Launch |
Start with Internal track. Promote builds through tracks in Play Console — no rebuild needed.
"Package name already taken" — The package name is globally unique. Use a specific reverse domain.
Upload rejected: "Version code already used" — Always use appVersionSource: "remote" + autoIncrement: true in eas.json.
"You need to upload an AAB first" — You must manually upload the very first build. eas submit will fail until then.
Service account upload fails with 403 — The service account needs Release manager or Admin permissions in Play Console (not just Google Cloud IAM). Check Play Console → API access → service account permissions.
"App not found" during submit — The applicationId in eas.json must exactly match the package name in app.json and Play Console.
Data safety form blocks publishing — Fill it in Play Console → Policy → App content → Data safety. Must declare all data collected (Supabase auth = email/user ID, PostHog = device info).
First submission review takes 3–7 days — Build your buffer into the timeline. Subsequent updates usually review in hours.
Camera/microphone/location access requires a public Privacy Policy URL — Google will reject or unpublish apps that request sensitive permissions without a publicly accessible privacy policy. The URL must be reachable without login.
Data safety form blocks publishing — Fill it in Play Console → Policy → App content → Data safety. Must declare all data collected (Supabase auth = email/user ID, PostHog = device info, camera = photos if saved).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.