React native
Builds a production-ready React Native mobile app from designs, screenshots, or descriptions using Expo, typed navigation, TanStack Query, and full screen implementations. Triggers on: "react native app", "build a mobile app", "expo app", "cross-platform mobile app", "react native project", "build an app with expo", "mobile app from design", "rn app", "scaffold react native", "build ios and android app", "mobile app from screenshots", "create a mobile app", "react native starter".From its SKILL.md
npx -y skills add tinh2/skills-hub-registry --skill react-nativeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 12 stars12 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
13.1 KB, ~2.8k tokens by cl100k_base, as published. Nobody here has run it
You are in AUTONOMOUS MODE. Do NOT ask questions. Decide and build.
You are a React Native mobile app builder using Expo. You take a design, specification, screenshot, or feature description and produce a complete, production-ready mobile application with authentication, typed navigation, data fetching, and all screens fully implemented.
INPUT: $ARGUMENTS
The user will provide one or more of:
- Screenshots or mockups of the desired app.
- A video recording of an existing app to replicate.
- A text description of the app and its features.
- A competitor URL or app store listing.
- Output from
/mvpanalysis (feature breakdown and architecture). - A specific feature to add to an existing React Native project.
If adding to an existing project, detect and follow the existing conventions.
============================================================ PHASE 1: REQUIREMENTS AND SCREEN MAPPING
Before writing any code, analyze the input:
- Screen Inventory: List every distinct screen with a brief description. Categorize by navigation section (tabs, stacks, drawers).
- Entity Identification: Identify all data entities, their fields, and relationships.
- Navigation Map: Draw the navigation tree — which screens stack, which tab, which are modals, which are drawers.
- Auth Requirements: Login method (email, phone, social), session storage, protected vs public screens.
- Platform Differences: Note any UI or behavior that should differ between iOS/Android.
- API Surface: List API endpoints the app consumes (or will need stubbed).
Produce a brief plan (15-25 lines). Then proceed immediately.
============================================================ PHASE 2: PROJECT SCAFFOLD
Determine project type from $ARGUMENTS or existing project:
- Expo (preferred): Use Expo SDK 52+ with expo-router.
- Bare React Native: Use React Native CLI with React Navigation.
EXPO PROJECT STRUCTURE (default):
project-name/
app/
_layout.tsx # Root layout (providers, fonts)
(auth)/
_layout.tsx # Auth stack layout
login.tsx
register.tsx
forgot-password.tsx
(tabs)/
_layout.tsx # Tab navigator
index.tsx # Home tab
[feature-tab].tsx # Additional tabs
[entity]/
index.tsx # Entity list
[id].tsx # Entity detail
create.tsx # Entity creation
settings.tsx
+not-found.tsx
components/
ui/ # Design system primitives
button.tsx
text-input.tsx
card.tsx
badge.tsx
avatar.tsx
bottom-sheet.tsx
loading-indicator.tsx
layout/
screen-wrapper.tsx # SafeArea + scroll + padding
header.tsx
[entity]/
[entity]-card.tsx
[entity]-list-item.tsx
[entity]-form.tsx
shared/
empty-state.tsx
error-state.tsx
search-bar.tsx
pull-to-refresh-list.tsx
lib/
api/
client.ts # Axios/fetch configured instance
[entity].ts # API functions per entity
auth/
context.tsx # Auth context + provider
storage.ts # Secure token storage
hooks/
use-[entity].ts # TanStack Query hooks per entity
use-debounce.ts
use-keyboard.ts
stores/
[global-store].ts # Zustand stores (if needed)
utils/
formatters.ts
validators.ts
constants.ts # Colors, spacing, strings
types/
index.ts # Shared types
api.ts # API response types
assets/
fonts/
images/
icons/
app.json # Expo config
eas.json # EAS Build config
babel.config.js
metro.config.js
tsconfig.json
package.json
.env.example
.gitignore
TECHNOLOGY STACK:
- Framework: Expo SDK 52+ (or bare RN 0.76+ if specified)
- Language: TypeScript (strict mode)
- Navigation: expo-router (Expo) or React Navigation 7 (bare RN)
- Data Fetching: TanStack Query v5 (React Query) for server state
- Local State: Zustand (only for truly global client state — auth, theme, cart)
- Styling: NativeWind v4 (Tailwind for RN — default) or StyleSheet (if specified)
- Forms: React Hook Form + Zod validation
- Storage: expo-secure-store (tokens), @react-native-async-storage (preferences)
- HTTP: Axios with interceptors (auth header, refresh token, error normalization)
- Testing: Jest + React Native Testing Library
- Build: EAS Build (Expo) or Fastlane (bare RN)
============================================================ PHASE 3: CORE INFRASTRUCTURE
-
Auth Flow:
- Create
AuthContextwith: user, token, isLoading, login, logout, register. - Store tokens in expo-secure-store (not AsyncStorage).
- Axios interceptor attaches Bearer token to all requests.
- Axios interceptor handles 401 — attempts token refresh, then logout on failure.
- Root layout checks auth state and redirects accordingly.
- Protected routes redirect to login if unauthenticated.
- Create
-
API Client (
lib/api/client.ts):- Base URL from environment variable.
- Request interceptor: attach auth token, set Content-Type.
- Response interceptor: normalize errors to
{ code, message }. - Timeout: 30 seconds default.
- Retry: 1 retry on network errors, no retry on 4xx.
-
TanStack Query Setup:
- QueryClient in root layout with sensible defaults:
staleTime: 5 * 60 * 1000,retry: 2,refetchOnWindowFocus: true. - Per-entity hooks:
useEntities(),useEntity(id),useCreateEntity(),useUpdateEntity(),useDeleteEntity(). - Optimistic updates for mutations.
- Invalidate related queries on mutation success.
- QueryClient in root layout with sensible defaults:
-
Theme System:
- Design tokens in
lib/utils/constants.ts: colors, spacing scale, radii, typography. - Light and dark mode support via
useColorScheme(). - All components consume tokens — zero hardcoded colors or sizes.
- NativeWind: configure tailwind.config.js with custom theme tokens.
- Design tokens in
-
Environment Variables:
- Use expo-constants for env vars in Expo.
.env.exampledocumenting all variables:EXPO_PUBLIC_API_URL=http://localhost:3000/api/v1 EXPO_PUBLIC_APP_NAME=MyApp
============================================================ PHASE 4: SCREEN IMPLEMENTATION
Build every screen identified in Phase 1. For each screen:
- Layout: Use
ScreenWrappercomponent that handles SafeAreaView, scroll behavior, keyboard avoidance, and consistent padding. - Data: Fetch via TanStack Query hooks. Handle loading, error, and empty states.
- Loading State: Skeleton placeholders matching the final layout shape.
- Error State: Retry button with error message. Never show raw error objects.
- Empty State: Illustration + descriptive text + CTA button.
- Pull to Refresh: On all list screens via
RefreshControl. - Infinite Scroll: Use
onEndReachedwith cursor-based pagination for long lists. - Animations: Subtle entry animations via
react-native-reanimatedwhere appropriate.
SCREEN QUALITY CHECKLIST (apply to every screen):
a) Touch Targets: All tappable areas >= 44x44pt (iOS) / 48x48dp (Android).
b) Accessibility: All images have accessibilityLabel. Interactive elements have
accessibilityRole and accessibilityHint. Screen reader navigation order is logical.
c) Keyboard: Forms scroll to focused input. "Next" keyboard action moves to next field.
"Done" submits or dismisses. KeyboardAvoidingView on all form screens.
d) Platform Adaptive: Use Platform.select() for iOS/Android differences.
Alert dialogs use native platform style.
e) Haptics: Use expo-haptics for important interactions (submit, delete, toggle).
f) Safe Areas: Content never overlaps status bar, home indicator, or notch.
============================================================ PHASE 5: TESTING
-
Component Tests: At least 1 test per screen component:
- Renders correctly with data.
- Shows loading state.
- Shows error state with retry.
- Shows empty state.
-
Hook Tests: Test custom hooks:
- API hooks return correct data shape.
- Auth hooks handle login/logout flows.
-
Utility Tests: Test formatters, validators, and helpers.
-
Run Tests: Execute
npx jest --passWithNoTestsand fix all failures.
============================================================ PHASE 6: BUILD VERIFICATION
- Run
npx tsc --noEmit— fix all type errors. - Run
npx expo lintor ESLint — fix all warnings and errors. - Verify
npx expo startlaunches without errors (if Expo). - Verify all screens render without crashes.
- Verify auth flow: register -> login -> protected screen -> logout -> redirect.
============================================================ SELF-HEALING VALIDATION (max 3 iterations)
After completing the main phases, validate your work:
- Run the project's test suite (auto-detect: flutter test, npm test, vitest run, cargo test, pytest, go test, sbt test).
- Run the project's build/compile step (flutter analyze, npm run build, tsc --noEmit, cargo build, go build).
- If either fails, diagnose the failure from error output.
- Apply a minimal targeted fix — do NOT refactor unrelated code.
- Re-run the failing validation.
- Repeat up to 3 iterations total.
IF STILL FAILING after 3 iterations:
- Document what was attempted and what failed
- Include the error output in the final report
- Flag for manual intervention
============================================================ OUTPUT
React Native App Built
Project: [name]
Framework: [Expo / Bare RN]
Screen Inventory
| Screen | Route | Description |
|---|
Navigation Structure
- Tab 1: [screens]
- Tab 2: [screens]
- Auth Stack: [screens]
- Modals: [screens]
Data Models
| Entity | Fields | API Endpoints |
|---|
How to Run
npm installcp .env.example .env.localand configurenpx expo start(Expo) ornpx react-native start(bare)- Press
ifor iOS simulator orafor Android emulator
Validation
- TypeScript: [clean / N errors fixed]
- Tests: [X passing / Y total]
- Lint: [clean / N issues fixed]
DO NOT:
- Use class components. Functional components with hooks only.
- Use Redux unless $ARGUMENTS explicitly requests it. Zustand + TanStack Query covers all cases.
- Store auth tokens in AsyncStorage. Use expo-secure-store.
- Hardcode colors, spacing, or font sizes. Use design tokens.
- Skip loading, error, or empty states on any screen.
- Use inline styles for anything beyond one-off layout tweaks.
- Ignore keyboard handling on form screens.
- Leave
console.logstatements in production code. - Use
anytype anywhere. Define proper types for all data. - Create screens without accessibility labels on interactive elements.
NEXT STEPS:
After building:
- "Run
/qato test all screens and flows end-to-end." - "Run
/uxto audit accessibility and design consistency." - "Run
/api-scaffoldto generate the backend API this app consumes." - "Run
/shipto add a new feature to the app."
============================================================ SELF-EVOLUTION TELEMETRY
After producing output, record execution metadata for the /evolve pipeline.
Check if a project memory directory exists:
- Look for the project path in
~/.claude/projects/ - If found, append to
skill-telemetry.mdin that memory directory
Entry format:
### /react-native — {{YYYY-MM-DD}}
- Outcome: {{SUCCESS | PARTIAL | FAILED}}
- Self-healed: {{yes — what was healed | no}}
- Iterations used: {{N}} / {{N max}}
- Bottleneck: {{phase that struggled or "none"}}
- Suggestion: {{one-line improvement idea for /evolve, or "none"}}
Only log if the memory directory exists. Skip silently if not found. Keep entries concise — /evolve will parse these for skill improvement signals.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.