apple-appstore-setup — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited apple-appstore-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 logincom.yourorg.appname (must match ios.bundleIdentifier in app.json)Bundle ID in app.json:
{
"expo": {
"ios": {
"bundleIdentifier": "com.yourorg.appname"
}
}
}com-yourorg-appname)Note the App ID (10-digit number) from the URL: appstoreconnect.apple.com/apps/XXXXXXXXXX — you need this for eas.json.
EAS manages certificates and provisioning profiles in the cloud. Run once per app:
cd mobile
eas credentials --platform iosSelect: production → Manage credentials → let EAS generate certificates automatically.
Then set up the App Store Connect API Key for submissions (required for eas submit to work):
eas credentials --platform iosSelect: production → App Store Connect: Manage your API Key → Set up your project to use an API Key for EAS Submit
Follow the prompts — EAS will ask for your Key ID, Issuer ID, and .p8 file. This is separate from build credentials and must be done before the first eas submit.
EAS stores everything encrypted on its servers — no local .p12 files needed.
{
"cli": {
"version": ">= 12.0.0",
"appVersionSource": "remote"
},
"build": {
"production": {
"distribution": "store",
"autoIncrement": true,
"env": {
"EXPO_PUBLIC_SUPABASE_URL": "https://xxx.supabase.co",
"EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY": "eyJ..."
}
}
},
"submit": {
"production": {
"ios": {
"ascAppId": "XXXXXXXXXX"
}
}
}
}ascAppId is the 10-digit App ID from App Store Connect.
Required for non-interactive submissions from GitHub Actions.
CI/CD, Access: App Manager.p8 file — download once onlyUpload to EAS (run once):
eas secret:create --scope project --name APPLE_API_KEY_P8 --value "$(cat AuthKey_XXXXXXXXXX.p8 | base64)"
eas secret:create --scope project --name APPLE_API_KEY_ID --value "XXXXXXXXXX"
eas secret:create --scope project --name APPLE_API_KEY_ISSUER --value "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"Or add to GitHub Actions secrets (see dev-to-prod.sh output).
# Build (takes 10–20 min on EAS cloud)
cd mobile
eas build --platform ios --profile production
# Monitor build
eas build:list --platform ios
# Submit to TestFlight after build completes
eas submit --platform ios --profile production --latestAfter submission, Apple processes the build for 10–15 minutes, then it appears in TestFlight.
Add internal testers: App Store Connect → TestFlight → Internal Testing → Add testers.
Before submitting for App Review:
expo-tracking-transparency installed if using PostHog/analytics (iOS 14.5+)Generate screenshots with Maestro or manually in Simulator: Device → Take Screenshot.
iOS creates everything automatically — EAS handles provisioning profiles, certificates, and push notification entitlements. You create the App Store Connect listing once and EAS does the rest. No manual cert management needed.
Android is the opposite: the first AAB upload must be done manually, service accounts must be created manually, and the Play Console listing has many required forms to fill before publishing.
"Missing compliance" — Set ITSAppUsesNonExemptEncryption = false in app.json if your app doesn't use custom encryption (most apps):
{ "expo": { "ios": { "infoPlist": { "ITSAppUsesNonExemptEncryption": false } } } }"Bundle ID already registered" — Someone else (or a previous project) used that bundle ID. Choose a unique one.
Build number conflict — Always use appVersionSource: "remote" + autoIncrement: true to avoid this.
TestFlight build missing after 15 min — Check App Store Connect → Activity for processing errors. Usually a missing compliance declaration.
"Invalid API key" — The .p8 file must be base64-encoded before storing as a secret. Verify with echo $APPLE_API_KEY_P8 | base64 -d | head -1 — should show -----BEGIN PRIVATE KEY-----.
Signing certificate expired — Run eas credentials --platform ios and select "Remove" then re-generate. EAS handles this automatically.
`eas submit` fails with "Set ascAppId in the submit profile" — Add the 10-digit App ID to eas.json:
{ "submit": { "production": { "ios": { "ascAppId": "6758882748" } } } }Get it from the App Store Connect URL: appstoreconnect.apple.com/apps/XXXXXXXXXX.
`eas submit` fails with "no API key configured" — Run eas credentials --platform ios → production → App Store Connect: Manage your API Key and complete the setup. Build credentials and submit credentials are configured separately.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.