mobile-app

Installation
SKILL.md

Mobile App Skill

Cross-platform mobile development with React Native or Flutter.

Actions

Action Description Example
init Initialize mobile project $mobile-app init my-app
guide Mobile dev guide $mobile-app guide
help Platform-specific help $mobile-app help ios

Framework Comparison

Feature React Native (Expo) Flutter
Language TypeScript/JavaScript Dart
UI Native components Custom rendering
Hot Reload Yes Yes
Web Support Expo Web Flutter Web
Package Manager npm/yarn pub
Best For JS/TS teams, rapid MVP Custom UI, high performance

Recommended: Expo (React Native)

For bkit-codex users, Expo is recommended because:

  • Shares skills with web development (TypeScript, React)
  • Integrates with bkend.ai BaaS
  • Faster development cycle
  • No native build setup needed initially

Project Structure (Expo)

mobile-app/
├── app/                       # Expo Router (file-based routing)
│   ├── (tabs)/               # Tab navigation
│   │   ├── index.tsx         # Home tab
│   │   ├── explore.tsx       # Explore tab
│   │   └── profile.tsx       # Profile tab
│   ├── (auth)/               # Auth screens
│   │   ├── login.tsx
│   │   └── register.tsx
│   ├── _layout.tsx           # Root layout
│   └── +not-found.tsx        # 404 screen
├── components/                # Reusable components
│   ├── ui/                   # Basic UI components
│   └── features/             # Feature components
├── hooks/                     # Custom hooks
│   ├── useAuth.ts
│   └── useColorScheme.ts
├── lib/                       # Utilities
│   ├── api-client.ts         # API client
│   └── storage.ts            # AsyncStorage wrapper
├── stores/                    # State management
│   └── auth-store.ts
├── constants/                 # App constants
│   ├── Colors.ts
│   └── Layout.ts
├── assets/                    # Images, fonts
├── app.json                   # Expo config
├── package.json
└── tsconfig.json

Core Patterns

Navigation (Expo Router)

// app/_layout.tsx
import { Stack } from 'expo-router';

export default function RootLayout() {
  return (
    <Stack>
      <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
      <Stack.Screen name="(auth)" options={{ headerShown: false }} />
    </Stack>
  );
}

// app/(tabs)/_layout.tsx
import { Tabs } from 'expo-router';
import { Home, Search, User } from 'lucide-react-native';

export default function TabLayout() {
  return (
    <Tabs>
      <Tabs.Screen name="index" options={{ title: 'Home', tabBarIcon: ({color}) => <Home color={color} /> }} />
      <Tabs.Screen name="explore" options={{ title: 'Explore', tabBarIcon: ({color}) => <Search color={color} /> }} />
      <Tabs.Screen name="profile" options={{ title: 'Profile', tabBarIcon: ({color}) => <User color={color} /> }} />
    </Tabs>
  );
}

Secure Storage

// lib/storage.ts
import * as SecureStore from 'expo-secure-store';

export const storage = {
  async getToken(): Promise<string | null> {
    return SecureStore.getItemAsync('access_token');
  },
  async setToken(token: string): Promise<void> {
    await SecureStore.setItemAsync('access_token', token);
  },
  async removeToken(): Promise<void> {
    await SecureStore.deleteItemAsync('access_token');
  },
};

Platform-Specific Code

import { Platform, StyleSheet } from 'react-native';

const styles = StyleSheet.create({
  container: {
    paddingTop: Platform.OS === 'ios' ? 50 : 30,
    ...Platform.select({
      ios: { shadowColor: '#000', shadowOffset: { width: 0, height: 2 } },
      android: { elevation: 4 },
    }),
  },
});

Pipeline Integration

Mobile apps follow the same 9-phase pipeline with mobile-specific considerations:

  • Phase 3: Include mobile wireframes (320px, 375px, 414px widths)
  • Phase 5: Use React Native component patterns
  • Phase 6: Handle offline state and connectivity
  • Phase 9: App Store / Play Store submission

Build & Distribution

# Development
npx expo start

# Build for iOS
eas build --platform ios

# Build for Android
eas build --platform android

# Submit to stores
eas submit --platform ios
eas submit --platform android

Common Mistakes

Mistake Solution
Ignoring platform differences Test on both iOS and Android
Large bundle size Use lazy loading and code splitting
No offline handling Implement offline-first data layer
Hardcoded dimensions Use responsive sizing (Dimensions API)
Missing permissions Request permissions gracefully
Related skills
Installs
1
GitHub Stars
18
First Seen
Mar 29, 2026