Vibe code to app stores
React Native & Expo
3 min read
These guides walk through the full process of publishing a vibe-coded React Native or Expo app to the Google Play Store and the Apple App Store — covering tool setup, prebuild, signing, and store submission.
Lunadeck automates most of this pipeline (framework detection, builds, signing, and store upload), but these guides are useful if you want to understand what's happening under the hood, build locally before connecting to Lunadeck, or troubleshoot issues with your project.
What is React Native?
React Native apps are written in JavaScript or TypeScript but render native UI components — not a browser. Unlike Capacitor (which wraps your web app in a WebView), a React Native app looks and feels like a real native app. Buttons, scrolling, text inputs, and navigation all use the platform's own components.
Expo is a framework and set of tools built on top of React Native. Most AI-generated React Native projects use Expo because it significantly simplifies setup and configuration. The key Expo concept for building is prebuild: running npx expo prebuild generates the native android/ and ios/ project directories from your app.json, which you then compile normally with Gradle or Xcode.
Guides by operating system
| Platform | Stores covered | Status |
|---|---|---|
| Android on Linux | Google Play | Available |
| Android on Windows | Google Play | Available |
| Android & iOS on macOS | Google Play + App Store | Available |
iOS requires macOS. Building for the App Store is only possible on a Mac — Apple's toolchain (Xcode, codesigning, the iOS SDK) is macOS-only.
What you'll need
- Node.js 18 or newer
- Java JDK 17 and Android Studio (Android builds)
- Xcode 15 or newer (iOS builds, macOS only)
- A Google Play Developer account ($25 one-time) to publish Android apps
- An Apple Developer Program membership ($99/year) to publish iOS apps
- At least 12 GB of free disk space (more on macOS if building for both platforms)
Expo vs bare React Native
Expo managed workflow — your project has an app.json with an "expo" key and all dependencies come from the Expo SDK. Running npx expo prebuild generates the native project. This is what most AI-generated React Native projects use.
Bare React Native — your project has an android/ directory already committed to it. There is no prebuild step; you build directly. If your project has both android/ and an app.json, check package.json — if "expo" is in the dependencies, use the Expo workflow.
If you're not sure, open your package.json and look at "dependencies". If it contains "expo", follow the Expo path. If it contains "react-native" but not "expo", use the bare React Native path.