L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

mobile-capacitor-platform

mobile-capacitor-platform

Capacitor native layer: system bars, keyboard, back, plugins, push, deep links, OTA, native CI. Use for "keyboard covers the input", "status bar overlaps", "add push", or "OTA update".

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: mobile-capacitor-platform description: > Capacitor native layer: system bars, keyboard, back, plugins, push, deep links, OTA, native CI. Use for "keyboard covers the input", "status bar overlaps", "add push", or "OTA update". license: MIT paths:

  • "/ios/"
  • "/android/"
  • "**/app.json"
  • "**/app.config.*"
  • "**/capacitor.config.*"
  • "**/*.gradle"
  • "**/Podfile"

Capacitor Platform & Pipeline

Degree of freedom: MIXED. Which area to tackle [HIGH freedom]; Capacitor major matching, cap sync, secrets, and store preflight [LOW freedom — run exactly].

The native-runtime and shipping layer for Capacitor apps. This skill owns the shell plumbing every other mobile skill points to: system bars and insets, keyboard, splash, Android back, haptics defaults.

This skill vs neighbors

SkillOwns
mobile-capacitor-platform (this)Native config and plugins: system bars, keyboard, splash, back, push, deep links, OTA, CI, migrations
enhance-capacitor-uiOne codebase on web + iOS + Android: form factor vs platform vs pointer
enhance-mobile-native-feelApp-wide native-feel pass: chrome, IA, lists, motion, haptic meaning
plan-capacitor-hardeningNative-layer security plan (plan-only)
plan-mobile-readinessStore submission audit (plan-only)

Distilled from cap-go/capgo-skills (MIT). For deep per-task playbooks, install the full pack: npx skills add Cap-go/capgo-skills or claude plugin marketplace add Cap-go/capgo-skills.

How to reason

  1. Version — @capacitor/core major; plugin majors must match
  2. Choose — plugin, deep link, push, offline, OTA, CI, or store
  3. Wire — entitlements, config, and native files for that capability
  4. Prove — both platforms or CI iOS; secrets never in the JS bundle

Worked example

Version: Capacitor 8 in package.json; @capacitor/push-notifications is still v5. Choose: push — FCM + APNs, not an OTA problem. Wire: bump plugin to v8, npx cap sync, APNs entitlement, google-services.json. Prove: emulator tap opens the deep-linked screen; no keystore in git.

Self-critique before reporting

  • Majors match — every plugin major equals the Capacitor major
  • Native config present — entitlements / usage strings / plist-or-json for the capability
  • Secrets out of band — CI/Keychain only; never committed or bundled
  • Plumbing proved — each shell row touched has its probe result (screenshot or command output), iOS marked not run when no Mac was available
  • Right owner — form-factor layout → enhance-capacitor-ui; native-feel design → enhance-mobile-native-feel; listing ASO → plan-aso; native-security plan-only → plan-capacitor-hardening

Version discipline (do this first) [LOW freedom — run exactly]

  • Read package.json: the Capacitor major (@capacitor/core) drives everything. Match plugin majors to it (Capacitor 8 → plugin v8).
  • Check capacitor.config.ts for appId, webDir, server.url (live-reload vs bundled), and plugin config.
  • Confirm the target platforms present (ios/, android/) before suggesting platform-specific steps.
grep -E '"@capacitor/[a-z-]+"' package.json                       # every major equal?
grep -nE 'targetSdkVersion|compileSdkVersion|minSdkVersion' android/variables.gradle
grep -n "IPHONEOS_DEPLOYMENT_TARGET" ios/App/App.xcodeproj/project.pbxproj | head -2

Capacitor 8 floor (capacitorjs.com/docs/updating/8-0): Node 22+, Xcode 26+, iOS 15 deployment target, minSdkVersion 24, compileSdkVersion/targetSdkVersion 36. Google Play has required targetSdkVersion 36 for new apps and updates since 2026-08-31; Apple has required the iOS 26 SDK (Xcode 26) for uploads since 2026-04-28. Stay on the latest 8.x: SystemBars inset fixes landed through 8.5.2. Capacitor 7 or older → run npx cap migrate before any UI work below.

Pick the right area [HIGH freedom]

TaskApproach
Choose a pluginPrefer official @capacitor/*; for gaps check Capgo's 80+ plugin catalog. Verify the plugin major matches your Capacitor major and has active maintenance.
Deep / universal linksiOS Associated Domains + apple-app-site-association; Android intent filters + assetlinks.json. Handle cold-start vs warm via appUrlOpen listener. Test both install states.
Push notifications@capacitor/push-notifications → FCM (Android) + APNs (iOS). Register token, handle foreground vs background, deep-link from tap. Verify entitlements + GoogleService-Info.plist / google-services.json.
Offline-firstCache + queue writes; reconcile on reconnect. Use a real DB plugin (SQLite / Fast SQL), not localStorage, for structured data. Define the conflict-resolution rule explicitly.
System bars, keyboard, splash, back, hapticsSee Native shell plumbing below — each has a probe and a done line.

Native shell plumbing [LOW freedom — run exactly]

Each row: what to set, how to prove it on a device, what "done" means. Run the probes on an Android 16 emulator (mobile-emulator-test) and an iOS 26+ simulator; on a host without macOS, report iOS as not run.

AreaSetProbeDone
Edge-to-edgeviewport-fit=cover in the viewport meta; core SystemBars (import { SystemBars, SystemBarsStyle } from '@capacitor/core'), plugins.SystemBars.insetsHandling left at 'css'; pad chrome with var(--safe-area-inset-top, env(safe-area-inset-top, 0px)) (and bottom/left/right)Screenshot a scrolled list on Android 16 (gesture nav and 3-button) and on a Dynamic Island iPhoneContent scrolls under both bars; header and tab bar clear the status bar, cutout and home indicator; no white or black band
Bar styleSystemBars.setStyle({ style: SystemBarsStyle.Dark }) for a dark UI (light icons), .Light for a light UI; switch with the app theme. iOS needs UIViewControllerBasedStatusBarAppearance = YES in Info.plistToggle the app theme on both platformsBar icons stay legible in both themes
Dead bar configDelete StatusBar.setBackgroundColor, setOverlaysWebView, and the overlaysWebView / backgroundColor config: they have no effect on Android 15+ with targetSdkVersion 36. android.adjustMarginsForEdgeToEdge was removed in Capacitor 8rg -n -e "StatusBar\.setBackgroundColor" -e setOverlaysWebView -e overlaysWebView -e adjustMarginsForEdgeToEdge -g "!node_modules" -g "!android" -g "!ios" .Zero hits, and plugins.StatusBar in capacitor.config.* has no backgroundColor; bar color comes from an element painted under the bar
KeyboardiOS: plugins.Keyboard.resize (native resizes the whole WebView and changes vh; body resizes <body> only; ionic; none). Android: the WebView resizes the visual viewport (WebView 139+); resizeOnFullScreen: true only for a full-screen appFocus the lowest input on the longest form, on both platforms, with a hardware-keyboard-off emulatorFocused input and its submit button stay visible above the keyboard; nothing jumps when it closes
SplashlaunchAutoHide: false, then SplashScreen.hide() after the first meaningful paint. Android 12+ ignores backgroundColor, showSpinner, splashFullScreen, splashImmersive at launch; use launchFadeOutDurationCold-start 3 times (adb shell am force-stop <appId> then launch)No white flash between splash and first screen
Android backApp.addListener('backButton', ({ canGoBack }) => canGoBack ? history.back() : App.minimizeApp()); close an open sheet or dialog first. A listener replaces the default handlingadb shell input keyevent KEYCODE_BACK on a nested route, with a sheet open, and on the root route. Then, with gesture navigation on, swipe slowly from the left edge at the root (adb shell input swipe 5 1200 600 1200 800; read the screen size with adb shell wm size)Nested → previous route; sheet → closes; root → app backgrounds. A key event never shows the back preview, only the gesture does: record whether the back-to-home preview appears. An app-registered back callback suppresses it on Android 16, so note it, do not guess
Haptics defaults@capacitor/haptics impact() defaults to ImpactStyle.Heavy; always pass style. Only Light / Medium / Heavy exist (no Rigid/Soft)rg -n "Haptics\.impact\(\s*\)" srcZero hits; meanings follow enhance-mobile-native-feel
Large screensAndroid 16 ignores orientation and resizability locks on displays ≥ 600dp for apps targeting 36; @capacitor/screen-orientation lock() has no effect thereRun the tablet or unfolded-foldable AVD in landscapeLayout reflows; nothing is a stretched portrait phone (audit-responsive)

Shipping pipeline [LOW freedom — run exactly]

Live / OTA updates (the Capacitor superpower)

  • Push JS/HTML/CSS instantly without store review (Capgo or equivalent). Native code changes still require a store build.
  • Gate updates by channel (production / beta), run compatibility checks, and keep a rollback path. Never OTA a bundle that assumes a newer native plugin than the installed binary.

Native build CI/CD

  • GitHub Actions / GitLab CI / Fastlane for signed iOS + Android artifacts. iOS signing needs certs + provisioning profiles in CI secrets (never commit *.keystore, *.p12, local.properties).
  • Standard chain: npm ci → web build → npx cap sync → native build (xcodebuild / Gradle) → sign → upload (TestFlight / Play internal track).
  • For Linux/Windows devs: iOS builds run on macOS CI runners, not locally — declare "ready for CI", never "iOS verified" locally.

Store submission

  • Apple preflight before every submit: privacy manifest (PrivacyInfo.xcprivacy), ATT prompt if tracking, permission usage strings, no private APIs, account-deletion path if there are accounts. Most rejections are preflightable.
  • Play Store: target API level current, data-safety form, 16KB page-size alignment for native libs.

Security

  • Run a Capacitor security scan (Capsec: npx @capgo/capgo-sec scan --ci) — catches hardcoded secrets, insecure storage, network security, auth weaknesses. Wire into CI to fail on high/critical.

Migrations

FromToNotes
Web app / PWACapacitornpx cap init → add platforms → wire plugins for native bits → store-ready.
Cordova / PhoneGapCapacitorMap plugins to Capacitor equivalents; many Cordova plugins still work but prefer native Capacitor ones.
CocoaPodsSwift Package ManageriOS dependency migration; check each plugin supports SPM.
SQLite pluginFast SQLPerformance migration for data-heavy apps.

Definition of done (Capacitor) [LOW freedom — do not skip]

  • Plugin majors match the Capacitor major; npx cap sync run after any native dep change.
  • Feature tested on a real device or emulator for both iOS and Android (or CI for iOS).
  • Permissions / entitlements / native config present for any native capability used.
  • Secrets are in CI/Keychain, never in the repo or the JS bundle.
  • If OTA: the bundle is compatible with the shipped native binary.
  • Shell plumbing rows touched pass their probe; the dead-bar-config grep returns zero hits.

Composes with

  • enhance-capacitor-ui — form-factor / platform / pointer layout architecture.
  • enhance-mobile-native-feel — the native-feel design pass that uses this plumbing.
  • mobile-emulator-test — the Android device loop the probes run in.
  • workflow-spec-tdd — spec + TDD spine for the feature itself.
  • full-stack-ship-discipline — backend deps deployed + verified.
  • enhance-web-* — the underlying web UI the Capacitor shell renders.
Skills enregistrées