Core rule
A strong React Native prompt gives the AI four anchors: screens with their jobs, data shape, stack keywords, and visual tone. Skip any one and output drifts toward generic defaults.
The 5 ingredients of a strong React Native prompt
- One-sentence app definition. Audience + job in under 15 words. Gives the AI a North Star.
- Screen list with primary job per screen. Not a vision deck, a one-liner per screen.
- Data shape.Name the tables and the relationships. “Users, posts, comments; RLS by user_id.”
- Stack keywords.“Expo Router, Supabase, NativeWind, react-native-reanimated.”
- Visual tone. Theme, accent color, density, navigation type. Precise enough to decide, loose enough to let the AI create.
Stack keywords that actually steer output
These are the words that flip the AI into proper React Native mode rather than web patterns:
- Navigation:“Expo Router,” “native stack,” “bottom tabs,” “modal presentation”
- Styling:“NativeWind” or “StyleSheet” (pick one and commit, mixing confuses the AI)
- Data:“Supabase with row-level security,” “AsyncStorage for local state”
- Auth:“Clerk,” “Supabase Auth,” “Apple Sign In”
- Native features:“expo-notifications,” “expo-secure-store,” “react-native-maps”
- Animations:“Reanimated,” “Layout animations,” “gesture handler”
- Monetization:“RevenueCat,” “react-native-purchases,” “paywall after 7 days”
Before and after: the same idea, two prompts
Bad prompt:
I want to build a revolutionary habit tracker that helps people change their lives. It should be beautiful and modern. Include everything users would expect.
Good prompt:
Habit tracker for creative professionals. Screens (Expo Router, bottom tabs): - Home: habit list + streak, one-tap check-in - Add habit: form with name, emoji, reminder time - Stats: 30-day heatmap per habit - Settings: theme, paywall entry Data: AsyncStorage for local, Supabase for sync when signed in. Tables: habits, check_ins. Use NativeWind. Dark theme default, orange accent (#fb923c). No emojis in UI except the habit emojis themselves. Notifications via expo-notifications, daily at user-chosen time.
The first produces a generic mobile-web hybrid. The second produces a working Expo app on the first try in ShipNative or any competent AI app builder.
Anti-patterns that break AI output
- Vibe words.“Revolutionary,” “elegant,” “world-class” tell the AI nothing. Drop them.
- Too many screens. 8+ screens in one prompt almost always produces thin implementations. Ship 4, then iterate.
- Mixing platforms.“iOS + Android + Watch + web + CarPlay” in one prompt splits the model’s attention. Pick mobile first.
- Conflicting styling libs. Asking for NativeWind and StyleSheet and Tamagui simultaneously. Pick one.
- Leaving data undefined. Without a data shape, the AI generates mock arrays and fake users. Production-useless.
Iteration tactics that keep output clean
- Name the screen in every follow-up.“On Home, replace the list with a card grid.” Don’t say “the main page.”
- One change per message. Batched changes introduce more regressions.
- Re-state constraints when drifting.“Keep NativeWind, Expo Router,” if you notice the output reverting.
- Ask for diffs, not rewrites.“Only modify the Home screen” keeps other screens stable.
- Reset when stuck. If iteration is compounding damage, take the best output so far, write a new prompt from scratch with the learnings.
Common LLM failure modes in React Native
Each failure below has a symptom you can spot in the preview or the code, and a fix that belongs in the prompt rather than in a hand edit. If you fix the code by hand, the next generation brings the problem back.
- Web patterns sneaking in. Symptoms:
divinstead ofView,onClickinstead ofonPress,window.locationfor navigation. Fix: name “React Native” and “Expo Router” in the prompt. Models fall back to web React when the target is ambiguous. - Content under the notch or home indicator.Symptoms: headers clipped on newer iPhones, bottom buttons covered by Android gesture navigation. Fix: “respect safe areas” in the visual tone line, or name
react-native-safe-area-contextin the stack. - Inconsistent styling.Symptoms: half the screens use StyleSheet, half NativeWind, spacing that changes from screen to screen. Fix: pick one, name it in the first prompt, and repeat “only NativeWind” in follow-ups if drift appears.
- Missing platform behavior.Symptoms: no swipe-back on iOS, the Android back button does nothing, the keyboard covers the input you are typing in. Fix: ask for a “native stack” (not just “stack”), and add “keyboard must not cover inputs” to any prompt that includes a form.
- Broken navigation params. Symptoms: tapping a list item opens a detail screen that shows nothing because its ID is
undefined. Fix: include the route shape, for example “Profile detail at/profile/[id]receives a user ID”. - Placeholder data everywhere.Symptoms: “John Smith”, “Lorem ipsum”, “Item 1, Item 2”. Fix: name the data shape and give two or three realistic examples, or name the real data source so the AI writes a data layer instead of hardcoded arrays.
- Invented packages and stale APIs. Symptoms: imports of packages that do not exist, deprecated Expo APIs, install errors on first run. Fix: name the Expo SDK version you are on and the exact libraries you want. A mobile-specific builder that pins versions avoids most of this.
Is it the prompt or the tool?
Before rewriting a prompt for the fifth time, run a quick check:
- Write the prompt with all five ingredients above: definition, screens, data, stack, tone.
- Open the generated code, not just the preview, and note which failure modes from the list you see.
- Add the missing anchor for each one and regenerate.
- If the same failure survives a complete prompt twice, stop editing the prompt. The tool is the problem.
Web-first builders tend to produce web-flavored mobile code however good the prompt is. If that is what you keep seeing, compare React Native AI app builders or read why Lovable, Cursor, and v0 stop short on mobile.
The shortcut
Apps generated in ShipNative already run with mobile-native defaults, Expo Router, and proper state conventions baked in, so your prompts can focus on what the app does, not which library to use. For a structured starter, paste from The Best Prompts for Generating iOS Apps with AI.