shipcheck

Catch the rejection before you submit it

Updated September 6, 2026 · published by Baker Ventures LLC · sources cited inline

shipcheck reads your React Native or Expo project and tells you what App Review will say before you find out the slow way. Three commands, no account, no browser tab:

/plugin marketplace add
/plugin install shipcheck
/shipcheck:scan

Every finding comes with four things: the clause it violates, the quoted policy text, the wording the reviewer is likely to use, and the file to change. The first scan is free and shows real findings — not a blurred teaser, not "we found 3 issues, pay to see them."

It runs inside the Claude Code session you already have open, against local files. Your code never leaves your machine. There is no repository grant to approve and no account to create.

What it actually checks

The value is in the deterministic layer — rejections that live in files, where the reviewer's message names a guideline and you spend two build cycles working out which of 800 packages caused it.

Privacy manifests, properly. Required-reason API categories used with no declared reason (ITMS-91053). Frameworks on Apple's published SDK list with no manifest at all (ITMS-91061). It reads node_modules, Podfile.lock and every PrivacyInfo.xcprivacy in the tree — which is how you discover that hermes, React Native's default JavaScript engine, is on Apple's list, or that a transitive nanopb under Firebase is what broke your upload.

Permission strings without features. An Info.plist purpose string describing a capability the app no longer ships, usually injected by a config plugin for a package you kept after removing the feature.

Background modes without a feature. Guideline 2.5.4 rejects apps declaring the location UIBackgroundModes key with no genuine persistent-location capability.

Account deletion. Guideline 5.1.1(v) requires apps supporting account creation to offer in-app account deletion. Detail.

Metadata and completeness. Placeholder text, dead privacy-policy links, screenshots or descriptions naming other mobile platforms (2.3.10), demo accounts that do not work (2.1).

Google Play. Data safety declarations that do not match what the manifest and SDKs actually do, target API level, background-location declaration requirements, foreground-service types.

Generated-project traps. Fixes applied to ios/ that Expo's prebuild will overwrite — a mistake that costs an entire cycle and looks correct locally both times.

Why this exists

Three facts, and they compound.

A rejection costs calendar time, not effort. The fix is four minutes. The cycle is a 20–40 minute build, an upload, one to three days in review, and a message that names a guideline rather than a file. The arithmetic.

In React Native, the offending code is usually not yours. Apple's privacy-manifest rule is per-bundle — each executable or dynamic library that uses a required reason API needs a manifest in its own bundle. Your app's manifest cannot cover a framework. And your framework list is a function of your lockfile, not your decisions. Why RN and Expo differ.

Expo's own tooling says the audit is manual. Expo's Apple privacy guide states that "Apple does not correctly parse all the PrivacyInfo files included by static CocoaPods dependencies," and recommends walking node_modules yourself and aggregating the values by hand. That is the honest state of the art, and it is exactly the kind of work that should not be done by a person.

Free resources on this site

Pricing, and why rescans are unlimited

TierPriceWhat you get
Free$0One scan, real findings, exact clauses
Single app$29 one-timeOne app, unlimited rescans, forever
Unlimited$49/yearEvery app you ship
Agency$149/yearClient apps, --json output for pipelines

The scan runs inside your own Claude Code session, which means it costs us nothing per scan. Tools that meter scans do so because each one costs them money. Unlimited rescans here is a consequence of where the code runs, not a promotion — and it matters, because fixing a rejection is an iterative loop and a metered checker punishes exactly the behaviour you want.

What it will not do

It cannot predict judgement. Guideline 4.2 minimum functionality is a human deciding whether your app does enough to exist. 4.3 spam is a human deciding whether it looks like forty others. 3.1.2 subscription disclosure has objective parts and subjective ones. 1.4.1 medical scrutiny is a human reading your claims.

Any tool implying it can guarantee approval is selling certainty that does not exist. The honest claim is narrower: it removes the class of rejection where the message names a guideline and you burn two build cycles finding the file.

Already rejected?

/shipcheck:reply drafts a Resolution Center reply against the clause you were actually cited under — naming what changed, where, and why it now complies. A silent resubmission gives the reviewer no reason to look at it differently; a specific reply attached to the submission does.

Built by an indie developer who got rejected enough times to automate it. shipcheck is made by Baker Ventures LLC. Every claim on this site links to Apple's or Google's own documentation so you can check it yourself.

Questions and answers

What is shipcheck?

shipcheck is a Claude Code plugin that scans a React Native or Expo project for App Store and Google Play rejection risk before you submit. It cites the exact guideline clause behind every finding, predicts the wording App Review is likely to use, and names the file to change.

How do I install shipcheck?

Three commands in Claude Code - /plugin marketplace add, then /plugin install shipcheck, then /shipcheck:scan. No account, no signup, no browser tab.

Does shipcheck upload my code anywhere?

No. It runs inside the Claude Code session already open on your machine and reads local files. There is no repository grant, no upload and no account. Competing web tools generally require one or more of those.

How much does shipcheck cost?

The first scan is free and shows real findings rather than a blurred teaser. After that it is 29 dollars one-time for a single app with unlimited rescans, 49 dollars a year for unlimited apps, or 149 dollars a year for the agency tier.

Why are there unlimited rescans?

Because the scan runs inside your own Claude Code session, so it costs us nothing per scan. Tools that meter scans do so because each one costs them money. Unlimited rescans is a consequence of the architecture rather than a promotional offer.

What does shipcheck not do?

It cannot predict judgement calls - whether your app has enough functionality under Guideline 4.2, whether it reads as spam under 4.3, or whether a reviewer will accept your subscription disclosure. It catches the deterministic configuration rejections where the message names a guideline but not a file.

Cite this pageshipcheck. “Catch the rejection before you submit it.” Baker Ventures LLC, September 6, 2026. https://shipcheck.bakerventuresstudio.com/