brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
enhance-mobile-native-feelMake an existing Expo/RN or Capacitor app feel native: system tabs, sheets, edge-to-edge, back, haptics, springs, lists. Use when "feels like a website", "not native", "add haptics", "immersive full screen", or "declutter the home screen".
Independent GitHub snapshot · Automated classification · Original documentation governs
Degree of freedom: MIXED. Stack detection, the scorecard, and the verify gate
[LOW freedom — run exactly]. Which fixes to apply per screen [HIGH freedom].
The app already ships. It compiles, it works, and it looks like a website wrapped in an app shell: a header + footer drawn in JS, one long scrolling page per section, buttons with no press response, five accent colors, 12px body text, no motion, no haptics. This skill runs one coherent pass over the whole app so it reads as native on iOS 26+ (Liquid Glass) and Android 16, using the platform's own chrome wherever it exists.
The failure mode this prevents: fixing one screen's padding while the navigation model, list rendering, and feedback language stay web-shaped.
| Skill | Owns |
|---|---|
| enhance-mobile-native-feel (this) | App-wide pass on an existing mobile app: chrome, IA, lists, motion, haptics, type/icon/color |
workflow-mobile-native-uiux | This pass plus accessibility, layout, device QA, and a PR, in order |
mobile-capacitor-platform | Capacitor shell plumbing this pass relies on: SystemBars, keyboard, splash, back |
mobile-rn-screen | One React Native screen, pixel-level polish after this pass |
enhance-capacitor-ui | Hybrid apps where the same code also ships a desktop web surface |
design-mobile-first | A new touch-first UI from scratch |
mobile-rn-performance | Jank, startup, bundle, memory when the UI is already native-shaped |
enhance-motion | Web motion pass (Framer/Motion, CSS, GSAP) |
plan-mobile-readiness | Store submission audit, plan-only |
references/native-feel-scorecard.md)Observe: Expo SDK 54, Reanimated 4, Expo Router with a custom
View-based tab bar; Capacitor absent. Home = oneScrollViewwith 14 cards; "Orders" = 600-rowFlatList; buttons areTouchableOpacity; noexpo-haptics; six accent colors. Score: 2/10 (safe areas and dark mode pass). Fix:NativeTabswith 4 destinations + Search; home cut to 4 cards and a sheet for the rest; Orders → FlashList v2 withgetItemType;Pressable+withSpringscale 0.97;Haptics.selectionAsyncon tab change,notificationAsync(Success)on order placed; two accent roles; body 16sp with Dynamic Type. Verify: 9/10 (Android nav-bar tint still pending); fling has no blank cells; reduced motion removes travel; every target ≥ 44pt.
ScrollView or FlatList with blank cells on flingmobile-rn-screen; desktop surface regressions → enhance-capacitor-uiDo not add a second navigation, sheet, list, or haptics library when one is installed.
# Stack + versions (the recipes in references/ are version-gated)
grep -E '"(expo|react-native|react-native-reanimated|@shopify/flash-list|@legendapp/list|@gorhom/bottom-sheet|expo-haptics|expo-symbols|react-native-safe-area-context|@capacitor/core|@capacitor/haptics)"' package.json
# Navigation model
rg -n "NativeTabs|unstable-native-tabs|createBottomTabNavigator|<Tabs" -g "*.{tsx,ts}" | head
# Chrome drawn in JS
rg -n "position: ?'absolute'.*bottom: ?0|tabBarStyle|headerShown" -g "*.{tsx,ts}" -c
# Feedback today
rg -n "TouchableOpacity|TouchableHighlight|Pressable|Haptics\.|impactAsync|selectionAsync" -g "*.{tsx,ts}" -c
# Long pages and lists
rg -n "<ScrollView|<FlatList|<FlashList|<LegendList|<SectionList" -g "*.{tsx,ts}" -c
# Capacitor edge-to-edge state
rg -n "viewport-fit=cover|safe-area-inset|SystemBars|StatusBar\.setBackgroundColor" -g "*.{html,css,ts,tsx}"
# Android back handling
rg -n "predictiveBackGestureEnabled|addListener\('backButton'|BackHandler" -g "*.{ts,tsx,json}"
Record STACK · NAV · LISTS · FEEDBACK · CHROME · BACK in six lines before any edit.
mobile-emulator-start); screenshot every top-level
screen in light and dark mode. Keep the set as the "before".references/anti-patterns.md and mark each smell present.Fill references/native-feel-scorecard.md (10 checks) with pass/fail and the
screenshot or grep that proves it. The score is the baseline the report compares against.
Work the whole app in this order; each step builds on the previous one. Pull the
exact API for the installed stack from references/stack-recipes.md.
mobile-capacitor-platform § Native shell plumbing; apply that first.selection for pickers and tab changes, impact for snaps and drops,
notification for success/warning/error. Nothing on plain taps. Pair each haptic
with the motion it accompanies and keep a user setting to turn them off.fontScale. Platform symbol set (SF Symbols on iOS, Material Symbols on Android),
filled variants in bars. Two accent roles (primary, destructive) plus semantic status.
Contrast ≥ 4.5:1 for body text in both modes.Preserve all existing data flow and handlers. This pass is additive to behavior.
mobile-capacitor-platform plumbing probes pass on Android 16 and iOS 26+.Report format:
## Native-feel pass — report
**Stack:** [Expo SDK n / RN n / Reanimated n | Capacitor n] · **Score:** [before]/10 → [after]/10
**Chrome:** [NativeTabs | native stack | sheets] replaced [JS tab bar, header]
**IA:** home [14 → 4] cards; [n] flows moved to sheets; primary action in thumb zone
**Lists:** [screen] → [FlashList v2 | LegendList] · fling clean ✓
**Motion:** one spring set · reduced motion ✓ · **Haptics:** [events] · setting ✓
**Type/icon/color:** body [16sp] · [symbol set] · accents [6 → 2] · contrast ✓
**Verification:** before/after screenshots [paths] · typecheck ✓ · tests ✓
**Open:** [what is still failing on the card and why]
Finish the whole fix order before the report. A step that cannot be applied (SDK too old, dependency missing) is listed under Open with the upgrade that unblocks it.
references/stack-recipes.md — version-gated Expo/RN and Capacitor APIs for each stepreferences/native-feel-scorecard.md — the ten checks and their sourcesreferences/anti-patterns.md — the web-shaped smells this pass removesmobile-capacitor-platform — Capacitor SystemBars, keyboard, splash, back, haptics defaultsmobile-rn-screen — per-screen polish after this passmobile-rn-performance — if lists still drop frames after virtualizationenhance-capacitor-ui — when a desktop web surface shares the codemobile-emulator-test — the QA loop used in Phase 3