Expo previews
An Expo web preview renders your project’s web target. An iOS simulator preview runs the native iOS build, which is the useful choice when you need to check native navigation, platform-specific layout, or a native module’s UI.
Choose a preview build or a development build
For someone to review your app independently, use a simulator build that includes its JavaScript bundle. For editing your own code with Fast Refresh, use a debug build connected to Metro.
Expo Go is a separate development app with a fixed set of native libraries. Your own development build includes your project’s native dependencies. Expo explains that distinction in its development-build introduction. The upload workflow below uses a build of your app.
Build a standalone simulator preview with EAS
You need an Expo project already configured for EAS Build and access to its Expo account. In eas.json, add this profile inside the existing build object, preserving your other profiles:
{
"build": {
"browser-preview": {
"developmentClient": false,
"ios": {
"simulator": true,
"buildConfiguration": "Release"
}
}
}
}
The profile requests a release simulator build for an independent preview. Expo documents these fields in the EAS configuration reference. Check any project-specific build scripts and environment settings too: they must produce an app that can run without your local development server.
Build it using EAS CLI:
eas build --platform ios --profile browser-preview
Download the completed simulator artifact from the build result. Skip any prompt to install it on a local simulator when working on Windows or Linux. The simulator artifact contains a .app bundle; a device .ipa is not suitable. Expo’s simulator-build reference documents the simulator profile setting.
Or build through VibeView
If you want the build to appear directly in your VibeView app library, run these commands from your Expo project:
npm install -g vibeview
vibeview login
vibeview build --cloud --platform ios
The first build asks for its build command and artifact path. For managed Expo projects, the suggested command installs dependencies, generates the native project, and compiles it. Review it before continuing; projects with dynamic Expo configuration may need a custom command.
That first build is the development profile: a debug build for live development with Metro. When you take the suggested command, the CLI also saves a preview profile in vibeview.json, the same simulator build in Release with the JavaScript inside, which runs without Metro. Build that one for an independent preview:
vibeview build --cloud --platform ios --profile preview
If you wrote your own command, add a preview profile with a Release simulator command and its artifact path; Build profiles shows the shape. The .app must target the simulator even when its configuration is Release; --profile production produces a signed device build instead.
Upload and run the preview
- Open Apps in VibeView and choose Upload app. Upload the simulator
.appor its supported archive. If you built through VibeView, use the app attached to the completed build. - Click Play on the app row. On the Devices page, select an available iOS simulator and click Start session.
- Wait for the app to install and launch, then check a native screen and complete a navigation flow.
- Close your local Metro process, if one was running, and check that the standalone preview still opens and works. This is the check to perform before sending a review link.
For the upload formats and session walkthrough, see Upload and Test an iOS Build in the Browser.
Use Fast Refresh while developing
Use a matching debug simulator build for this workflow. Start Metro from that source project and leave it running:
npx expo start
In a second terminal in the same project, run:
vibeview dev --platform ios
The CLI reuses the saved app or asks you to select an uploaded debug app. If a previous cloud build created vibeview.json, Metro setup may not be prompted again; starting Metro in the first terminal covers that case. On Windows or Linux, reuse the existing cloud build rather than asking the CLI to compile iOS locally. Change a visible label, save, and check the streamed app for the update.
A release preview will not become a development build just because Metro is running. Rebuild when changing native dependencies, and keep the debug build aligned with the source you are editing. The live-development guide covers bundler setup and session shutdown.
Troubleshooting the handoff
The upload is rejected. Confirm that the EAS profile has ios.simulator: true and that you downloaded that profile’s artifact. A successful store build is still the wrong target for a simulator.
The app waits for Metro. For a review, rebuild with bundled JavaScript. For development, connect your debug build using vibeview dev.
A native module is missing after an edit. JavaScript refresh cannot install new native code. Produce a new simulator build containing that dependency.
The preview works for me but not a reviewer. Check the build selected on the share link, whether the app needs your Metro process, and whether its backend is reachable from the remote simulator.
Once the independent preview works, create an iOS app review link. Reviewers can open it in their browser; use physical iPhone testing for hardware-dependent behavior before release.
Frequently asked questions
Can I preview an Expo app on iOS without a Mac at all?
Yes. The iOS compile still happens on macOS, but not on yours: EAS Build and VibeView cloud builds both run it on a hosted Mac and hand back a simulator .app. Uploading and running that build needs only a browser, so the whole loop works from Windows or Linux.
Can I use Expo Go instead of building my own app? Not for this workflow. Expo Go is a separate app with a fixed set of native libraries, and the preview here runs a build of your app, including its own native dependencies. A development build of your project gives you the same Fast Refresh loop with the right native code.
Do I need EAS?
No. EAS is one way to get a simulator .app; a cloud build from the VibeView CLI or a simulator build from any Mac or macOS CI runner works the same way once uploaded.
Will Fast Refresh work in the browser preview?
Yes, with a debug simulator build connected to Metro on your machine through vibeview dev. A release build with bundled JavaScript is for independent previews and does not hot-reload; rebuild it when the code changes.
Is the browser preview a substitute for testing on an iPhone? No. It runs the same simulator Xcode does, so it covers layout, navigation and app logic, but not camera, Bluetooth, push delivery or real performance. Keep a physical-device pass before release.
Try it on your own build
The free tier takes no card: two concurrent sessions, 30 streaming minutes a month in sessions of up to five minutes, and a monthly allowance of cloud build minutes. That is enough to put your current Expo build on a streamed iPhone this afternoon and find out whether the loop works for you.
Related guides
In the documentation
Try it yourself
Open a live iOS simulator, Android emulator, Apple TV, Android TV or Roku in your browser.
Start free