From capacitor-deployment
Guides publishing Capacitor apps to Apple App Store and Google Play Store with checklists, configurations, screenshots, metadata, and submission steps.
How this skill is triggered — by the user, by Claude, or both
Slash command
/capacitor-deployment:capacitor-app-storeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Guide to submitting Capacitor apps to Apple App Store and Google Play Store.
Guide to submitting Capacitor apps to Apple App Store and Google Play Store.
// capacitor.config.ts - Not stored here, just for reference
// iOS: Info.plist
// CFBundleShortVersionString = "1.2.3" (user-visible)
// CFBundleVersion = "45" (build number, increment each upload)
// Android: build.gradle
// versionName = "1.2.3" (user-visible)
// versionCode = 45 (must increment each upload)
<!-- ios/App/App/Info.plist -->
<key>CFBundleDisplayName</key>
<string>My App</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<!-- Privacy descriptions - REQUIRED for permissions -->
<key>NSCameraUsageDescription</key>
<string>Take photos for your profile</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Select photos from your library</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Find nearby locations</string>
<key>NSFaceIDUsageDescription</key>
<string>Secure login with Face ID</string>
<key>NSMicrophoneUsageDescription</key>
<string>Record voice messages</string>
<!-- App Tracking Transparency -->
<key>NSUserTrackingUsageDescription</key>
<string>Allow tracking for personalized ads</string>
<!-- Export compliance -->
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
// android/app/build.gradle
android {
defaultConfig {
applicationId "com.yourcompany.yourapp"
minSdkVersion 22
targetSdkVersion 34
versionCode 1
versionName "1.0.0"
// 64-bit support
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
Required sizes (place in Assets.xcassets):
| Size | Scale | Usage |
|---|---|---|
| 20pt | 2x, 3x | Notification |
| 29pt | 2x, 3x | Settings |
| 40pt | 2x, 3x | Spotlight |
| 60pt | 2x, 3x | App Icon |
| 76pt | 1x, 2x | iPad |
| 83.5pt | 2x | iPad Pro |
| 1024pt | 1x | App Store |
Required sizes (place in res/mipmap-*):
| Density | Size | Folder |
|---|---|---|
| mdpi | 48x48 | mipmap-mdpi |
| hdpi | 72x72 | mipmap-hdpi |
| xhdpi | 96x96 | mipmap-xhdpi |
| xxhdpi | 144x144 | mipmap-xxhdpi |
| xxxhdpi | 192x192 | mipmap-xxxhdpi |
Also needed:
# Use capacitor-assets
npm install -D @capacitor/assets
npx capacitor-assets generate --iconBackgroundColor '#ffffff'
| Device | Size | Required |
|---|---|---|
| iPhone 6.7" | 1290x2796 | Yes |
| iPhone 6.5" | 1284x2778 | Yes |
| iPhone 5.5" | 1242x2208 | Yes |
| iPad Pro 12.9" | 2048x2732 | If supporting iPad |
| iPad Pro 11" | 1668x2388 | If supporting iPad |
| Type | Size | Required |
|---|---|---|
| Phone | 1080x1920 to 1080x2400 | Yes (2-8) |
| 7" Tablet | 1200x1920 | If supporting |
| 10" Tablet | 1600x2560 | If supporting |
// Use Playwright for automated screenshots
import { test } from '@playwright/test';
const devices = [
{ name: 'iPhone 14 Pro Max', viewport: { width: 430, height: 932 } },
{ name: 'iPhone 14', viewport: { width: 390, height: 844 } },
{ name: 'Pixel 7', viewport: { width: 412, height: 915 } },
];
test('generate screenshots', async ({ page }) => {
for (const device of devices) {
await page.setViewportSize(device.viewport);
// Screenshot 1: Home
await page.goto('/');
await page.screenshot({
path: `screenshots/${device.name}-home.png`,
fullPage: false,
});
// Screenshot 2: Feature
await page.goto('/feature');
await page.screenshot({
path: `screenshots/${device.name}-feature.png`,
});
}
});
# Using Xcode
# Product > Archive > Distribute App > App Store Connect
# Using Fastlane
fastlane ios release
# Using xcrun
xcrun altool --upload-app --type ios --file App.ipa \
--apiKey KEY_ID --apiIssuer ISSUER_ID
Complete the questionnaire for IARC rating
# Build AAB (required for new apps)
cd android && ./gradlew bundleRelease
# Upload via Play Console or API
# Production > Create new release > Upload AAB
| Track | Purpose |
|---|---|
| Internal testing | Up to 100 testers, instant |
| Closed testing | Invite-only, review |
| Open testing | Public beta |
| Production | Full release |
| Reason | Solution |
|---|---|
| Crashes | Test on real devices, fix bugs |
| Broken links | Verify all URLs work |
| Incomplete metadata | Fill all required fields |
| Missing privacy info | Complete App Privacy section |
| Login issues | Provide demo account |
| Guideline 4.2 (Minimum Functionality) | Add meaningful features |
| Guideline 5.1.1 (Data Collection) | Justify data usage |
| Reason | Solution |
|---|---|
| Crashes/ANRs | Fix stability issues |
| Policy violation | Review Play policies |
| Deceptive behavior | Be transparent about features |
| Sensitive permissions | Justify in-app |
| Target SDK too low | Update to API 34+ |
# Increment patch (1.0.0 -> 1.0.1)
npm version patch
# Increment minor (1.0.0 -> 1.1.0)
npm version minor
# Increment major (1.0.0 -> 2.0.0)
npm version major
iOS:
Android:
npx claudepluginhub cap-go/capgo-skills --plugin capacitor-deploymentProvides CI/CD workflows for Capacitor apps using GitHub Actions and GitLab CI, covering builds, tests, app signing, security scans, and iOS deployment.
Sets up Capgo-centered release workflows for Capacitor apps covering OTA live updates, native builds, and app store publishing via repository CI/CD.
Migrates web apps, PWAs, SPAs to store-ready Capacitor iOS/Android apps. Addresses thin WebView rejections, native UX, permissions, offline support, billing, testing, Capgo updates.