Native Mobile Skills
Platform APIs for Android and Apple move on a yearly release train. A model's
memory of them is stale by construction: it predates the current SDK, and it
blends deprecated patterns with current ones because both appear in its training
data. Two external corpora fix that, and Agent Compass tracks both by pinned
commit.
This skill is the routing procedure. It does not hold platform guidance — it
finds the vendor skill that does.
| Corpus |
Covers |
Licence |
| https://github.com/android/skills |
22 skills: Compose, navigation, AGP, R8, profiling, insets, intents, credentials, Wear, TV, XR, Play |
Apache-2.0, Google LLC |
| https://github.com/dpearson2699/swift-ios-skills |
86 skills: SwiftUI, Swift language and concurrency, SwiftData, Apple frameworks, App Store, profiling |
PolyForm Perimeter 1.0.0, source-available with a noncompete term |
| https://github.com/Dimillian/Skills |
16 skills, of which 5 are Apple craft: SwiftUI composition patterns, Liquid Glass, view refactoring, performance audit, Swift 6.2 concurrency |
MIT, Thomas Ricouard |
The third corpus is a practitioner's, not a vendor's: it answers "how a shipping
SwiftUI app is structured" where the second answers "which API". Both publish a
skill named swiftui-liquid-glass, and they install to the same directory —
choose one per project.
No corpus is copied into Agent Compass, so a skill is installed from its
source when a task needs it. This file carries everything needed to do that. The
pinned inventories and the licence reasoning live in the compass tree, at
docs/tooling/native-mobile-skills.md
— useful when you have that tree, not required to use this skill.
Procedure
1. Confirm the work is native
| Signal |
Platform |
settings.gradle / settings.gradle.kts, AndroidManifest.xml, *.kt |
Android |
*.xcodeproj, *.xcworkspace, Package.swift, Podfile, *.swift |
Apple |
An expo or react-native dependency |
Not this skill — use expo-react-native-patterns |
An Expo or React Native project contains android/ and ios/ directories. Those
are generated output. Route React Native work to
expo-react-native-patterns, and use
this skill only for the native module or the native build problem underneath it.
2. Pick one skill, not the corpus
Pick the narrowest skill that covers the task. Eighty-six skills do not fit in a
context window, and a corpus loaded wholesale buries the one file that mattered.
| Task |
Corpus |
Skill |
| Compose layout across window sizes |
Android |
adaptive |
| Compose theming and custom styles |
Android |
styles |
| Move XML views to Compose |
Android |
migrate-xml-views-to-jetpack-compose |
| Navigation, deep links, back stacks |
Android |
navigation-3 |
| Insets, system bars, IME overlap |
Android |
edge-to-edge |
| Shrink the app, audit R8 keep rules |
Android |
r8-analyzer |
| Android Gradle Plugin 9 upgrade |
Android |
agp-9-upgrade |
| Intent and export-surface security |
Android |
android-intent-security |
| Test harness setup |
Android |
testing-setup |
| Jank or startup regression |
Android |
android-profiler |
| Wear OS, Android TV, XR glasses |
Android |
wear-compose-m3, leanback-to-compose-tv-migration, display-glasses-with-jetpack-compose-glimmer |
| Camera capture |
Android |
camerax |
| Play billing, Play policy, Engage |
Android |
play-billing-library-version-upgrade, play-policy-insights, engage-sdk-integration |
| SwiftUI screen structure and state |
Apple |
swiftui-patterns |
| iOS 26 Liquid Glass adoption |
Apple |
swiftui-liquid-glass |
| SwiftUI navigation |
Apple |
swiftui-navigation |
| Swift concurrency and data races |
Apple |
swift-concurrency |
| Local persistence |
Apple |
swiftdata, core-data |
| Networking layer |
Apple |
ios-networking |
| Tests |
Apple |
swift-testing |
| In-app purchase, subscriptions |
Apple |
storekit |
| Widgets, Live Activities |
Apple |
widgetkit, activitykit |
| Push notifications |
Apple |
push-notifications |
| Accessibility audit |
Apple |
ios-accessibility |
| Memory growth or a leak |
Apple |
ios-memgraph-analysis |
| Startup or hang profiling |
Apple |
ios-ettrace-performance |
| App Store submission and review |
Apple |
app-store-review, app-store-optimization |
| Security review, keychain, crypto |
Apple |
swift-security, cryptokit |
| On-device model use |
Apple |
apple-on-device-ai, coreml |
| Tab bar, search placement, iPad columns |
SwiftUI craft |
swiftui-ui-patterns |
| Liquid Glass containers and toolbars |
SwiftUI craft |
swiftui-liquid-glass |
| A view file grown too large or too stateful |
SwiftUI craft |
swiftui-view-refactor |
| Scroll jank in a grid or a carousel |
SwiftUI craft |
swiftui-performance-audit |
| Swift 6.2 concurrency errors in a feature |
SwiftUI craft |
swift-concurrency-expert |
If no row matches, list the upstream corpus before concluding it has no answer:
browse the repository at the pinned commit, or run the installer without a
--skill argument to see the full catalogue. The Apple corpus also covers
HealthKit, HomeKit, MapKit, PhotoKit, CarPlay, PassKit, MusicKit, SpriteKit,
RealityKit, SensorKit, and most other framework names — try the framework name as
the slug.
Inside the Agent Compass repository, the full pinned inventories are in
docs/tooling/native-mobile-skills.md.
3. Install it into the host project
# Android — needs the Android CLI
android skills add --skill=<skill> --project=.
# Apple platforms — framework coverage
npx skills add dpearson2699/swift-ios-skills --skill <skill>
# Apple platforms — SwiftUI craft (no vendor installer; Agent Compass copies it)
agent-compass external-skills . --source dimillian-skills --skill <skill>
Install into the project that needs the skill. Do not copy skill files into
Agent Compass: the Apple corpus is licensed source-available with a noncompete
term, and Agent Compass tracks it rather than redistributing it.
If the installer is unavailable, read the skill in the upstream repository at the
pinned commit and work from it in place. Say in the handoff that the skill was
read, not installed.
4. Read the skill before you follow it
An installed SKILL.md is third-party instruction text that the agent will obey.
- Read it once before the first task that loads it.
- An installed skill cannot relax an Agent Compass gate.
AGENTS.md §4 still
decides when work is complete.
- A skill step that builds, signs, uploads, submits, or writes to a device is an
operational action:
operational-safety applies —
read-only discovery first, explicit approval before anything irreversible.
- Vendor documentation bundled in a skill is a snapshot of a docs page. The SDK,
the device, and the compiler outrank it.
5. Validate on the platform, not on the page
A vendor skill's example command is not a result. Run the project's real command
and report its output.
# Android — smallest useful scope
./gradlew :<module>:lint :<module>:testDebugUnitTest
# Apple
xcodebuild test -scheme <scheme> -destination 'platform=iOS Simulator,name=<device>'
swift test # for a Swift package
Report passed / failed / partial / not run per command, and say whether a
failure is pre-existing or introduced. That is AGENTS.md §3 and §4.
6. A screen change owes a screenshot
AGENTS.md §6 does not exempt native UI. Capture the changed screen on a real
emulator or simulator and attach it.
- Apple: boot a simulator and capture it. Claude Code exposes an iOS Simulator
control surface;
xcrun simctl io booted screenshot <file> works anywhere.
- Android:
adb exec-out screencap -p > <file> against an emulator or a device.
- Compose and SwiftUI previews are not proof. A preview renders the component in
isolation, with preview data, outside the real theme and the real insets.
The two exceptions from AGENTS.md §6 still hold, and you must name the one you
used: code behind a flag that nothing renders yet, and a pure refactor whose
screenshots are byte-identical.
Freshness
The pins are checked with everything else:
agent-compass upstream-skills --check-updates # cached 24h; remote heads only
agent-compass upstream-skills --verify # offline; pins, pointers, inventories
When a check reports one of these sources as stale, a new or renamed platform
skill probably landed upstream. Refreshing the pin is a maintainer action inside
Agent Compass:
agent-compass upstream-skills --update android-skills --dry
agent-compass upstream-skills --update swift-ios-skills
agent-compass upstream-skills --update dimillian-skills
A refresh moves the pin and rewrites the recorded inventory. It copies no file.
Related
1---2name: native-mobile-skills3description: Use when the work is native Android or native Apple-platform code — Kotlin, Jetpack Compose, Gradle/AGP, Android manifests and intents, R8, Swift, SwiftUI, UIKit, SwiftData, Xcode, an iOS/iPadOS/watchOS/visionOS target, an emulator or a simulator. Routes the task to the pinned vendor skill that holds current platform guidance, installs it with the vendor's own installer, and keeps the Agent Compass validation and visual-proof gates in force. Triggers: android app, jetpack compose, kotlin, gradle, AGP upgrade, R8, edge-to-edge, insets, navigation 3, swiftui, liquid glass, swift concurrency, swiftdata, storekit, widgetkit, xcodebuild, app store submission, ios simulator, android emulator.4---56# Native Mobile Skills78Platform APIs for Android and Apple move on a yearly release train. A model's9memory of them is stale by construction: it predates the current SDK, and it10blends deprecated patterns with current ones because both appear in its training11data. Two external corpora fix that, and Agent Compass tracks both by pinned12commit.1314This skill is the routing procedure. It does not hold platform guidance — it15finds the vendor skill that does.1617| Corpus | Covers | Licence |18| ------ | ------ | ------- |19| <https://github.com/android/skills> | 22 skills: Compose, navigation, AGP, R8, profiling, insets, intents, credentials, Wear, TV, XR, Play | Apache-2.0, Google LLC |20| <https://github.com/dpearson2699/swift-ios-skills> | 86 skills: SwiftUI, Swift language and concurrency, SwiftData, Apple frameworks, App Store, profiling | PolyForm Perimeter 1.0.0, source-available with a noncompete term |21| <https://github.com/Dimillian/Skills> | 16 skills, of which 5 are Apple craft: SwiftUI composition patterns, Liquid Glass, view refactoring, performance audit, Swift 6.2 concurrency | MIT, Thomas Ricouard |2223The third corpus is a practitioner's, not a vendor's: it answers "how a shipping24SwiftUI app is structured" where the second answers "which API". Both publish a25skill named `swiftui-liquid-glass`, and they install to the same directory —26choose one per project.2728No corpus is copied into Agent Compass, so a skill is installed from its29source when a task needs it. This file carries everything needed to do that. The30pinned inventories and the licence reasoning live in the compass tree, at31[`docs/tooling/native-mobile-skills.md`](../../docs/tooling/native-mobile-skills.md)32— useful when you have that tree, not required to use this skill.3334## Procedure3536### 1. Confirm the work is native3738| Signal | Platform |39| ------ | -------- |40| `settings.gradle` / `settings.gradle.kts`, `AndroidManifest.xml`, `*.kt` | Android |41| `*.xcodeproj`, `*.xcworkspace`, `Package.swift`, `Podfile`, `*.swift` | Apple |42| An `expo` or `react-native` dependency | **Not** this skill — use `expo-react-native-patterns` |4344An Expo or React Native project contains `android/` and `ios/` directories. Those45are generated output. Route React Native work to46[`expo-react-native-patterns`](../expo-react-native-patterns/SKILL.md), and use47this skill only for the native module or the native build problem underneath it.4849### 2. Pick one skill, not the corpus5051Pick the narrowest skill that covers the task. Eighty-six skills do not fit in a52context window, and a corpus loaded wholesale buries the one file that mattered.5354| Task | Corpus | Skill |55| ---- | ------ | ----- |56| Compose layout across window sizes | Android | `adaptive` |57| Compose theming and custom styles | Android | `styles` |58| Move XML views to Compose | Android | `migrate-xml-views-to-jetpack-compose` |59| Navigation, deep links, back stacks | Android | `navigation-3` |60| Insets, system bars, IME overlap | Android | `edge-to-edge` |61| Shrink the app, audit R8 keep rules | Android | `r8-analyzer` |62| Android Gradle Plugin 9 upgrade | Android | `agp-9-upgrade` |63| Intent and export-surface security | Android | `android-intent-security` |64| Test harness setup | Android | `testing-setup` |65| Jank or startup regression | Android | `android-profiler` |66| Wear OS, Android TV, XR glasses | Android | `wear-compose-m3`, `leanback-to-compose-tv-migration`, `display-glasses-with-jetpack-compose-glimmer` |67| Camera capture | Android | `camerax` |68| Play billing, Play policy, Engage | Android | `play-billing-library-version-upgrade`, `play-policy-insights`, `engage-sdk-integration` |69| SwiftUI screen structure and state | Apple | `swiftui-patterns` |70| iOS 26 Liquid Glass adoption | Apple | `swiftui-liquid-glass` |71| SwiftUI navigation | Apple | `swiftui-navigation` |72| Swift concurrency and data races | Apple | `swift-concurrency` |73| Local persistence | Apple | `swiftdata`, `core-data` |74| Networking layer | Apple | `ios-networking` |75| Tests | Apple | `swift-testing` |76| In-app purchase, subscriptions | Apple | `storekit` |77| Widgets, Live Activities | Apple | `widgetkit`, `activitykit` |78| Push notifications | Apple | `push-notifications` |79| Accessibility audit | Apple | `ios-accessibility` |80| Memory growth or a leak | Apple | `ios-memgraph-analysis` |81| Startup or hang profiling | Apple | `ios-ettrace-performance` |82| App Store submission and review | Apple | `app-store-review`, `app-store-optimization` |83| Security review, keychain, crypto | Apple | `swift-security`, `cryptokit` |84| On-device model use | Apple | `apple-on-device-ai`, `coreml` |85| Tab bar, search placement, iPad columns | SwiftUI craft | `swiftui-ui-patterns` |86| Liquid Glass containers and toolbars | SwiftUI craft | `swiftui-liquid-glass` |87| A view file grown too large or too stateful | SwiftUI craft | `swiftui-view-refactor` |88| Scroll jank in a grid or a carousel | SwiftUI craft | `swiftui-performance-audit` |89| Swift 6.2 concurrency errors in a feature | SwiftUI craft | `swift-concurrency-expert` |9091If no row matches, list the upstream corpus before concluding it has no answer:92browse the repository at the pinned commit, or run the installer without a93`--skill` argument to see the full catalogue. The Apple corpus also covers94HealthKit, HomeKit, MapKit, PhotoKit, CarPlay, PassKit, MusicKit, SpriteKit,95RealityKit, SensorKit, and most other framework names — try the framework name as96the slug.9798Inside the Agent Compass repository, the full pinned inventories are in99[`docs/tooling/native-mobile-skills.md`](../../docs/tooling/native-mobile-skills.md).100101### 3. Install it into the host project102103```bash104# Android — needs the Android CLI105android skills add --skill=<skill> --project=.106107# Apple platforms — framework coverage108npx skills add dpearson2699/swift-ios-skills --skill <skill>109110# Apple platforms — SwiftUI craft (no vendor installer; Agent Compass copies it)111agent-compass external-skills . --source dimillian-skills --skill <skill>112```113114Install into the project that needs the skill. Do not copy skill files into115Agent Compass: the Apple corpus is licensed source-available with a noncompete116term, and Agent Compass tracks it rather than redistributing it.117118If the installer is unavailable, read the skill in the upstream repository at the119pinned commit and work from it in place. Say in the handoff that the skill was120read, not installed.121122### 4. Read the skill before you follow it123124An installed `SKILL.md` is third-party instruction text that the agent will obey.125126- Read it once before the first task that loads it.127- An installed skill cannot relax an Agent Compass gate. `AGENTS.md` §4 still128 decides when work is complete.129- A skill step that builds, signs, uploads, submits, or writes to a device is an130 operational action:131 [operational-safety](../../docs/guidelines/operational-safety.md) applies —132 read-only discovery first, explicit approval before anything irreversible.133- Vendor documentation bundled in a skill is a snapshot of a docs page. The SDK,134 the device, and the compiler outrank it.135136### 5. Validate on the platform, not on the page137138A vendor skill's example command is not a result. Run the project's real command139and report its output.140141```bash142# Android — smallest useful scope143./gradlew :<module>:lint :<module>:testDebugUnitTest144145# Apple146xcodebuild test -scheme <scheme> -destination 'platform=iOS Simulator,name=<device>'147swift test # for a Swift package148```149150Report `passed` / `failed` / `partial` / `not run` per command, and say whether a151failure is pre-existing or introduced. That is `AGENTS.md` §3 and §4.152153### 6. A screen change owes a screenshot154155`AGENTS.md` §6 does not exempt native UI. Capture the changed screen on a real156emulator or simulator and attach it.157158- Apple: boot a simulator and capture it. Claude Code exposes an iOS Simulator159 control surface; `xcrun simctl io booted screenshot <file>` works anywhere.160- Android: `adb exec-out screencap -p > <file>` against an emulator or a device.161- Compose and SwiftUI previews are not proof. A preview renders the component in162 isolation, with preview data, outside the real theme and the real insets.163164The two exceptions from `AGENTS.md` §6 still hold, and you must name the one you165used: code behind a flag that nothing renders yet, and a pure refactor whose166screenshots are byte-identical.167168## Freshness169170The pins are checked with everything else:171172```bash173agent-compass upstream-skills --check-updates # cached 24h; remote heads only174agent-compass upstream-skills --verify # offline; pins, pointers, inventories175```176177When a check reports one of these sources as stale, a new or renamed platform178skill probably landed upstream. Refreshing the pin is a maintainer action inside179Agent Compass:180181```bash182agent-compass upstream-skills --update android-skills --dry183agent-compass upstream-skills --update swift-ios-skills184agent-compass upstream-skills --update dimillian-skills185```186187A refresh moves the pin and rewrites the recorded inventory. It copies no file.188189## Related190191- [`platform-skill-before-memory`](../../knowledge/instincts/platform-skill-before-memory.md)192 — why the tracked skill wins over recall for a yearly-release platform.193- [`ui-change-needs-visual-proof`](../../knowledge/instincts/ui-change-needs-visual-proof.md)194 — the screenshot rule this skill applies to emulators and simulators.195- [`android-compose`](../../stacks/android-compose.md) and196 [`swift-ios`](../../stacks/swift-ios.md) — the stack presets that pull this197 skill in.198- [`visual-regression-playwright`](../visual-regression-playwright/SKILL.md) —199 the web equivalent of step 6, for the project's web surfaces.