Build One App for iPhone & Android With Claude Code
Build a real mobile app with Claude Code from one React Native codebase, run the same project on iPhone and Android, and test everything on real devices without publishing to the app stores.
Roadmap & Resources
Set Up Claude Code & Expo
What This Guide Uses
For this guide, we will use:
- Claude Code
- React Native
- Expo
- Expo Go
Expo makes it much easier to build one React Native project that runs on both iOS and Android. Expo's own documentation describes this as a universal Android/iOS project, while React Native renders using native platform UI.
Open Expo Documentation
https://docs.expo.dev/
What You Need
Make sure you have:
A Mac, Windows, or Linux computer
Node.js LTS
Claude Code
Expo Go installed on your phone
For the easiest demonstration, install Expo Go on both an iPhone and an Android phone if available.
NOTE
If you only have one physical device, you can use a simulator/emulator for the other platform, although Expo recommends real devices for the simplest development experience.
Install the Official Expo Plugin for Claude Code
Expo now provides an official Claude Code plugin. Run:
claude plugin install expo@claude-plugins-official
The plugin gives Claude Expo-specific skills and connects it with Expo's current development guidance.
Create the Project
Create an empty folder and open it in VS Code. For example: HabitFlow. Open Claude Code inside the project. Then use:
Create the Expo Project
Creates a new Expo React Native app configured for a beginner-friendly app that runs on both iPhone and Android — first checking current Expo documentation for the SDK version compatible with the current Expo Go app rather than guessing or using an outdated one. Requires TypeScript, the standard current Expo project structure, one shared iOS/Android codebase, and Expo Go compatibility. Forbids Firebase, Supabase, authentication, a backend, native modules requiring a custom dev build, unnecessary packages, and App Store/Google Play configuration. Does not start the dev server yet, explains the project structure, and finishes with a READY / NOT READY verdict.
Create a new Expo React Native app in this folder for a beginner-friendly mobile app that will run on both iPhone and Android. Before creating the project, use the current Expo documentation available to you to determine the Expo SDK version that is compatible with the current Expo Go app. Do not guess or use an outdated SDK just because it appears in an old tutorial. Requirements: - use Expo - use React Native - use TypeScript - use the standard current Expo project structure - keep one shared codebase for iOS and Android - configure the project so I can test it with Expo Go - use the official Expo conventions already supported by the project Do not: - add Firebase - add Supabase - add authentication - add a backend - add native modules that require a custom development build - add unnecessary packages - configure App Store or Google Play publishing Do not start the development server yet. When finished, explain the project structure briefly. Finish with: Expo project: READY / NOT READY
NOTE
Expo's current AI tutorial explicitly teaches users to have an AI coding agent create the Expo project and then run it directly on a phone.
Build the Mobile App With Claude Code
Decide What the App Does
For this Guide, build a simple Daily Habit Tracker. The app should let the user:
- Add habits
- See today's habits
- Mark habits complete
- See daily progress
- Delete a habit
- Close and reopen the app without losing the habits
This is enough to prove that we built a real useful mobile app without introducing a backend.
Build HabitFlow
Use:
Build the HabitFlow App
Builds a complete daily habit tracker on the existing Expo + React Native project, shared across iOS and Android: a Today screen with date, habit list, completion states, daily progress and an Add Habit button; adding and deleting habits (with delete confirmation); local on-device persistence of habits and today's completion state with no database or backend. Requires clean modern mobile design (touch targets, safe areas, keyboard behavior, native-feeling interactions) and shared cross-platform code, with platform-specific logic kept small and justified. Forbids login, cloud sync, notifications, subscriptions, payments, social features, analytics, an API, or heavy state-management libraries. Checks TypeScript, runtime issues, and Expo Go compatibility; never publishes. Finishes with a READY / NOT READY verdict and a summary of files/features created.
Build a complete simple mobile app called: HabitFlow This is a daily habit tracker. Use the existing Expo + React Native project. The same application should run from one shared codebase on both iPhone and Android. Core Features Today Show: - today's date - list of habits - completion state for each habit - daily progress such as 2 of 4 completed - Add Habit button The user should be able to tap a habit to mark it: - Complete - Not Complete Add Habit Let the user enter: - habit name Examples: - Drink Water - Read 20 Minutes - Exercise - Practice Spanish Keep the form simple. Delete Habit Let the user delete a habit. Ask for confirmation before deleting. Local Storage Persist: - habits - today's completion state locally on the device. Use the appropriate Expo-compatible local storage solution. Do not add a database or external backend. Design Create a clean modern mobile interface. Requirements: - clear visual hierarchy - comfortable spacing - large touch targets - readable typography - clear completed/uncompleted states - proper safe-area handling - responsive to normal phone sizes - good keyboard behavior - native-feeling interactions Keep the design simple and professional. Cross-Platform Requirements The same source code should work on: - iOS - Android Prefer shared React Native components and logic. Do not create separate iPhone and Android implementations unless a genuine platform-specific adjustment is required. If platform-specific behavior is necessary, keep it small and explain why. Do not: - add login/signup - add cloud sync - add notifications - add subscriptions - add payments - add social features - add analytics - add an API - add a complicated state-management library After implementation: - check TypeScript - check for runtime problems - verify dependencies are compatible with Expo Go Do not publish or build an App Store version. Finish with: HabitFlow implementation: READY / NOT READY Then summarize the main files and features created.
Keep the Data on the Phone
For this simple app, local persistence is enough.
Local storage package
@react-native-async-storage/async-storage
This package provides persistent key-value storage on both Android and iOS and is currently included in Expo Go.
Add habit → close app → reopen → habit is still there — without creating a backend.
Run the Same App on iPhone & Android
Start Expo
Open the VS Code terminal inside the project and run:
npx expo start
Expo displays a QR code.
Expo's official workflow uses this exact development loop.
Run It on iPhone
On iPhone:
Install Expo Go from the App Store. Make sure the phone and computer are on the same Wi-Fi network. Open the normal iPhone Camera. Scan the QR code. Open the project in Expo Go.
The HabitFlow app should appear on the iPhone.
Expo officially supports opening the development project this way on iOS.
Test the iPhone Version
Try:
Add Drink Water Add Read 20 Minutes Mark one habit complete. Confirm progress updates. Close and reopen the app. Confirm the habits remain.
Run the Same Project on Android
Do not create another Android project. Keep the same development server and the same source code. On the Android phone:
Install Expo Go from Google Play. Open Expo Go. Choose Scan QR Code. Scan the same project's QR code.
The same HabitFlow app should open on Android. Now perform the same test:
Add a habit Complete it Delete it Reopen the app Verify local persistence
The Important Result
You now have: One project → iPhone and Android.
You did not build one Swift app and another Kotlin app.
React Native lets the shared JavaScript/TypeScript application render through native platform UI on Android and iOS.
If the Phone Cannot Connect
First make sure the computer and phone are on the same Wi-Fi. If that still fails, Expo's official fallback is:
npx expo start --tunnel
This allows the phone to connect through a tunnel instead of relying only on the local network.
Fix Cross-Platform Problems & Finish the App
Why This Matters
The same codebase does not mean every pixel will always behave identically. iOS and Android differ in things such as:
- Safe areas
- Keyboards
- Status bars
- Fonts
- System dialogs
- Touch behavior
So perform one final cross-platform check.
Run the Cross-Platform Review
Use:
Review Cross-Platform Quality
Reviews HabitFlow specifically for cross-platform quality without adding new features — layout (safe areas, spacing, text wrapping, buttons, list/form layout, keyboard interaction), iOS-specific behavior (status area, inputs, confirmation dialogs, scrolling), Android-specific behavior (system UI, keyboard, tap targets, dialogs, scrolling), and functionality (add/complete/delete, progress, local persistence). Prefers shared code, keeps platform-specific logic minimal, never creates separate apps or duplicated screens, fixes only genuine issues, and runs the relevant Expo/TypeScript checks. Finishes with a READY / NOT READY verdict.
Review the HabitFlow app specifically for cross-platform quality. The goal is to preserve one shared React Native codebase while making the app work correctly on both iOS and Android. Do not add new features. Check: Layout - safe areas - top and bottom spacing - text wrapping - buttons - list spacing - form layout - keyboard interaction iOS - no content overlaps the status area - inputs work correctly - confirmation dialogs work - scrolling feels correct Android - no content overlaps system UI - keyboard behavior works - buttons remain easy to tap - confirmation dialogs work - scrolling works correctly Functionality - adding a habit works - completing/uncompleting works - progress updates correctly - deleting works - local persistence works - reopening the app restores the correct data Prefer shared code. Add platform-specific logic only where genuinely necessary. Do not: - create separate apps - duplicate entire screens for iOS and Android - add a backend - add authentication - add new functionality Fix only genuine issues. Afterward, run the relevant Expo/TypeScript checks. Finish with: Cross-platform status: READY / NOT READY If NOT READY, list only what remains broken.
Final Visual Polish
Once both platforms work:
Polish the HabitFlow Interface
Polishes typography, spacing, habit-row readability, completion states, the Add Habit form, progress presentation, the empty state, and touch targets without expanding the app — no charts, gamification, login, notifications, backend features, additional screens, or complicated animations, and identical core functionality preserved on both platforms. Finishes with a READY / NOT READY verdict.
Polish the existing HabitFlow interface without expanding the app. Improve only: - typography - spacing - habit-row readability - completion states - Add Habit form - progress presentation - empty state - mobile touch targets Keep the visual design clean and native-feeling. Do not add: - charts - gamification - login - notifications - backend features - additional screens - complicated animations Preserve identical core functionality on iOS and Android. Finish with: UI status: READY / NOT READY
Final Test
Test Both Platforms
Before finishing the Guide, run this same workflow on both platforms.
iPhone
Run this sequence:
Open app Create two habits Complete one Confirm progress Delete one Restart app Verify persistence
Android
Repeat exactly the same actions.
Make One Small Change
Then make one small change with Claude Code:
Change the Empty-State Text
Changes the empty-state text to "Add your first habit to get started." and makes only this one change.
Change the empty-state text to: Add your first habit to get started. Make only this change.
Watch the update appear during development.
Expo's official AI tutorial describes this exact loop as: prompt → agent builds → phone shows the result.
Run the Final Audit
Use:
Final HabitFlow Audit
Runs a final audit of HabitFlow verifying it is built from one Expo/React Native project with code shared between iOS and Android, launches successfully on both platforms, and that adding, completing, deleting, and local persistence all work — no important TypeScript errors, no unsupported Expo Go dependency, no database/backend, and no unnecessary separate native project. Adds no new features and configures no store publishing. Finishes with a READY / NOT READY verdict.
Run one final audit of HabitFlow. Verify: - the app is built from one Expo/React Native project - the core code is shared between iOS and Android - the app launches successfully on iPhone - the app launches successfully on Android - Add Habit works - completion tracking works - progress calculation works - deleting works - data persists locally - there are no important TypeScript errors - no unsupported Expo Go dependency was introduced - no database or backend was introduced - no separate native iOS or Android project was unnecessarily created Do not add new features. Do not configure App Store or Google Play publishing. Finish with: Mobile app status: READY / NOT READY If NOT READY, list only the remaining important problems.
Important — Expo Go Is for Development
Expo Go Is for Development
For this Guide, Expo Go is intentionally used to make testing extremely easy. Expo describes Expo Go as a fast environment for learning and experimenting. Production projects that need custom native modules or standalone distribution normally move later to a development build and eventually a production build.
So completing this Guide does not mean the app has been published to:
- Apple App Store
- Google Play
RESULT
You built one real React Native mobile project with Claude Code and successfully ran the same app on both iPhone and Android.
Publishing is a separate, more advanced process.
The Complete Workflow
Summary
Claude Code → Expo + React Native → Build HabitFlow → npx expo start → iPhone → Android → same codebase