ShipCheck reads your actual Xcode project and your actual App Store Connect data — then tells you exactly what will bounce your submission, before you find out from Apple.
No dashboards to configure, no data to upload anywhere. Open a project, and every screen below is populated from your real code and your real App Store Connect account.
LauncherEvery project you've audited before, one click away — reopen any of them without re-entering credentials.
Not a linter. ShipCheck cross-references your code against the live state of your App Store Connect record, so it catches drift — the mismatch that crept in six builds ago, not just typos.
Diffs the product IDs in your .storekit config and source code against what's actually registered in App Store Connect — the mismatch that causes a silent purchase failure in production.
Scans your code and every bundled third-party framework for Apple's Required Reason APIs, checks them against PrivacyInfo.xcprivacy, and drafts a reason code for anything undeclared — rule-based first, with optional AI (bring your own key) filling in the gaps a rule doesn't cover.
Name, subtitle, keywords, description, support URL, copyright, demo account, review notes — pulled live from App Store Connect and checked before a reviewer ever opens your build.
Compares content signals actually detected in your project against your declared App Store Connect age rating answers.
Checks what's actually uploaded to your most recent App Store Connect version, per device size and locale — not just whether you remembered, but whether it actually saved.
Generates a starting draft of both from the data collection ShipCheck actually detected in your project — something to review and publish, not boilerplate you write from scratch.
Export Compliance, missing permission usage strings, App Tracking Transparency, Sign in with Apple requirements, and Background Modes consistency — the declarations easy to get wrong precisely because you got them right last time.
Handing an API key to a new tool should feel uncomfortable. Here's exactly what ShipCheck does with yours — nothing hidden.
Your .p8 key is stored in macOS Keychain with access control, unlocked only after you unlock your Mac — never written to disk as a plain file.
ShipCheck signs its own request token on your Mac. Only that signed token — never the private key itself — is sent, straight to Apple.
There is no ShipCheck server to breach. Every App Store Connect call goes directly from your machine to Apple's API.
Key ID, Issuer ID, and a .p8 file are the exact three values fastlane — the tool most professional iOS teams already trust — has used for years. ShipCheck's Keychain-backed storage is more restrictive than fastlane's typical plain-file setup.
AI only ever assists with one thing: suggesting a Privacy Manifest reason code when no rule matches. Off by default — add a key from Anthropic, OpenAI, Gemini, Mistral, Groq, DeepSeek, or xAI, and calls go straight from your Mac to that provider, never through ShipCheck.
The tradeoff, stated plainly: ShipCheck doesn't run inside Apple's App Sandbox — it needs full filesystem access to read your Xcode project. That's exactly why the setup steps below have you create a key scoped to the Developer role rather than Admin: least privilege, so there's less at risk even in a worst case.
The same app runs headless — wire it into a build phase or CI job so a product ID mismatch or a missing Privacy Manifest entry fails the build right away, instead of surfacing weeks later right before you submit.
/Applications/ShipCheck.app/Contents/MacOS/ShipCheck --ci /path/to/your/project
Always runs the checks that need no App Store Connect account — IAP ID consistency, Privacy Manifest, and Other Declarations — and exits non-zero on any blocking finding. Optionally add your API key as an environment variable to also run a real IAP diff against App Store Connect, or wire it into a git pre-commit hook to catch drift before it's even pushed. Full setup guide, including React Native projects →
ShipCheck needs three things from Apple to read your app's real data. Here's exactly where to find them.
In App Store Connect, go to Users and Access → Integrations → App Store Connect API.
Click Generate API Key, give it a name, and grant it Developer access — the minimum role ShipCheck needs. Avoid Admin: a key scoped to Developer cannot touch users, agreements, or finances, so there is less exposure if it were ever compromised.
Both appear right on that page next to your new key, e.g. Key ID: 2X9R7B4K3P and Issuer ID: 69a6de….
Apple only lets you download this once. Save it somewhere you won't lose it before you navigate away from the page.
Open ShipCheck → Settings → App Store Connect, enter the Key ID and Issuer ID, and choose the .p8 file.
Why does ShipCheck need this? Apple's App Store Connect API requires every request to carry a signed token proving it's really you. ShipCheck builds and signs that token locally, on your Mac, using the key you just downloaded — the file itself is stored in your Keychain and never transmitted anywhere except directly to Apple.
$0 — during the public beta
After the beta, new installs get one project with full App Store Connect integration for free, then $29.99/yr or $89.99 once for unlimited projects. Local-only checks (Privacy Manifest, declarations, IAP against your local .storekit) always stay free, on every project, no account needed.
Every bug report and feature request is read directly by the person building this — no support tickets, no forms. Tell me what ShipCheck missed, or what it should check next.