capacitor-apple-review-preflight — Claude Code skill
Runs a Capacitor iOS project through Apple App Review rules and returns a prioritized report, either before you submit or after a rejection lands.
npx skills add Cap-go/capgo-skills --skill capacitor-apple-review-preflight -a claude-codeWhat capacitor-apple-review-preflight does
The skill walks a project against Apple's guideline corpus and comes back with findings ordered by severity, each tied to a rule and to the file that triggered it. Paste a rejection email and it starts from the cited guideline, then widens to neighbouring risks.
It reads package.json for auth, analytics, payments and AI SDKs, the Capacitor config for server.url and live-update settings, Info.plist for NS...UsageDescription strings and UIApplicationSceneManifest, plus *.entitlements and PrivacyInfo.xcprivacy. Checklists switch on by app kind: subscriptions, UGC, games, health, AI features, crypto. The usual Capacitor failure modes get flagged too — a WebView with nothing native to offer under 4.2, social login missing Sign in with Apple under 4.8, web checkout for digital goods inside the iOS build under 3.1.1.
Xcode 27 and UIScene readiness is part of the pass. It looks for SceneDelegate.swift and configurationForConnecting in AppDelegate, since the old lifecycle callbacks go quiet once the scene takes over. Google Play policy, upload mechanics and screenshots are out of scope here.
What it helps with
- turn a rejection email into a list of what actually broke
- validate
PrivacyInfo.xcprivacyand SDK manifests before upload - catch
Info.plistpermission strings that explain nothing - weigh live-update and remote
server.urlrisk in a release build - get the project ready for the UIScene requirement in Xcode 27
Example prompts for the agent
- Audit my Capacitor app before I submit to the App Store, start with privacy
- Here is a Guideline 4.8 rejection — tell me what to fix and check nearby risks
- Draft reviewer notes for the submission: demo account and how live updates work
How to install capacitor-apple-review-preflight
1Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-apple-review-preflight -a claude-code2Manually: put the files in place
~/.claude/skills/capacitor-apple-review-preflight/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/capacitor-apple-review-preflight/
1Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-apple-review-preflight -a codex2Manually: put the files in place
.agents/skills/capacitor-apple-review-preflight/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-apple-review-preflight -a cursor2Manually: put the files in place
.cursor/skills/capacitor-apple-review-preflight/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Cap-go/capgo-skills capacitor-apple-review-preflight2Manually: put the files in place
.github/skills/capacitor-apple-review-preflight/SKILL.md1Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-apple-review-preflight -a gemini-cli2Platform CLI
gemini skills install https://github.com/Cap-go/capgo-skills --path skills/capacitor-apple-review-preflightManually: put the files in place
.devin/skills/capacitor-apple-review-preflight/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-apple-review-preflight -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about capacitor-apple-review-preflight
How do I install capacitor-apple-review-preflight in Claude Code?
Run npx skills add Cap-go/capgo-skills --skill capacitor-apple-review-preflight -a claude-code. The skill file lands at ~/.claude/skills/capacitor-apple-review-preflight/SKILL.md.
What does capacitor-apple-review-preflight do?
It audits a Capacitor iOS app against App Review rules: metadata, the privacy manifest, Info.plist usage strings, entitlements, subscriptions, AI features and UIScene readiness. You get a severity-ordered report mapped to guidelines and files.
Does it cover Google Play as well?
No. It handles the Apple side only: rejections, App Store Connect upload warnings and guidelines. Google Play policy and Data safety belong to capacitor-app-store, another unit in the same collection.
Source text
SKILL.md · MIT
---
name: capacitor-apple-review-preflight
description: Audits a Capacitor iOS app against Apple App Review Guidelines before submission or after a rejection. Use when the user pastes a rejection (Guideline 4.2 Minimum Functionality, 4.8 Login Services / Sign in with Apple, 5.1.1 data collection or account deletion, 5.1.2(i) sharing data with third-party AI, 3.1.1 in-app purchase, 2.1 app completeness, 2.3 metadata, 4.3 spam), an upload warning (ITMS-91053 missing API declaration, ITMS-91061 missing privacy manifest, ITMS-90683 missing purpose string), or wants a preflight of metadata, PrivacyInfo.xcprivacy, Info.plist usage strings, entitlements, subscriptions, reviewer notes, live-update disclosure, and Xcode 27 / UIScene readiness. Do not use for Google Play review, upload mechanics, screenshots and listing setup (capacitor-app-store), building a web wrapper from scratch (webapp-to-capacitor), or non-Capacitor runtimes.
allowed-tools:
- Bash(node -e *)
- Bash(find *)
---
# Capacitor Apple Review Preflight
Run a pre-submission or post-rejection Apple review audit for a Capacitor app and return a prioritized, evidence-backed report.
This skill adapts the Apple guideline and rejection-rule corpus from [truongduy2611/app-store-preflight-skills](https://github.com/truongduy2611/app-store-preflight-skills) and narrows the workflow to Capacitor-specific project inspection.
## When to Use
TRIGGER when:
- The user wants an App Store review preflight for a Capacitor app.
- The user received an App Review rejection or an App Store Connect upload warning email and wants the project audited.
- The user asks whether metadata, entitlements, privacy manifests, Sign in with Apple, subscriptions, AI features, or minimum functionality will pass.
- The user wants reviewer notes for a Capacitor submission (demo accounts, live updates, hardware features).
Do not use for:
- Google Play policy or Data safety -> `capacitor-app-store` (Android reference).
- Archiving, uploading, screenshots, TestFlight -> `capacitor-app-store`.
- Making a website feel native from scratch -> `webapp-to-capacitor`.
- Security hardening beyond review rules -> `capacitor-security`.
## Live Project Snapshot
Detected Capacitor, auth, subscription, analytics, and privacy-related packages:
!`node -e "const fs=require('fs');if(!fs.existsSync('package.json'))process.exit(0);const pkg=JSON.parse(fs.readFileSync('package.json','utf8'));const sections=['dependencies','devDependencies'];const out=[];for(const section of sections){for(const [name,version] of Object.entries(pkg[section]||{})){if(name.startsWith('@capacitor/')||name.startsWith('@capgo/')||name.includes('firebase')||name.includes('sentry')||name.includes('revenuecat')||name.includes('purchase')||name.includes('subscription')||name.includes('auth')||name.includes('analytics')||name.includes('segment')||name.includes('amplitude')||name.includes('mixpanel')||name.includes('openai')||name.includes('anthropic')||name.includes('gemini'))out.push(section+'.'+name+'='+version)}}console.log(out.sort().join('\n'))"`
Relevant Apple review file paths:
!`find . -maxdepth 6 -not -path '*/node_modules/*' \( -name 'package.json' -o -name 'capacitor.config.json' -o -name 'capacitor.config.ts' -o -name 'capacitor.config.js' -o -name 'Info.plist' -o -name '*.entitlements' -o -name 'PrivacyInfo.xcprivacy' -o -name 'SceneDelegate.swift' -o -name 'project.pbxproj' -o -path './ios' -o -path './fastlane/metadata' -o -path './metadata' \)`
## Current Apple Requirements (October 2026)
Check these first; they cause upload failures before review even starts:
- SDK: uploads must be built with Xcode 26+ / iOS 26 SDK (since April 28, 2026). From April 2027 the iOS 27 SDK (Xcode 27) is required.
- UIScene: Xcode 27 builds require the scene lifecycle. Capacitor 8.5+ supports it; the app needs `SceneDelegate.swift`, `UIApplicationSceneManifest` in `Info.plist`, and `configurationForConnecting` in `AppDelegate`. After adoption, AppDelegate `application(_:open:options:)`, `continue userActivity`, and foreground/background callbacks stop firing; custom native code there must move to the scene delegate.
- Privacy manifest: the app target needs its own `PrivacyInfo.xcprivacy` for required-reason APIs used by app code; SDKs on Apple's privacy-impacting list must ship their own manifests and signatures (Capacitor core and CapacitorCordova ship manifests).
- Age rating: the updated questionnaire (4+, 9+, 13+, 16+, 18+) must be answered or new versions cannot be submitted.
- AI data sharing: guideline 5.1.2(i) (Nov 2025 revision) requires clear in-app disclosure and explicit permission before personal data is sent to third-party AI services.
## Procedure
### Step 1: Confirm scope
Apple-facing review work only. If the task is mostly release mechanics, hand off to `capacitor-app-store`. If a rejection is cited, prioritize that guideline first, then expand to adjacent risks.
### Step 2: Identify app type and load checklists
Always read `references/guidelines/by-app-type/all_apps.md`. Then add the checklists that match:
| App has | Load |
|---|---|
| Subscriptions or IAP | `subscription_iap.md` |
| UGC, chat, social feeds | `social_ugc.md` |
| Kids Category | `kids.md` |
| Health, fitness, medical claims | `health_fitness.md` |
| Games | `games.md` |
| AI / LLM features | `ai_apps.md` |
| Crypto, trading, finance | `crypto_finance.md` |
| VPN / networking | `vpn.md` |
| Also ships to macOS | `macos.md` |
Use `references/guidelines/README.md` for the full guideline index when a rejection cites a specific section.
### Step 3: Inspect the Capacitor and iOS project
Start from the snapshot, then read:
- `package.json` for auth, analytics, ads, payments, AI SDKs.
- `capacitor.config.*` for `appId`, `server.url` (a remote `server.url` in a release build is a 4.2 / 2.5.2 risk), live-update config.
- `ios/App/App/Info.plist`: every `NS...UsageDescription` a plugin can trigger, `ITSAppUsesNonExemptEncryption`, `UIApplicationSceneManifest`, `UIBackgroundModes`.
- `*.entitlements` vs features actually shipped.
- `PrivacyInfo.xcprivacy` (app target membership, required-reason APIs, tracking domains).
- `fastlane/metadata` or `metadata/` if present.
Capacitor-specific risks:
- WebView-only experience with no native value or mobile UX -> 4.2.
- Remote `server.url` loading a website -> 4.2 and 2.5.2.
- Social login without Sign in with Apple or an equivalent private option -> 4.8.
- Web checkout for digital goods visible in the iOS build -> 3.1.1.
- Live updates used to change app purpose or add features beyond what was reviewed -> guideline 2.5.2 and the Apple Developer Program License Agreement interpreted-code terms; disclose the mechanism and keep updates to web-asset fixes.
- Plugin permissions present in `Info.plist` with vague or copied strings -> 5.1.1.
- Capabilities enabled in Xcode but unused (Push, iCloud, HealthKit, Associated Domains).
### Step 4: Run rule-based passes
Rule files are the source of truth:
- metadata: `references/rules/metadata/*.md`
- subscription: `references/rules/subscription/*.md`
- privacy: `references/rules/privacy/*.md`
- design: `references/rules/design/*.md`
- entitlements: `references/rules/entitlements/*.md`
- build: `references/rules/build/sdk_and_scene_lifecycle.md` (Xcode/SDK minimums, UIScene)
Map metadata rules to App Store text, screenshots, previews, and review notes; privacy rules to `Info.plist`, manifests, SDKs, and data flows; design rules to navigation, native value, and login; entitlement rules to enabled capabilities.
If metadata is not local and the `asc` CLI is configured, pull it with `asc metadata pull --output-dir ./metadata`. Otherwise audit local sources and mark metadata checks partial.
### Step 5: Report
```markdown
## Apple Review Preflight
### Rejections Found
- [GUIDELINE X.X.X] Issue summary
- Evidence: file:line or metadata field
- Why it matters for this Capacitor app
- Fix: exact remediation
### Warnings
- [GUIDELINE X.X.X] Potential issue
### Passed
- [Category] Checks that looked clean
### Missing Inputs
- Metadata or assets not available locally
```
Order by severity. Report before making invasive changes (removing features, changing auth or billing); ask the user at those decision points.
### Step 6: Reviewer notes and follow-ups
Draft notes for: demo account, hidden or hardware-dependent features, subscription test path, AI moderation and data-sharing consent, live-update behaviour (web assets only; no native changes), and reasons for special entitlements or background modes.
## Verification
- Every rejection finding has a concrete fix applied or an explicit owner/decision.
- `plutil -lint ios/App/App/Info.plist ios/App/App/PrivacyInfo.xcprivacy` passes.
- `PrivacyInfo.xcprivacy` is a member of the App target (check `project.pbxproj` contains it in the Resources build phase).
- `grep -c "UsageDescription" ios/App/App/Info.plist` matches the permissions your plugins can request.
- Release build archives and validates in Xcode Organizer with no ITMS warnings.
- Demo account logs in on a clean install against production backend.
## Error Handling
| Input | Action |
|---|---|
| ITMS-91053 "Missing API declaration" with a category name | Add that `NSPrivacyAccessedAPIType` + approved reason to the app manifest (`references/rules/privacy/privacy_manifest.md`) |
| ITMS-91061 "Missing privacy manifest" naming an SDK | Update the SDK/plugin to a version with a bundled manifest; do not paste SDK practices into the app manifest |
| ITMS-90683 "Missing purpose string" | Add the named key with a specific purpose string |
| Guideline 4.2 rejection on a wrapper app | Treat as top severity; list concrete native features and UX gaps; never answer with reviewer notes alone |
| Guideline 4.8 | Add Sign in with Apple (`@capgo/capacitor-social-login` supports `apple`) or an equivalent option meeting 4.8 criteria |
| Guideline 5.1.1(v) | Add in-app account deletion (not just a support email) |
| Metadata unavailable and `asc` missing | Continue with code audit; mark metadata checks partial |
| Third-party SDKs suggest required-reason APIs | Inspect each SDK's bundled manifest before assuming compliance |
© Cap-go · MIT · Cap-go/capgo-skills