Will this build install? Find out before you upload it
Every plan, no account needed. Security findings with a Pro or Team token
The usual way to learn that an iPhone build has the wrong profile is a tester saying "it will not install" an hour after you sent the link. By then the build is shared, the link is out and someone has to start again.
npx appforshare check reads the .ipa, .apk or .aab where it was built, on your computer or the CI runner, and prints what would stop it: store readiness findings, install problems and the security scan counts. Nothing is uploaded and the file is not sent anywhere.
Example
appforshare check app.ipa
- Provisioning profileAd Hoc, ends in 9 days
- Bundle IDCovered by the profile
- Store readinessReady
- Security scan0 to fix, 2 warnings, 1 note
Made for
- Developers who want to catch signing mistakes before testers do
- CI pipelines that should stop before a broken build is shared
- Teams that cannot send a build to any outside service before it is cleared
What it ends
- Sharing a build signed for the App Store and finding out from testers
- A provisioning profile that expired last week
- An Android test only or debug build sent to a client
How it works
Step 1
Run it on the file
npx appforshare check build/app.ipa. Give a folder for its newest build, or nothing to check the folders in appforshare.config.json.
Step 2
Read the result
Store readiness findings with a fix each, install checks, and the security scan counts. --json prints the same for scripts.
Step 3
Stop the pipeline
Exit code 2 when the result is blocked, also on review with --fail-on review; 1 when the file could not be read. In the GitHub Action, check: true stops the step before anything is uploaded.
What it checks
iOS: no provisioning profile, a profile that expired or ends within 14 days, an App Store profile, expired certificates, a bundle ID the profile does not cover, entitlements the profile does not grant, and a wildcard App ID with capabilities. Android: not signed, test only, only a v1 signature on an app that targets API 30 or higher, debuggable, and the debug key.
Then the same store readiness rules as the IPA and APK inspectors and every upload (one generator keeps them equal), and the security scan rules. App Store signed .ipa files are not failed for install problems, since they are meant for TestFlight.
Who sees what
The readiness and install checks need no account and no token. The security scan findings, with where each one is and how to fix it, need a Pro or Team token; without one you see the counts, the same rule as the build page. With a token the CLI only asks AppForShare which plan it has.
An .aab is read from its protobuf manifest, with the rules run on the base module. The check says an .aab does not install on a phone; uploading it with a free account turns it into an APK.
Your AI coding assistant can run it too, through check_local_build in the npm appforshare-mcp package, which reads files on your computer.
Good to know
- Guidance, not a promise of store approval.
- Not a security audit, a penetration test or a malware check.
- It does not know which iPhones your testers have; the install page and the profile inspector check a given device.
Questions
- Is the file uploaded?
- No. It is read on your computer or runner. With a token, the CLI only asks which plan the token has.
- Do I need an account?
- No, for the readiness and install checks. Security findings need a Pro or Team token.
- Is it the same check as after upload?
- Yes. The same rules run on every upload, so the answer matches.
- Can I check without the terminal?
- Yes. The IPA inspector, APK analyzer and AAB inspector run in the browser, also without uploading.
Read next
Try it on your own app
Free account in a minute. Pro starts with a 7 day free trial.
More features
- Builds on GitHub Actions
- Flutter builds on GitHub Actions
- Flutter facts and checks
- Security scan on every build
- Connect Expo (EAS builds)
- Connect Codemagic
- Send store builds to TestFlight and Google Play
- TestFlight groups and beta review on send
- TestFlight feedback in your inbox
- iOS device registration
- Hands free device setup
- Store listing editor
- App Store submission
- Google Play releases
- TestFlight tester sync
- Tester app with notifications
- Tester groups and status
- Join links for testers
- Beta and Live channels
- Build history page
- Tasks and activity feed
- Feedback to Linear and Jira
- Release checklist, approvals and blockers
- Release page per version
- Install link controls
- Several links per build
- Retire a test build
- TestFlight and APK in one link
- Install page in 13 languages
- In-app update check
- .aab uploads
- MCP server for AI tools
- Tester feedback with screenshots
- In-app feedback link
- AI test plan for each build
- Diawi compatible upload API
- Remember my iPhone
- Install help and why it failed
- Email the install link
- Custom channel address
- Verified publisher
- Daily install email
- Zipped .app upload
- Manage link for guest uploads
- Test accounts on the install page
- Telegram notifications
- Permissions in plain words
- Reply to testers and star ratings
- Follow a channel by email
- Download button for a README
- Store pages
- Token scopes and CLI tools
- Upload from Claude or ChatGPT
- Passkeys and email code sign in
- Free build tools
- How reports work
- Malware check on every upload