Mobile Design System
💡 MCP Tool Available: Use Context7, Tavily, BraveSearch, or Serper.dev first; only if those fail, use WebSearch or WebFetch as needed.
Philosophy: Touch-first. Battery-conscious. Platform-respectful. Offline-capable.
Core Principle: Mobile is NOT a small desktop. THINK mobile constraints, ASK platform choice.
🔧 Runtime Scripts
Execute these for validation (don't read, just run):
| Script |
Purpose |
Usage |
scripts/mobile_audit.py |
Mobile UX & Touch Audit |
python scripts/mobile_audit.py <project_path> |
🔴 MANDATORY: Read Reference Files Before Working!
⛔ DO NOT start development until you read the relevant files:
Universal (Always Read)
| File |
Content |
Status |
| mobile-design-thinking.md |
⚠️ ANTI-MEMORIZATION: Forces thinking, prevents AI defaults |
⬜ CRITICAL FIRST |
| touch-psychology.md |
Fitts' Law, gestures, haptics, thumb zone |
⬜ CRITICAL |
| mobile-performance.md |
RN/Flutter performance, 60fps, memory |
⬜ CRITICAL |
| mobile-backend.md |
Push notifications, offline sync, mobile API |
⬜ CRITICAL |
| mobile-testing.md |
Testing pyramid, E2E, platform-specific |
⬜ CRITICAL |
| mobile-debugging.md |
Native vs JS debugging, Flipper, Logcat |
⬜ CRITICAL |
| mobile-navigation.md |
Tab/Stack/Drawer, deep linking |
⬜ Read |
| mobile-typography.md |
System fonts, Dynamic Type, a11y |
⬜ Read |
| mobile-color-system.md |
OLED, dark mode, battery-aware |
⬜ Read |
| decision-trees.md |
Framework/state/storage selection |
⬜ Read |
🧠 mobile-design-thinking.md is PRIORITY! This file ensures AI thinks instead of using memorized patterns.
Platform-Specific (Read Based on Target)
| Platform |
File |
Content |
When to Read |
| iOS |
platform-ios.md |
Human Interface Guidelines, SF Pro, SwiftUI patterns |
Building for iPhone/iPad |
| Android |
platform-android.md |
Material Design 3, Roboto, Compose patterns |
Building for Android |
| Cross-Platform |
Both above |
Platform divergence points |
React Native / Flutter |
🔴 If building for iOS → Read platform-ios.md FIRST!
🔴 If building for Android → Read platform-android.md FIRST!
🔴 If cross-platform → Read BOTH and apply conditional platform logic!
⚠️ CRITICAL: ASK BEFORE ASSUMING (MANDATORY)
STOP! If the user's request is open-ended, DO NOT default to your favorites.
You MUST Ask If Not Specified:
| Aspect |
Ask |
Why |
| Platform |
"iOS, Android, or both?" |
Affects EVERY design decision |
| Framework |
"React Native, Flutter, or native?" |
Determines patterns and tools |
| Navigation |
"Tab bar, drawer, or stack-based?" |
Core UX decision |
| State |
"What state management? (Zustand/Redux/Riverpod/BLoC?)" |
Architecture foundation |
| Offline |
"Does this need to work offline?" |
Affects data strategy |
| Target devices |
"Phone only, or tablet support?" |
Layout complexity |
⛔ AI MOBILE ANTI-PATTERNS (YASAK LİSTESİ)
🚫 These are AI default tendencies that MUST be avoided!
Performance Sins
| ❌ NEVER DO |
Why It's Wrong |
✅ ALWAYS DO |
| ScrollView for long lists |
Renders ALL items, memory explodes |
Use FlatList / FlashList / ListView.builder |
| Inline renderItem function |
New function every render, all items re-render |
useCallback + React.memo |
| Missing keyExtractor |
Index-based keys cause bugs on reorder |
Unique, stable ID from data |
| Skip getItemLayout |
Async layout = janky scroll |
Provide when items have fixed height |
| setState() everywhere |
Unnecessary widget rebuilds |
Targeted state, const constructors |
| Native driver: false |
Animations blocked by JS thread |
useNativeDriver: true always |
| console.log in production |
Blocks JS thread severely |
Remove before release build |
| Skip React.memo/const |
Every item re-renders on any change |
Memoize list items ALWAYS |
Touch/UX Sins
| ❌ NEVER DO |
Why It's Wrong |
✅ ALWAYS DO |
| Touch target < 44px |
Impossible to tap accurately, frustrating |
Minimum 44pt (iOS) / 48dp (Android) |
| Spacing < 8px between targets |
Accidental taps on neighbors |
Minimum 8-12px gap |
| Gesture-only interactions |
Motor impaired users excluded |
Always provide button alternative |
| No loading state |
User thinks app crashed |
ALWAYS show loading feedback |
| No error state |
User stuck, no recovery path |
Show error with retry option |
| No offline handling |
Crash/block when network lost |
Graceful degradation, cached data |
| Ignore platform conventions |
Users confused, muscle memory broken |
iOS feels iOS, Android feels Android |
Security Sins
| ❌ NEVER DO |
Why It's Wrong |
✅ ALWAYS DO |
| Token in AsyncStorage |
Easily accessible, stolen on rooted device |
SecureStore / Keychain / EncryptedSharedPreferences |
| Hardcode API keys |
Reverse engineered from APK/IPA |
Environment variables, secure storage |
| Skip SSL pinning |
MITM attacks possible |
Pin certificates in production |
| Log sensitive data |
Logs can be extracted |
Never log tokens, passwords, PII |
Architecture Sins
| ❌ NEVER DO |
Why It's Wrong |
✅ ALWAYS DO |
| Business logic in UI |
Untestable, unmaintainable |
Service layer separation |
| Global state for everything |
Unnecessary re-renders, complexity |
Local state default, lift when needed |
| Deep linking as afterthought |
Notifications, shares broken |
Plan deep links from day one |
| Skip dispose/cleanup |
Memory leaks, zombie listeners |
Clean up subscriptions, timers |
📱 Platform Decision Matrix
When to Unify vs Diverge
UNIFY (same on both) DIVERGE (platform-specific)
─────────────────── ──────────────────────────
Business Logic ✅ Always -
Data Layer ✅ Always -
Core Features ✅ Always -
Navigation - ✅ iOS: edge swipe, Android: back button
Gestures - ✅ Platform-native feel
Icons - ✅ SF Symbols vs Material Icons
Date Pickers - ✅ Native pickers feel right
Modals/Sheets - ✅ iOS: bottom sheet vs Android: dialog
Typography - ✅ SF Pro vs Roboto (or custom)
Error Dialogs - ✅ Platform conventions for alerts
Quick Reference: Platform Defaults
| Element |
iOS |
Android |
| Primary Font |
SF Pro / SF Compact |
Roboto |
| Min Touch Target |
44pt × 44pt |
48dp × 48dp |
| Back Navigation |
Edge swipe left |
System back button/gesture |
| Bottom Tab Icons |
SF Symbols |
Material Symbols |
| Action Sheet |
UIActionSheet from bottom |
Bottom Sheet / Dialog |
| Progress |
Spinner |
Linear progress (Material) |
| Pull to Refresh |
Native UIRefreshControl |
SwipeRefreshLayout |
🧠 Mobile UX Psychology (Quick Reference)
Fitts' Law for Touch
Desktop: Cursor is precise (1px)
Mobile: Finger is imprecise (~7mm contact area)
→ Touch targets MUST be 44-48px minimum
→ Important actions in THUMB ZONE (bottom of screen)
→ Destructive actions AWAY from easy reach
Thumb Zone (One-Handed Usage)
┌─────────────────────────────┐
│ HARD TO REACH │ ← Navigation, menu, back
│ (stretch) │
├─────────────────────────────┤
│ OK TO REACH │ ← Secondary actions
│ (natural) │
├─────────────────────────────┤
│ EASY TO REACH │ ← PRIMARY CTAs, tab bar
│ (thumb's natural arc) │ ← Main content interaction
└─────────────────────────────┘
[ HOME ]
Mobile-Specific Cognitive Load
| Desktop |
Mobile Difference |
| Multiple windows |
ONE task at a time |
| Keyboard shortcuts |
Touch gestures |
| Hover states |
NO hover (tap or nothing) |
| Large viewport |
Limited space, scroll vertical |
| Stable attention |
Interrupted constantly |
For deep dive: touch-psychology.md
⚡ Performance Principles (Quick Reference)
React Native Critical Rules
// ✅ CORRECT: Memoized renderItem + React.memo wrapper
const ListItem = React.memo(({ item }: { item: Item }) => (
<View style={styles.item}>
<Text>{item.title}</Text>
</View>
));
const renderItem = useCallback(
({ item }: { item: Item }) => <ListItem item={item} />,
[]
);
// ✅ CORRECT: FlatList with all optimizations
<FlatList
data={items}
renderItem={renderItem}
keyExtractor={(item) => item.id} // Stable ID, NOT index
getItemLayout={(data, index) => ({
length: ITEM_HEIGHT,
offset: ITEM_HEIGHT * index,
index,
})}
removeClippedSubviews={true}
maxToRenderPerBatch={10}
windowSize={5}
/>
Flutter Critical Rules
// ✅ CORRECT: const constructors prevent rebuilds
class MyWidget extends StatelessWidget {
const MyWidget({super.key}); // CONST!
@override
Widget build(BuildContext context) {
return const Column( // CONST!
children: [
Text('Static content'),
MyConstantWidget(),
],
);
}
}
// ✅ CORRECT: Targeted state with ValueListenableBuilder
ValueListenableBuilder<int>(
valueListenable: counter,
builder: (context, value, child) => Text('$value'),
child: const ExpensiveWidget(), // Won't rebuild!
)
Animation Performance
GPU-accelerated (FAST): CPU-bound (SLOW):
├── transform ├── width, height
├── opacity ├── top, left, right, bottom
└── (use these ONLY) ├── margin, padding
└── (AVOID animating these)
For complete guide: mobile-performance.md
📝 CHECKPOINT (MANDATORY Before Any Mobile Work)
Before writing ANY mobile code, you MUST complete this checkpoint:
🧠 CHECKPOINT:
Platform: [ iOS / Android / Both ]
Framework: [ React Native / Flutter / SwiftUI / Kotlin ]
Files Read: [ List the skill files you've read ]
3 Principles I Will Apply:
1. _______________
2. _______________
3. _______________
Anti-Patterns I Will Avoid:
1. _______________
2. _______________
Example:
🧠 CHECKPOINT:
Platform: iOS + Android (Cross-platform)
Framework: React Native + Expo
Files Read: touch-psychology.md, mobile-performance.md, platform-ios.md, platform-android.md
3 Principles I Will Apply:
1. FlatList with React.memo + useCallback for all lists
2. 48px touch targets, thumb zone for primary CTAs
3. Platform-specific navigation (edge swipe iOS, back button Android)
Anti-Patterns I Will Avoid:
1. ScrollView for lists → FlatList
2. Inline renderItem → Memoized
3. AsyncStorage for tokens → SecureStore
🔴 Can't fill the checkpoint? → GO BACK AND READ THE SKILL FILES.
🔧 Framework Decision Tree
WHAT ARE YOU BUILDING?
│
├── Need OTA updates + rapid iteration + web team
│ └── ✅ React Native + Expo
│
├── Need pixel-perfect custom UI + performance critical
│ └── ✅ Flutter
│
├── Deep native features + single platform focus
│ ├── iOS only → SwiftUI
│ └── Android only → Kotlin + Jetpack Compose
│
├── Existing RN codebase + new features
│ └── ✅ React Native (bare workflow)
│
└── Enterprise + existing Flutter codebase
└── ✅ Flutter
For complete decision trees: decision-trees.md
📋 Pre-Development Checklist
Before Starting ANY Mobile Project
Before Every Screen
Before Release
📚 Reference Files
For deeper guidance on specific areas:
| File |
When to Use |
| mobile-design-thinking.md |
FIRST! Anti-memorization, forces context-based thinking |
| touch-psychology.md |
Understanding touch interaction, Fitts' Law, gesture design |
| mobile-performance.md |
Optimizing RN/Flutter, 60fps, memory/battery |
| platform-ios.md |
iOS-specific design, HIG compliance |
| platform-android.md |
Android-specific design, Material Design 3 |
| mobile-navigation.md |
Navigation patterns, deep linking |
| mobile-typography.md |
Type scale, system fonts, accessibility |
| mobile-color-system.md |
OLED optimization, dark mode, battery |
| decision-trees.md |
Framework, state, storage decisions |
Remember: Mobile users are impatient, interrupted, and using imprecise fingers on small screens. Design for the WORST conditions: bad network, one hand, bright sun, low battery. If it works there, it works everywhere.
1---2name: mobile-design-53description: Mobile-first design thinking and decision-making for iOS and Android apps. Touch interaction, performance patterns, platform conventions. Teaches principles, not fixed values. Use when building React Native, Flutter, or native mobile apps.4---5
6# Mobile Design System
7
8> **💡 MCP Tool Available**: Use **Context7**, **Tavily**, **BraveSearch**, or **Serper.dev** first; only if those fail, use **WebSearch** or **WebFetch** as needed.
9
10> **Philosophy:** Touch-first. Battery-conscious. Platform-respectful. Offline-capable.
11> **Core Principle:** Mobile is NOT a small desktop. THINK mobile constraints, ASK platform choice.
12
13---
14
15## 🔧 Runtime Scripts
16
17**Execute these for validation (don't read, just run):**
18
19| Script | Purpose | Usage |
20|--------|---------|-------|
21| `scripts/mobile_audit.py` | Mobile UX & Touch Audit | `python scripts/mobile_audit.py <project_path>` |
22
23---
24
25## 🔴 MANDATORY: Read Reference Files Before Working!
26
27**⛔ DO NOT start development until you read the relevant files:**
28
29### Universal (Always Read)
30
31| File | Content | Status |
32|------|---------|--------|
33| **[mobile-design-thinking.md](mobile-design-thinking.md)** | **⚠️ ANTI-MEMORIZATION: Forces thinking, prevents AI defaults** | **⬜ CRITICAL FIRST** |
34| **[touch-psychology.md](touch-psychology.md)** | **Fitts' Law, gestures, haptics, thumb zone** | **⬜ CRITICAL** |
35| **[mobile-performance.md](mobile-performance.md)** | **RN/Flutter performance, 60fps, memory** | **⬜ CRITICAL** |
36| **[mobile-backend.md](mobile-backend.md)** | **Push notifications, offline sync, mobile API** | **⬜ CRITICAL** |
37| **[mobile-testing.md](mobile-testing.md)** | **Testing pyramid, E2E, platform-specific** | **⬜ CRITICAL** |
38| **[mobile-debugging.md](mobile-debugging.md)** | **Native vs JS debugging, Flipper, Logcat** | **⬜ CRITICAL** |
39| [mobile-navigation.md](mobile-navigation.md) | Tab/Stack/Drawer, deep linking | ⬜ Read |
40| [mobile-typography.md](mobile-typography.md) | System fonts, Dynamic Type, a11y | ⬜ Read |
41| [mobile-color-system.md](mobile-color-system.md) | OLED, dark mode, battery-aware | ⬜ Read |
42| [decision-trees.md](decision-trees.md) | Framework/state/storage selection | ⬜ Read |
43
44> 🧠 **mobile-design-thinking.md is PRIORITY!** This file ensures AI thinks instead of using memorized patterns.
45
46### Platform-Specific (Read Based on Target)
47
48| Platform | File | Content | When to Read |
49|----------|------|---------|--------------|
50| **iOS** | [platform-ios.md](platform-ios.md) | Human Interface Guidelines, SF Pro, SwiftUI patterns | Building for iPhone/iPad |
51| **Android** | [platform-android.md](platform-android.md) | Material Design 3, Roboto, Compose patterns | Building for Android |
52| **Cross-Platform** | Both above | Platform divergence points | React Native / Flutter |
53
54> 🔴 **If building for iOS → Read platform-ios.md FIRST!**
55> 🔴 **If building for Android → Read platform-android.md FIRST!**
56> 🔴 **If cross-platform → Read BOTH and apply conditional platform logic!**
57
58---
59
60## ⚠️ CRITICAL: ASK BEFORE ASSUMING (MANDATORY)
61
62> **STOP! If the user's request is open-ended, DO NOT default to your favorites.**
63
64### You MUST Ask If Not Specified:
65
66| Aspect | Ask | Why |
67|--------|-----|-----|
68| **Platform** | "iOS, Android, or both?" | Affects EVERY design decision |
69| **Framework** | "React Native, Flutter, or native?" | Determines patterns and tools |
70| **Navigation** | "Tab bar, drawer, or stack-based?" | Core UX decision |
71| **State** | "What state management? (Zustand/Redux/Riverpod/BLoC?)" | Architecture foundation |
72| **Offline** | "Does this need to work offline?" | Affects data strategy |
73| **Target devices** | "Phone only, or tablet support?" | Layout complexity |
74
75### ⛔ AI MOBILE ANTI-PATTERNS (YASAK LİSTESİ)
76
77> 🚫 **These are AI default tendencies that MUST be avoided!**
78
79#### Performance Sins
80
81| ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO |
82|-------------|----------------|--------------|
83| **ScrollView for long lists** | Renders ALL items, memory explodes | Use `FlatList` / `FlashList` / `ListView.builder` |
84| **Inline renderItem function** | New function every render, all items re-render | `useCallback` + `React.memo` |
85| **Missing keyExtractor** | Index-based keys cause bugs on reorder | Unique, stable ID from data |
86| **Skip getItemLayout** | Async layout = janky scroll | Provide when items have fixed height |
87| **setState() everywhere** | Unnecessary widget rebuilds | Targeted state, `const` constructors |
88| **Native driver: false** | Animations blocked by JS thread | `useNativeDriver: true` always |
89| **console.log in production** | Blocks JS thread severely | Remove before release build |
90| **Skip React.memo/const** | Every item re-renders on any change | Memoize list items ALWAYS |
91
92#### Touch/UX Sins
93
94| ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO |
95|-------------|----------------|--------------|
96| **Touch target < 44px** | Impossible to tap accurately, frustrating | Minimum 44pt (iOS) / 48dp (Android) |
97| **Spacing < 8px between targets** | Accidental taps on neighbors | Minimum 8-12px gap |
98| **Gesture-only interactions** | Motor impaired users excluded | Always provide button alternative |
99| **No loading state** | User thinks app crashed | ALWAYS show loading feedback |
100| **No error state** | User stuck, no recovery path | Show error with retry option |
101| **No offline handling** | Crash/block when network lost | Graceful degradation, cached data |
102| **Ignore platform conventions** | Users confused, muscle memory broken | iOS feels iOS, Android feels Android |
103
104#### Security Sins
105
106| ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO |
107|-------------|----------------|--------------|
108| **Token in AsyncStorage** | Easily accessible, stolen on rooted device | `SecureStore` / `Keychain` / `EncryptedSharedPreferences` |
109| **Hardcode API keys** | Reverse engineered from APK/IPA | Environment variables, secure storage |
110| **Skip SSL pinning** | MITM attacks possible | Pin certificates in production |
111| **Log sensitive data** | Logs can be extracted | Never log tokens, passwords, PII |
112
113#### Architecture Sins
114
115| ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO |
116|-------------|----------------|--------------|
117| **Business logic in UI** | Untestable, unmaintainable | Service layer separation |
118| **Global state for everything** | Unnecessary re-renders, complexity | Local state default, lift when needed |
119| **Deep linking as afterthought** | Notifications, shares broken | Plan deep links from day one |
120| **Skip dispose/cleanup** | Memory leaks, zombie listeners | Clean up subscriptions, timers |
121
122---
123
124## 📱 Platform Decision Matrix
125
126### When to Unify vs Diverge
127
128```
129 UNIFY (same on both) DIVERGE (platform-specific)
130 ─────────────────── ──────────────────────────
131Business Logic ✅ Always -
132Data Layer ✅ Always -
133Core Features ✅ Always -
134
135Navigation - ✅ iOS: edge swipe, Android: back button
136Gestures - ✅ Platform-native feel
137Icons - ✅ SF Symbols vs Material Icons
138Date Pickers - ✅ Native pickers feel right
139Modals/Sheets - ✅ iOS: bottom sheet vs Android: dialog
140Typography - ✅ SF Pro vs Roboto (or custom)
141Error Dialogs - ✅ Platform conventions for alerts
142```
143
144### Quick Reference: Platform Defaults
145
146| Element | iOS | Android |
147|---------|-----|---------|
148| **Primary Font** | SF Pro / SF Compact | Roboto |
149| **Min Touch Target** | 44pt × 44pt | 48dp × 48dp |
150| **Back Navigation** | Edge swipe left | System back button/gesture |
151| **Bottom Tab Icons** | SF Symbols | Material Symbols |
152| **Action Sheet** | UIActionSheet from bottom | Bottom Sheet / Dialog |
153| **Progress** | Spinner | Linear progress (Material) |
154| **Pull to Refresh** | Native UIRefreshControl | SwipeRefreshLayout |
155
156---
157
158## 🧠 Mobile UX Psychology (Quick Reference)
159
160### Fitts' Law for Touch
161
162```
163Desktop: Cursor is precise (1px)
164Mobile: Finger is imprecise (~7mm contact area)
165
166→ Touch targets MUST be 44-48px minimum
167→ Important actions in THUMB ZONE (bottom of screen)
168→ Destructive actions AWAY from easy reach
169```
170
171### Thumb Zone (One-Handed Usage)
172
173```
174┌─────────────────────────────┐
175│ HARD TO REACH │ ← Navigation, menu, back
176│ (stretch) │
177├─────────────────────────────┤
178│ OK TO REACH │ ← Secondary actions
179│ (natural) │
180├─────────────────────────────┤
181│ EASY TO REACH │ ← PRIMARY CTAs, tab bar
182│ (thumb's natural arc) │ ← Main content interaction
183└─────────────────────────────┘
184 [ HOME ]
185```
186
187### Mobile-Specific Cognitive Load
188
189| Desktop | Mobile Difference |
190|---------|-------------------|
191| Multiple windows | ONE task at a time |
192| Keyboard shortcuts | Touch gestures |
193| Hover states | NO hover (tap or nothing) |
194| Large viewport | Limited space, scroll vertical |
195| Stable attention | Interrupted constantly |
196
197For deep dive: [touch-psychology.md](touch-psychology.md)
198
199---
200
201## ⚡ Performance Principles (Quick Reference)
202
203### React Native Critical Rules
204
205```typescript
206// ✅ CORRECT: Memoized renderItem + React.memo wrapper
207const ListItem = React.memo(({ item }: { item: Item }) => (
208 <View style={styles.item}>
209 <Text>{item.title}</Text>
210 </View>
211));
212
213const renderItem = useCallback(
214 ({ item }: { item: Item }) => <ListItem item={item} />,
215 []
216);
217
218// ✅ CORRECT: FlatList with all optimizations
219<FlatList
220 data={items}
221 renderItem={renderItem}
222 keyExtractor={(item) => item.id} // Stable ID, NOT index
223 getItemLayout={(data, index) => ({
224 length: ITEM_HEIGHT,
225 offset: ITEM_HEIGHT * index,
226 index,
227 })}
228 removeClippedSubviews={true}
229 maxToRenderPerBatch={10}
230 windowSize={5}
231/>
232```
233
234### Flutter Critical Rules
235
236```dart
237// ✅ CORRECT: const constructors prevent rebuilds
238class MyWidget extends StatelessWidget {
239 const MyWidget({super.key}); // CONST!
240
241 @override
242 Widget build(BuildContext context) {
243 return const Column( // CONST!
244 children: [
245 Text('Static content'),
246 MyConstantWidget(),
247 ],
248 );
249 }
250}
251
252// ✅ CORRECT: Targeted state with ValueListenableBuilder
253ValueListenableBuilder<int>(
254 valueListenable: counter,
255 builder: (context, value, child) => Text('$value'),
256 child: const ExpensiveWidget(), // Won't rebuild!
257)
258```
259
260### Animation Performance
261
262```
263GPU-accelerated (FAST): CPU-bound (SLOW):
264├── transform ├── width, height
265├── opacity ├── top, left, right, bottom
266└── (use these ONLY) ├── margin, padding
267 └── (AVOID animating these)
268```
269
270For complete guide: [mobile-performance.md](mobile-performance.md)
271
272---
273
274## 📝 CHECKPOINT (MANDATORY Before Any Mobile Work)
275
276> **Before writing ANY mobile code, you MUST complete this checkpoint:**
277
278```
279🧠 CHECKPOINT:
280
281Platform: [ iOS / Android / Both ]
282Framework: [ React Native / Flutter / SwiftUI / Kotlin ]
283Files Read: [ List the skill files you've read ]
284
2853 Principles I Will Apply:
2861. _______________
2872. _______________
2883. _______________
289
290Anti-Patterns I Will Avoid:
2911. _______________
2922. _______________
293```
294
295**Example:**
296```
297🧠 CHECKPOINT:
298
299Platform: iOS + Android (Cross-platform)
300Framework: React Native + Expo
301Files Read: touch-psychology.md, mobile-performance.md, platform-ios.md, platform-android.md
302
3033 Principles I Will Apply:
3041. FlatList with React.memo + useCallback for all lists
3052. 48px touch targets, thumb zone for primary CTAs
3063. Platform-specific navigation (edge swipe iOS, back button Android)
307
308Anti-Patterns I Will Avoid:
3091. ScrollView for lists → FlatList
3102. Inline renderItem → Memoized
3113. AsyncStorage for tokens → SecureStore
312```
313
314> 🔴 **Can't fill the checkpoint? → GO BACK AND READ THE SKILL FILES.**
315
316---
317
318## 🔧 Framework Decision Tree
319
320```
321WHAT ARE YOU BUILDING?
322 │
323 ├── Need OTA updates + rapid iteration + web team
324 │ └── ✅ React Native + Expo
325 │
326 ├── Need pixel-perfect custom UI + performance critical
327 │ └── ✅ Flutter
328 │
329 ├── Deep native features + single platform focus
330 │ ├── iOS only → SwiftUI
331 │ └── Android only → Kotlin + Jetpack Compose
332 │
333 ├── Existing RN codebase + new features
334 │ └── ✅ React Native (bare workflow)
335 │
336 └── Enterprise + existing Flutter codebase
337 └── ✅ Flutter
338```
339
340For complete decision trees: [decision-trees.md](decision-trees.md)
341
342---
343
344## 📋 Pre-Development Checklist
345
346### Before Starting ANY Mobile Project
347
348- [ ] **Platform confirmed?** (iOS / Android / Both)
349- [ ] **Framework chosen?** (RN / Flutter / Native)
350- [ ] **Navigation pattern decided?** (Tabs / Stack / Drawer)
351- [ ] **State management selected?** (Zustand / Redux / Riverpod / BLoC)
352- [ ] **Offline requirements known?**
353- [ ] **Deep linking planned from day one?**
354- [ ] **Target devices defined?** (Phone / Tablet / Both)
355
356### Before Every Screen
357
358- [ ] **Touch targets ≥ 44-48px?**
359- [ ] **Primary CTA in thumb zone?**
360- [ ] **Loading state exists?**
361- [ ] **Error state with retry exists?**
362- [ ] **Offline handling considered?**
363- [ ] **Platform conventions followed?**
364
365### Before Release
366
367- [ ] **console.log removed?**
368- [ ] **SecureStore for sensitive data?**
369- [ ] **SSL pinning enabled?**
370- [ ] **Lists optimized (memo, keyExtractor)?**
371- [ ] **Memory cleanup on unmount?**
372- [ ] **Tested on low-end devices?**
373- [ ] **Accessibility labels on all interactive elements?**
374
375---
376
377## 📚 Reference Files
378
379For deeper guidance on specific areas:
380
381| File | When to Use |
382|------|-------------|
383| [mobile-design-thinking.md](mobile-design-thinking.md) | **FIRST! Anti-memorization, forces context-based thinking** |
384| [touch-psychology.md](touch-psychology.md) | Understanding touch interaction, Fitts' Law, gesture design |
385| [mobile-performance.md](mobile-performance.md) | Optimizing RN/Flutter, 60fps, memory/battery |
386| [platform-ios.md](platform-ios.md) | iOS-specific design, HIG compliance |
387| [platform-android.md](platform-android.md) | Android-specific design, Material Design 3 |
388| [mobile-navigation.md](mobile-navigation.md) | Navigation patterns, deep linking |
389| [mobile-typography.md](mobile-typography.md) | Type scale, system fonts, accessibility |
390| [mobile-color-system.md](mobile-color-system.md) | OLED optimization, dark mode, battery |
391| [decision-trees.md](decision-trees.md) | Framework, state, storage decisions |
392
393---
394
395> **Remember:** Mobile users are impatient, interrupted, and using imprecise fingers on small screens. Design for the WORST conditions: bad network, one hand, bright sun, low battery. If it works there, it works everywhere.