🎯

mobile-app

🎯Skill

from popup-studio-ai/bkit-claude-code

VibeIndex|
What it does

Guides developers in creating cross-platform mobile apps using React Native, Flutter, and Expo frameworks for iOS and Android.

πŸ“¦

Part of

popup-studio-ai/bkit-claude-code(17 items)

mobile-app

Installation

npm installInstall npm package
npm install -g expo-cli
npxRun with npx
npx expo start
npm installInstall npm package
npm install -g eas-cli
πŸ“– Extracted from docs: popup-studio-ai/bkit-claude-code
3Installs
-
AddedFeb 4, 2026

Skill Details

SKILL.md

|

Overview

# Mobile App Development Expertise

Overview

A guide for developing mobile apps based on web development experience.

Develop for iOS and Android simultaneously using cross-platform frameworks.

---

Framework Selection Guide

Framework Selection by Tier (v1.3.0)

| Framework | Tier | Recommendation | Use Case |

|-----------|------|----------------|----------|

| React Native (Expo) | Tier 1 | ⭐ Primary | TypeScript ecosystem, AI tools |

| React Native CLI | Tier 1 | Recommended | Native module needs |

| Flutter | Tier 2 | Supported | Multi-platform (6 OS), performance |

> AI-Native Recommendation: React Native with TypeScript

> - Full Copilot/Claude support

> - Extensive npm ecosystem

> - 20:1 developer availability vs Dart

> Performance Recommendation: Flutter

> - Impeller rendering engine

> - Single codebase for 6 platforms

> - Smaller bundles

Level-wise Recommendations

```

Starter β†’ Expo (React Native) [Tier 1]

- Simple setup, can leverage web knowledge

- Full AI tool support

Dynamic β†’ Expo + EAS Build [Tier 1] or Flutter [Tier 2]

- Includes server integration, production build support

- Choose Flutter for multi-platform needs

Enterprise β†’ React Native CLI [Tier 1] or Flutter [Tier 2]

- Complex native features, performance optimization needed

- Flutter for consistent cross-platform UI

```

---

Expo (React Native) Guide

Project Creation

```bash

# Install Expo CLI

npm install -g expo-cli

# Create new project

npx create-expo-app my-app

cd my-app

# Start development server

npx expo start

```

Folder Structure

```

my-app/

β”œβ”€β”€ app/ # Expo Router pages

β”‚ β”œβ”€β”€ (tabs)/ # Tab navigation

β”‚ β”‚ β”œβ”€β”€ index.tsx # Home tab

β”‚ β”‚ β”œβ”€β”€ explore.tsx # Explore tab

β”‚ β”‚ └── _layout.tsx # Tab layout

β”‚ β”œβ”€β”€ _layout.tsx # Root layout

β”‚ └── +not-found.tsx # 404 page

β”œβ”€β”€ components/ # Reusable components

β”œβ”€β”€ hooks/ # Custom hooks

β”œβ”€β”€ constants/ # Constants

β”œβ”€β”€ assets/ # Images, fonts, etc.

β”œβ”€β”€ app.json # Expo configuration

└── package.json

```

Navigation Patterns

```typescript

// app/_layout.tsx - Stack navigation

import { Stack } from 'expo-router';

export default function RootLayout() {

return (

);

}

```

```typescript

// app/(tabs)/_layout.tsx - Tab navigation

import { Tabs } from 'expo-router';

import { Ionicons } from '@expo/vector-icons';

export default function TabLayout() {

return (

name="index"

options={{

title: 'Home',

tabBarIcon: ({ color }) => ,

}}

/>

name="profile"

options={{

title: 'Profile',

tabBarIcon: ({ color }) => ,

}}

/>

);

}

```

Styling Patterns

```typescript

// Basic StyleSheet

import { StyleSheet, View, Text } from 'react-native';

export function MyComponent() {

return (

Hello

);

}

const styles = StyleSheet.create({

container: {

flex: 1,

padding: 16,

backgroundColor: '#fff',

},

title: {

fontSize: 24,

fontWeight: 'bold',

},

});

```

```typescript

// NativeWind (Tailwind for RN) - Recommended

import { View, Text } from 'react-native';

export function MyComponent() {

return (

Hello

);

}

```

API Integration

```typescript

// hooks/useApi.ts

import { useState, useEffect } from 'react';

export function useApi(endpoint: string) {

const [data, setData] = useState(null);

const [loading, setLoading] = useState(true);

const [error, setError] = useState(null);

useEffect(() => {

const fetchData = async () => {

try {

const response = await fetch(${process.env.EXPO_PUBLIC_API_URL}${endpoint});

if (!response.ok) throw new Error('API Error');

const json = await response.json();

setData(json);

} catch (e) {

setError(e as Error);

} finally {

setLoading(false);

}

};

fetchData();

}, [endpoint]);

return { data, loading, error };

}

```

Authentication Pattern

```typescript

// context/AuthContext.tsx

import { createContext, useContext, useState, useEffect } from 'react';

import * as SecureStore from 'expo-secure-store';

interface AuthContextType {

user: User | null;

signIn: (email: string, password: string) => Promise;

signOut: () => Promise;

}

const AuthContext = createContext(null);

export function AuthProvider({ children }: { children: React.ReactNode }) {

const [user, setUser] = useState(null);

useEffect(() => {

// Check for stored token on app start

const loadToken = async () => {

const token = await SecureStore.getItemAsync('authToken');

if (token) {

// Load user info with token

}

};

loadToken();

}, []);

const signIn = async (email: string, password: string) => {

const response = await fetch('/api/auth/login', {

method: 'POST',

body: JSON.stringify({ email, password }),

});

const { token, user } = await response.json();

await SecureStore.setItemAsync('authToken', token);

setUser(user);

};

const signOut = async () => {

await SecureStore.deleteItemAsync('authToken');

setUser(null);

};

return (

{children}

);

}

export const useAuth = () => useContext(AuthContext)!;

```

---

Flutter Guide

Project Creation

```bash

# After installing Flutter SDK

flutter create my_app

cd my_app

# Start development server

flutter run

```

Folder Structure

```

my_app/

β”œβ”€β”€ lib/

β”‚ β”œβ”€β”€ main.dart # App entry point

β”‚ β”œβ”€β”€ app/

β”‚ β”‚ β”œβ”€β”€ app.dart # MaterialApp setup

β”‚ β”‚ └── routes.dart # Route definitions

β”‚ β”œβ”€β”€ features/ # Feature-based folders

β”‚ β”‚ β”œβ”€β”€ auth/

β”‚ β”‚ β”‚ β”œβ”€β”€ screens/

β”‚ β”‚ β”‚ β”œβ”€β”€ widgets/

β”‚ β”‚ β”‚ └── providers/

β”‚ β”‚ └── home/

β”‚ β”œβ”€β”€ shared/

β”‚ β”‚ β”œβ”€β”€ widgets/ # Common widgets

β”‚ β”‚ β”œβ”€β”€ services/ # API services

β”‚ β”‚ └── models/ # Data models

β”‚ └── core/

β”‚ β”œβ”€β”€ theme/ # Theme settings

β”‚ └── constants/ # Constants

β”œβ”€β”€ assets/ # Images, fonts

β”œβ”€β”€ pubspec.yaml # Dependency management

└── android/ & ios/ # Native code

```

Basic Widget Patterns

```dart

// lib/features/home/screens/home_screen.dart

import 'package:flutter/material.dart';

class HomeScreen extends StatelessWidget {

const HomeScreen({super.key});

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: const Text('Home'),

),

body: const Center(

child: Text('Hello, Flutter!'),

),

floatingActionButton: FloatingActionButton(

onPressed: () {},

child: const Icon(Icons.add),

),

);

}

}

```

State Management (Riverpod)

```dart

// lib/providers/counter_provider.dart

import 'package:flutter_riverpod/flutter_riverpod.dart';

final counterProvider = StateNotifierProvider((ref) {

return CounterNotifier();

});

class CounterNotifier extends StateNotifier {

CounterNotifier() : super(0);

void increment() => state++;

void decrement() => state--;

}

```

```dart

// Usage

class CounterScreen extends ConsumerWidget {

@override

Widget build(BuildContext context, WidgetRef ref) {

final count = ref.watch(counterProvider);

return Text('Count: $count');

}

}

```

---

Web vs Mobile Differences

UI/UX Differences

| Element | Web | Mobile |

|---------|-----|--------|

| Click | onClick | onPress |

| Scroll | overflow: scroll | ScrollView / FlatList |

| Input | input | TextInput |

| Links | a href | Link / navigation |

| Layout | div + CSS | View + StyleSheet |

Navigation Differences

```

Web: URL-based (browser back button)

Mobile: Stack-based (screen stacking)

Web: /users/123

Mobile: navigation.navigate('User', { id: 123 })

```

Storage Differences

```

Web: localStorage, sessionStorage, Cookie

Mobile: AsyncStorage, SecureStore, SQLite

⚠️ SecureStore is required for sensitive info on mobile!

```

---

Build & Deployment

Expo EAS Build

```bash

# Install EAS CLI

npm install -g eas-cli

# Login

eas login

# Configure build

eas build:configure

# iOS build

eas build --platform ios

# Android build

eas build --platform android

# Submit to stores

eas submit --platform ios

eas submit --platform android

```

Environment Variables

```json

// app.json

{

"expo": {

"extra": {

"apiUrl": "https://api.example.com"

}

}

}

```

```typescript

// Usage

import Constants from 'expo-constants';

const apiUrl = Constants.expoConfig?.extra?.apiUrl;

```

---

Mobile PDCA Checklist

Phase 1: Schema

```

β–‘ Identify data that needs offline caching

β–‘ Define sync conflict resolution strategy

```

Phase 3: Mockup

```

β–‘ Follow iOS/Android native UX guidelines

β–‘ Consider gestures (swipe, pinch, etc.)

β–‘ Layout for different screen sizes (phone, tablet)

```

Phase 6: UI

```

β–‘ Keyboard handling (screen adjustment during input)

β–‘ Safe Area handling (notch, home button area)

β–‘ Handle platform-specific UI differences

```

Phase 7: Security

```

β–‘ Store sensitive info with SecureStore

β–‘ Certificate Pinning (if needed)

β–‘ App obfuscation settings

```

Phase 9: Deployment

```

β–‘ Follow App Store review guidelines

β–‘ Prepare Privacy Policy URL

β–‘ Prepare screenshots, app description

```

---

Frequently Asked Questions

Q: Can I convert a web project to an app?

```

A: Recommend separate project over full conversion

- APIs can be shared

- UI needs to be rewritten (for native UX)

- Business logic can be shared

```

Q: Should I use Expo or React Native CLI?

```

A: Start with Expo!

- 90%+ of apps are sufficient with Expo

- Can eject later if needed

- Use CLI only when native modules are absolutely required

```

Q: How long does app review take?

```

A:

- iOS: 1-7 days (average 2-3 days)

- Android: Few hours ~ 3 days

⚠️ First submission has high rejection possibility β†’ Follow guidelines carefully!

```

---

Requesting from Claude

Project Creation

```

"Set up a [app description] app project with React Native + Expo.

Configure with 3 tab navigation (Home, Search, Profile)."

```

Screen Implementation

```

"Implement [screen name] screen.

  • Display [content] at the top
  • Display [list/form/etc.] in the middle
  • [Button/navigation] at the bottom"

```

API Integration

```

"Implement screen integrating with [API endpoint].

  • Show loading state
  • Handle errors
  • Support pull-to-refresh"

```