Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Design to iOS and Android conventions — what each OS mandates, where they diverge, and when to unify. Use when shipping native apps. For breakpoint adaptation use `responsive-design`; for matching competitor patterns use `jakobs-law` (interaction-design).
.claude/skills/owl-listener-platform-conventions/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-15 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 36% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 58% | 0% |
You are an expert in iOS Human Interface Guidelines and Material Design, and in the trade-offs between platform-native and cross-platform product design.
You identify which UI patterns are platform-mandated conventions, map the meaningful differences between iOS and Android, and help teams decide when to follow each platform vs. when a unified cross-platform design is appropriate.
Users spend the vast majority of their time in the OS and its native apps. They build strong muscle memory for navigation, controls, and interaction patterns. When your product departs from platform convention without clear reason, users spend cognitive budget understanding your product rather than using it.
| Pattern | iOS | Android | |---|---|---| | Back navigation | Swipe right from left edge; back button top-left | System back gesture (swipe from either edge) or predictive back; back arrow in app bar | | Primary structure | Tab bar at bottom; sidebar on iPad | Navigation bar at bottom or Navigation drawer (hamburger) | | Navigation history | Stack-based; each tab has its own stack | Single back stack across the app; tabs do not maintain independent history by default | | Bottom navigation | Up to 5 tabs; no labels required | 3–5 tabs; labels required |
Design implication: iOS users expect swiping from the left edge to always go back; reserve that gesture zone. On Android, the system back gesture handles this — in-app swipe-from-left can be used for a drawer without conflicting.
| Component | iOS convention | Android (Material 3) convention | |---|---|---| | Toggle switch | UISwitch — pill shape, right-aligned in lists | Switch — thumb-and-track, can appear inline or in lists | | Destructive confirmation | Action sheet (bottom) with red destructive option | Dialog with text buttons; red/error tone for destructive | | Date/time picker | Wheel picker or calendar inline | Calendar with text input alternative | | Selection menus | Picker wheel or action sheet | Exposed dropdown or modal bottom sheet | | Primary button | Filled rectangle, full-width in forms | Filled button (rounded corners by default in M3) | | Floating action | Not a convention — use contextual buttons | FAB — primary surface action, bottom-right | | Pull to refresh | Native UIRefreshControl | SwipeRefreshLayout — same gesture, different visual |
| Attribute | iOS | Android | |---|---|---| | System font | SF Pro (text) / SF Compact (watch) | Roboto / Google Sans | | Dynamic type | Required — users control text size system-wide | Scalable pixels (sp) — must respect system font scale | | Type scale | iOS text styles (Large Title, Title 1–3, Body, etc.) | Material type scale (Display, Headline, Title, Body, Label) |
Both platforms require apps to respect the user's system font size preference. Hardcoded point sizes that do not scale are an accessibility failure on both.
| Gesture | iOS behaviour | Android behaviour | |---|---|---| | Swipe to delete | Standard in table views | Swipe to dismiss/archive (context-dependent) | | Long press | Peek / context menu (iOS 13+ context menus) | Contextual action mode; long press to select | | Pull to refresh | Standard | Standard | | Pinch to zoom | Standard in maps, images | Standard | | Back swipe | Reserved — always navigates back | Predictive back gesture; apps can opt in to preview |
| Area | iOS | Android | |---|---|---| | Icon library | SF Symbols (thousands, variable weight, auto-scale) | Material Symbols (rounded, outlined, sharp variants) | | Corner radius | Larger, "squircle" curves (superellipse) | Moderate — Material 3 uses prominent rounding on components | | System colours | Dynamic colors that adapt to dark/light automatically | Material You dynamic color — generated from wallpaper | | Modal presentation | Sheet that slides up from bottom, with grab handle | Bottom sheet (standard or modal) or full-screen dialog |
Most cross-platform products adopt a middle path: a unified visual and component language, but with platform-specific adaptations for navigation (system-level conventions), system controls, and gesture conflicts. The product looks like itself; it behaves like the OS.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 15,784 | 28,712 | +82% | 1 | 1 | 0% | 2,426 | 3,290 | +36% | 0 | 0 | — |
case-15 | fail→pass | 18,446 | 15,788 | -14% | 1 | 1 | 0% | 2,828 | 3,733 | +32% | 0 | 0 | — |
case-02 | fail→pass | 15,198 | 17,365 | +14% | 1 | 1 | 0% | 2,281 | 3,761 | +65% | 0 | 0 | — |
case-03 | fail→fail | 15,784 | 17,796 | +13% | 1 | 1 | 0% | 2,527 | 4,054 | +60% | 0 | 0 | — |
case-04 | pass→pass | 16,450 | 16,763 | +2% | 1 | 1 | 0% | 2,438 | 3,846 | +58% | 0 | 0 | — |
case-05 | fail→pass | 16,897 | 14,579 | -14% | 1 | 1 | 0% | 2,317 | 3,531 | +52% | 0 | 0 | — |
case-06 | pass→pass | 12,829 | 14,878 | +16% | 1 | 1 | 0% | 1,962 | 3,102 | +58% | 0 | 0 | — |
case-07 | pass→pass | 17,041 | 16,763 | -2% | 1 | 1 | 0% | 2,620 | 3,965 | +51% | 0 | 0 | — |
case-08 | pass→pass | 16,675 | 20,062 | +20% | 1 | 1 | 0% | 2,605 | 4,330 | +66% | 0 | 0 | — |
case-09 | pass→pass | 9,326 | 15,934 | +71% | 1 | 1 | 0% | 1,443 | 3,020 | +109% | 0 | 0 | — |
case-10 | pass→pass | 15,319 | 18,050 | +18% | 1 | 1 | 0% | 2,510 | 3,984 | +59% | 0 | 0 | — |
case-11 | pass→pass | 19,649 | 16,584 | -16% | 1 | 1 | 0% | 2,687 | 3,900 | +45% | 0 | 0 | — |
case-12 | pass→pass | 18,935 | 16,954 | -10% | 1 | 1 | 0% | 2,809 | 3,867 | +38% | 0 | 0 | — |
case-13 | pass→pass | 20,252 | 24,154 | +19% | 1 | 1 | 0% | 2,968 | 4,826 | +63% | 0 | 0 | — |
case-14 | pass→pass | 12,747 | 11,172 | -12% | 1 | 1 | 0% | 2,031 | 2,982 | +47% | 0 | 0 | — |
case-16 | pass→pass | 16,806 | 17,239 | +3% | 1 | 1 | 0% | 2,679 | 3,965 | +48% | 0 | 0 | — |
case-17 | pass→pass | 14,303 | 14,747 | +3% | 1 | 1 | 0% | 2,089 | 3,413 | +63% | 0 | 0 | — |
case-18 | pass→pass | 6,171 | 6,581 | +7% | 1 | 1 | 0% | 1,049 | 2,597 | +148% | 0 | 0 | — |
case-19 | pass→pass | 5,271 | 5,099 | -3% | 1 | 1 | 0% | 865 | 2,028 | +134% | 0 | 0 | — |
case-20 | pass→pass | 6,742 | 13,170 | +95% | 1 | 1 | 0% | 1,141 | 3,180 | +179% | 0 | 0 | — |
case-21 | fail→fail | 18,454 | 16,680 | -10% | 1 | 1 | 0% | 2,941 | 4,059 | +38% | 0 | 0 | — |
case-22 | pass→pass | 5,303 | 4,685 | -12% | 1 | 1 | 0% | 744 | 2,070 | +178% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +14 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.