
capacitor-apple-review-preflight
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.
- Installs
- 897
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/cap-go/capgo-skills --skill capacitor-apple-review-preflight- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads capacitor-apple-review-preflight automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
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 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,UIApplicationSceneManifestinInfo.plist, andconfigurationForConnectinginAppDelegate. After adoption, AppDelegateapplication(_: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.xcprivacyfor 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.jsonfor auth, analytics, ads, payments, AI SDKs.capacitor.config.*forappId,server.url(a remoteserver.urlin a release build is a 4.2 / 2.5.2 risk), live-update config.ios/App/App/Info.plist: everyNS...UsageDescriptiona plugin can trigger,ITSAppUsesNonExemptEncryption,UIApplicationSceneManifest,UIBackgroundModes.*.entitlementsvs features actually shipped.PrivacyInfo.xcprivacy(app target membership, required-reason APIs, tracking domains).fastlane/metadataormetadata/if present.
Capacitor-specific risks:
- WebView-only experience with no native value or mobile UX -> 4.2.
- Remote
server.urlloading 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.plistwith 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
## 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.xcprivacypasses.PrivacyInfo.xcprivacyis a member of the App target (checkproject.pbxprojcontains it in the Resources build phase).grep -c "UsageDescription" ios/App/App/Info.plistmatches 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 |
FAQ
What does the capacitor-apple-review-preflight skill do?
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.
How do I install capacitor-apple-review-preflight?
Run npx skills add https://github.com/cap-go/capgo-skills --skill capacitor-apple-review-preflight in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/capacitor-apple-review-preflight/ (personal) or .claude/skills/capacitor-apple-review-preflight/ (project).
Which AI agents can use capacitor-apple-review-preflight?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is capacitor-apple-review-preflight safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains capacitor-apple-review-preflight?
It is published by cap-go in cap-go/capgo-skills. It has 897 recorded installs.
More from cap-go/capgo-skills
capacitor-best-practices
cap-go/capgo-skills
Review and set up Capacitor apps against current best practices (Capacitor 8.5 stable, 9 alpha via @next). Use for a Capacitor codebase review, capacitor.config.ts audit, new project setup, aligning @capacitor/core/cli/ios/android and plugin majors, plugin patterns (availability checks, checkPermissions/requestPermissions, error code handling, web fallbacks), or release prep; or on " " plugin is not implemented on ios, Could not find the web assets directory, platform has not been added yet, a dev server.url shipped to production, lost edits in android/app/src/main/assets/public, SPM vs CocoaPods, or AppDelegate/UIScene drift. Do not use for security audits (capacitor-security), performance (capacitor-performance), tests (capacitor-testing), crashes (debugging-capacitor), major upgrades (capacitor-app-upgrades), SPM migration (cocoapods-to-spm), UIScene adoption (capacitor-uiscene-migration), or live updates (capgo-live-updates).
ionic-design
cap-go/capgo-skills
Builds and reviews Ionic Framework UI in Capacitor apps (Ionic 9 current, Ionic 8 still common) - page structure (ion-header/ion-content/ion-footer), lists, modern form syntax (label/labelPlacement on ion-input/ion-select), sheet modals, tabs + ion-router-outlet, CSS variable theming, dark palettes (palettes/dark.system.css, .ion-palette-dark), iOS vs MD mode, and Ionic 8 - 9 breaking changes (React Router 6, Vue Router 5, Angular 18-22 zoneless, removed ion-picker-legacy, boolean autocorrect, npx @ionic/migrate). Use when writing Ionic components, theming an Ionic app, fixing platform-mode styling, or upgrading @ionic/react, @ionic/vue, @ionic/angular. Do not use for Konsta UI (konsta-ui), Tailwind setup (tailwind-capacitor), raw safe-area CSS (safe-area-handling), keyboard resize (capacitor-keyboard), or Ionic Appflow/Enterprise migrations (ionic-appflow-migration, ionic-enterprise-sdk-migration).
capacitor-plugins
cap-go/capgo-skills
Pick, install, and wire up Capacitor plugins for native features (camera, filesystem, geolocation, biometrics, in-app purchases, social login, SQLite, calendar, contacts, health, BLE, NFC, etc.). Covers official @capacitor/ packages (Capacitor 8.5 stable, 9 alpha on next) plus the 145-package @capgo/ index, native permission keys (Info.plist, AndroidManifest, variables.gradle minSdk), npx cap sync / cap ls verification, and errors like '"Camera" plugin is not implemented on ios', 'unable to find plugin', UNIMPLEMENTED, and OS-PLUG- codes. Use for "which plugin should I use for X", adding a plugin, or a plugin call failing after install. Do not use for push setup (capacitor-push-notifications), splash assets (capacitor-splash-screen), keyboard layout (capacitor-keyboard), deep links (capacitor-deep-linking), OTA updates (capgo-live-updates), upgrading plugin source code (capacitor-plugin-upgrades), or adding SPM to a plugin (capacitor-plugin-spm-support).
debugging-capacitor
cap-go/capgo-skills
Diagnoses and fixes runtime bugs in Capacitor iOS/Android apps - white/blank screen on launch, startup crashes, "X" plugin is not implemented on ios/android, net::ERRCLEARTEXTNOTPERMITTED, App Transport Security blocks, CORS on capacitor://localhost, permission denials, live reload not connecting, and Capacitor 8.5+ UIScene regressions (appUrlOpen, universal links, pause/resume silent because AppDelegate callbacks stopped). Covers Safari Web Inspector, chrome://inspect, Xcode/LLDB, Android Studio, npx cap run --url (Capacitor 9) vs -l --host (8), xcrun simctl openurlprivacypush, xcrun devicectl device process launchopenURL, xctrace. Do not use for only reading device logs (ios-android-logs), the UIScene migration itself (capacitor-uiscene-migration), deep-link setup (capacitor-deep-linking), speed (capacitor-performance), crash SDKs (capacitor-native-observability), tests (capacitor-testing), or upgrades/build errors (capacitor-app-upgrades, cocoapods-to-spm).
capacitor-testing
cap-go/capgo-skills
Testing guide for Capacitor apps and plugins. Covers web-layer unit and component tests with Vitest and mocked Capacitor plugins (vi.mock('@capacitor/core'), registerPlugin), Playwright for the web build, Appium E2E with NATIVEAPP / WEBVIEW context switching, native plugin unit tests with Swift Testing vs XCTest (what can migrate, CAPPluginCall patterns, xcodebuild test on a simulator) and Android JUnit, plus an agent-driven verification loop on simulators and devices (build, install, launch, screenshot, UI hierarchy, tap, logs) with xcrun simctl, xcrun devicectl, adb, Xcode MCP device tools, and live reload via npx cap run --url (Capacitor 9) or -l --host --port (Capacitor 8). Use when adding tests, mocking plugins, "does it work on device", verifying a UI change on a simulator, migrating XCTest to Swift Testing, or setting up test CI. Do not use for crash log capture (ios-android-logs), WebView debugging sessions (debugging-capacitor), or build pipelines (capacitor
safe-area-handling
cap-go/capgo-skills
Fixes notch, Dynamic Island, home indicator, display cutout, and system bar overlap in Capacitor apps. Covers viewport-fit=cover + env(safe-area-inset-), the Capacitor 8 SystemBars core plugin (insetsHandling, injected --safe-area-inset- CSS variables for Android WebView < 140, removal of android.adjustMarginsForEdgeToEdge), Android 15/16 enforced edge-to-edge (overlaysWebView and backgroundColor of @capacitor/status-bar no longer work at targetSdk 36), iOS contentInset, and insets that change at runtime on rotation, iPad/foldable resizable windows. Use when headers sit under the status bar, tab bars hide behind the gesture bar, env() returns 0 on Android, or layout broke after upgrading to Capacitor 8 / targetSdk 35+. Do not use for keyboard overlap (capacitor-keyboard), Ionic/Konsta component theming (ionic-design, konsta-ui), Tailwind utility setup (tailwind-capacitor), or iOS multi-window/resizability adoption (capacitor-ios-resizability).
Popular code quality & workflow skills
grill-me
mattpocock/skills
A relentless interview to sharpen a plan or design.
improve-codebase-architecture
mattpocock/skills
Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.
handoff
mattpocock/skills
Compact the current conversation into a handoff document for another agent to pick up.
domain-modeling
mattpocock/skills
Build and sharpen a project's domain model. Use when discussing codebase terminology, writing or editing a GLOSSARY.md, or recording or editing an ADR.
codebase-design
mattpocock/skills
Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
diagnosing-bugs
mattpocock/skills
Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.