> For the complete documentation index, see [llms.txt](https://manual.bubble.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://manual.bubble.io/help-guides/previewing-your-app/previewing-a-mobile-app.md).

# Previewing a mobile app

{% hint style="info" icon="mobile-button" %}
This section describes previewing **mobile apps**. If you're looking for documentation on previewing **web apps**, see the article below:

Article: [Previewing a web app](/help-guides/previewing-your-app/previewing-a-web-app.md)
{% endhint %}

{% hint style="danger" %}
BubbleGo is being deprecated as a preview option and is no longer being updated. Because of this, it won't reflect features added to Bubble going forward, so what you see in BubbleGo may not match your app. To preview reliably, use [simulated device](#simulated-device) or a [dev build](#dev-build) instead.
{% endhint %}

Previewing your app works much like the Bubble web app editor, letting you see and test changes as you make them. Keep in mind that some parts of the native mobile app editor rely on built-in features of mobile devices, which can vary between iOS and Android. As a result, not every element displays accurately in web preview. Simulated device closes most of that gap.

There are four ways to preview your app:

<table><thead><tr><th width="130">Method</th><th>Where it runs</th><th>Plugins</th><th>What you need</th><th>Best for</th></tr></thead><tbody><tr><td><a href="#web-preview">Web preview</a></td><td>Your browser, in the editor</td><td>Shows a "can't render this" message</td><td>Nothing</td><td>Quick iteration on layout and logic</td></tr><tr><td><a href="#simulated-device">Simulated device</a></td><td>Your browser, on a simulated device</td><td>All, including those with third-party native libraries</td><td>Nothing</td><td>Checking native elements and plugin behavior without a device</td></tr><tr><td><a href="#bubblego">BubbleGo</a></td><td>Your device, in the BubbleGo app</td><td>React Native and a few third-party libraries already installed by Bubble</td><td>The BubbleGo app</td><td>Getting a feel for the app on a device</td></tr><tr><td><a href="#dev-build">Dev build</a></td><td>Your device, as your own app</td><td>All, including those with third-party native libraries</td><td>An App Store and Google Play connection</td><td>Testing native features like push notifications and deep linking</td></tr></tbody></table>

Web preview and simulated device both run in the editor. Switch between them with the preview mode dropdown at the left of the bar above the preview.

## Web preview

### Differences from web app preview

Web preview works mostly like the preview in the Bubble web app editor, with a few key differences:

* There's no [update banner](#user-content-fn-1)[^1] in the preview when changes have been made to the app
* There's an extended bar for managing how the app will look across different devices (see below)

### Current web preview limitations

There are currently a few limitations in web preview:

* **Native maps element will not render** — use [simulated device](#simulated-device)
* **Native datetime picker will not render** — use [simulated device](#simulated-device)
* **Plugins with their own third-party native libraries will not load** — use [simulated device](#simulated-device)
* **Permissions request workflows may not work properly** — use [simulated device](#simulated-device)
* **Camera workflows will not work properly** — use a [dev build](#dev-build)
* **Push notifications cannot be sent to web preview** — use a [dev build](#dev-build)
* **Multi-line inputs in floating groups will not expand to fit height**

### Device emulator bar

<figure><img src="https://34394582-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5sbzwG7CljeZdkntrL%2Fuploads%2FkIKEsRkjPkxnss1o73rf%2Femulator-bar.png?alt=media&amp;token=7f42fda3-f2d1-4ab2-9b47-2bf51916b2e0" alt=""><figcaption></figcaption></figure>

The bar at the top of the screen lets you emulate how the app will look on different devices, screen sizes, and with a specific zoom level.

1. **Show device frame**: Shows or hides the frame of the selected device (the frame, buttons, and notch, camera, or sensors of the device selected in setting 2).
2. **Select device**: Provides a list of widely used devices to emulate how the app will look and behave on that specific device.
3. **Screen size (px):** The actual screen size of the selected device. This is a locked field and updates according to the device selected in setting 2.
4. **Zoom level**: Zooms the emulator to a specific percentage or to fit the screen height. This zoom affects the entire emulated device, not just the screen.

We recommend testing your app across all devices, so it looks and works the way you expect everywhere.

## Simulated device

Simulated device runs your app on a simulated iOS or Android device, streamed into your browser. Unlike web preview, which renders your app in the browser, the simulator runs a real build of your app, so native elements and plugins that rely on their own third-party native libraries work the way they will on a device.

Use simulated device to check anything web preview can't render, without needing a physical device or an App Store or Google Play connection.

Web preview is still the fastest way to iterate on layout and logic, and it's the only place you can inspect and debug. Switch to simulated device when you need to confirm that native behavior is correct.

### Switching to simulated device

{% stepper %}
{% step %}

#### Open preview

Open preview for your mobile app.
{% endstep %}

{% step %}

#### Open the preview mode dropdown

In the bar at the top, open the preview mode dropdown.
{% endstep %}

{% step %}

#### Select Simulated device

Choose **Simulated device**. If your app has plugins that need a real build, Bubble also prompts you in web preview with a tooltip.
{% endstep %}
{% endstepper %}

### Current simulated device limitations

The simulator runs a real build of your app, but it runs it in the cloud, so anything that depends on physical hardware won't work:

* **Camera workflows will not work properly** — use a [dev build](#dev-build)
* **Push notifications cannot be sent to the simulator** — use a [dev build](#dev-build)
* **Device sensors will not report real data** — use a [dev build](#dev-build)
* **Inspect and debug are not available in simulated device** — use [web preview](#web-preview)

### When you need a new build

Most changes reach the simulator instantly, but some are baked into the build itself:

* Adding or updating plugins that use third-party native libraries
* Changing native device permissions
* Bubble updates to its internal mobile engine

When one of these happens, a **Rebuild** button appears in the top-right corner of the simulator, along with a message telling you which change caused it: that you added a plugin since the last build, that you changed a setting that affects native configuration, or that Bubble made an update.

Click **Rebuild** to start the build. Building can take up to 10 minutes, and you can keep working in the editor while it runs. The button shows *Building* while the build is in progress, and *Up to date* once you're on the latest build. Until the rebuild finishes, the simulator keeps running the previous build, so what you see may not match your current settings.

If you don't see a **Rebuild** button, your simulator is already running the current build.

### Testing on your own device

The simulator includes a *Test on your own device* panel, which is your path from previewing in the browser to testing on real hardware. From here you can create a dev build, or connect your app to App Store Connect and Google Play if you haven't yet.

Use this when you've confirmed native behavior in the simulator and want to try your app on a physical device, either through a [dev build](#dev-build) or [BubbleGo](#bubblego).

## BubbleGo

{% hint style="danger" %}
BubbleGo is being deprecated as a preview option and is no longer being updated. Because of this, it won't reflect features added to Bubble going forward, so what you see in BubbleGo may not match your app. To preview reliably, use [simulated device](#simulated-device) or a [dev build](#dev-build) instead.
{% endhint %}

BubbleGo is a native mobile app that lets you load and interact with your mobile app directly on your device. This mimics the experience of having the app installed on your phone, without needing to connect your project or publish it to the app store.

Use BubbleGo to get a feel for how your users will actually use your app, and to test more advanced interactions, flows, and system connections.

{% hint style="info" %}
BubbleGo can't send push notifications, and it can't run plugins that rely on their own third-party native libraries. To test those plugins, use simulated device or a dev build. To test push notifications, use a dev build.
{% endhint %}

### Accessing BubbleGo for iOS

{% hint style="info" %}
In BubbleGo for iOS, you can refresh your app by shaking your iPhone.
{% endhint %}

{% stepper %}
{% step %}

#### Download TestFlight

Download the TestFlight app from the App Store.
{% endstep %}

{% step %}

#### Open the BubbleGo link

Click on [this link](https://testflight.apple.com/join/uXuOrE3v).
{% endstep %}

{% step %}

#### Download BubbleGo

Follow the link to download BubbleGo onto the TestFlight app.
{% endstep %}

{% step %}

#### Log in

Log into BubbleGo using your Bubble account credentials.
{% endstep %}

{% step %}

#### Select your app

Select the mobile app you'd like to test and go.
{% endstep %}
{% endstepper %}

### Accessing BubbleGo for Android

{% stepper %}
{% step %}

#### Download BubbleGo

Download the app from the Google Play Store, using either the [mobile link](https://play.google.com/store/apps/details?id=com.bubble.BubbleGo1) or the [computer link](https://play.google.com/apps/testing/com.bubble.BubbleGo1).
{% endstep %}

{% step %}

#### Log in

Log into BubbleGo using your Bubble account credentials.
{% endstep %}

{% step %}

#### Select your app

Select the mobile app you'd like to test and go.
{% endstep %}
{% endstepper %}

## Dev build

A dev build is a version of your native mobile app that you install on your own device for testing. It looks and behaves like your real app, with your icon, your branding, and your plugins, but it stays synced with the Bubble editor, so changes appear on your phone right away. This lets you test your app the way your users will experience it, without publishing to the app stores.

Because a dev build is compiled from your app specifically, it also uses your app's own URL scheme for deep linking and universal links, and runs against your app's real push notification configuration.

### Dev builds vs. production builds

A production build is pinned to one version of your app. To ship changes, you create a new build and release it through the app stores. A dev build works differently: it stays synced with the editor, so you rarely need a new one. Create it once, install it on your device, and keep testing as your app evolves.

Dev builds use the same bundle ID and package name as your production app, so push notifications and plugins run against your app's real configuration. This also means your dev build appears alongside production builds in TestFlight or the Google Play Console. To help you tell them apart, a dev build has a modified app icon and launch screen.

|                           | Dev build                                                                                                                                                                                                                                                   | Production build                                                                                                                                                                                                       |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| App version               | Any of your development branches                                                                                                                                                                                                                            | Pinned to a single version                                                                                                                                                                                             |
| Getting changes live      | Appears as you edit, shake to refresh                                                                                                                                                                                                                       | Requires a new build and app store release                                                                                                                                                                             |
| Bundle ID or package name | Your app's production identifiers                                                                                                                                                                                                                           | Your app's production identifiers                                                                                                                                                                                      |
| Icon and launch screen    | Modified, so you can tell it apart                                                                                                                                                                                                                          | Your production branding                                                                                                                                                                                               |
|                           | <img src="https://34394582-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5sbzwG7CljeZdkntrL%2Fuploads%2Fr8TS9RFyaA5tEWuWpq9v%2Fdev-build.png?alt=media&amp;token=0eda8539-16f6-4ff4-8440-d2eaf3858a89" alt="" data-size="original"> | ![](https://34394582-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5sbzwG7CljeZdkntrL%2Fuploads%2FoRyrvPTBnql04xIsJS0N%2Fprod-build.png?alt=media\&token=0b7bee6e-ce7d-4725-a91c-492ae9ea31a6) |

### Creating a dev build

{% hint style="warning" %}
Creating a dev build requires your app to be connected to the App Store and Google Play Store, since the build is delivered through TestFlight and the Google Play Console. If you haven't set this up yet, see iOS App Store and Google Play Store.
{% endhint %}

Dev builds are created per app.

{% stepper %}
{% step %}
**Open the build manager**

In the *Settings* tab, open **Manage builds and live versions**.
{% endstep %}

{% step %}
**Start a new dev build**

<figure><img src="https://34394582-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5sbzwG7CljeZdkntrL%2Fuploads%2F2YAzJBrE68XRsY3V2BA6%2Fdev-build-button.png?alt=media&amp;token=46f5ca67-444c-420c-98f8-d956ae119d8b" alt="The Manage builds and live versions page with the + Dev build button highlighted at the top right."><figcaption></figcaption></figure>

Click **+ Dev build** in the top-right corner.
{% endstep %}

{% step %}
**Confirm and build**

In the modal, add an optional description, confirm the version, and click **Build**.
{% endstep %}
{% endstepper %}

Building can take up to 15 minutes. You can track the status on the same page where your builds and live versions are managed, and we'll email you when the build is ready. From there, install it on your device the same way you install a regular test build:

<table><thead><tr><th width="154">Platform</th><th>How to install</th></tr></thead><tbody><tr><td>iOS</td><td>Through TestFlight</td></tr><tr><td>Android</td><td>Through the Google Play Console. You'll need to manually release the build to an internal testing track.</td></tr></tbody></table>

{% hint style="warning" %}
TestFlight builds expire 90 days after they're uploaded. If your dev build expires, create a new one.
{% endhint %}

### Testing with a dev build

{% stepper %}
{% step %}
**Open the dev build**

Open the dev build on your device. The launch screen shows your app's name with a *Dev build* tag.
{% endstep %}

{% step %}
**Log in**

Log in with your Bubble account credentials.
{% endstep %}

{% step %}
**Select a branch**

<figure><img src="https://34394582-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5sbzwG7CljeZdkntrL%2Fuploads%2FPO9e5vOrtgeVqtWUm20P%2Fselect-branch.png?alt=media&amp;token=831a09ea-c40a-4f17-aa3e-a84187aabc40" alt="The dev build&#x27;s branch selection screen on a phone, with a Dev build tag and a popup explaining that shaking the phone reloads editor changes."><figcaption></figcaption></figure>

Select the branch you want to test. It loads immediately.
{% endstep %}

{% step %}
**Refresh to see updates**

Shake your device to refresh and view new updates.
{% endstep %}
{% endstepper %}

Your dev build now loads your app as it exists in the editor for that branch. Changes you make in the editor become available in the dev build without a new deployment. Shake your device to refresh the app or return to the launch screen, for example to reload from scratch or switch to a different branch.

### When you need a new dev build

Most changes reach your dev build instantly, but some are baked into the native binary itself and can only be delivered by creating a new build. This includes:

* Adding or updating plugins that use third-party native libraries
* Changing native device permissions
* Bubble updates to its internal mobile engine

When this happens, the affected dev build is marked *Outdated* in **Manage builds and live versions**. An outdated dev build still receives your changes, but it won't reflect the ones listed above until you create a new build.

To help you keep track of what each build contains, every build card in **Manage builds and live versions** lists the plugins that were included when the build was created. Inside the dev build itself, branches that contain changes requiring a new build are flagged on the branch selection screen.

The same changes require a new build in simulated device, where Bubble prompts you with a **Rebuild** button when one is needed.

<figure><img src="https://34394582-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5sbzwG7CljeZdkntrL%2Fuploads%2FxhDRMnNun4tvuwPvfYTW%2FScreenshot%202026-08-24%20at%204.32.16%E2%80%AFPM.png?alt=media&amp;token=f6344c05-9cee-4093-8e3e-9677b0ffcfb6" alt="The Manage builds and live versions page, listing mobile builds. The newest is tagged Dev and Outdated; one is marked Latest Version; older builds show a Deprecate button."><figcaption></figcaption></figure>

## FAQ: Previewing a mobile app

<details>

<summary>What are the ways to preview a mobile app?</summary>

There are four: web preview (in the browser, inside the editor), simulated device (a real build of your app on a simulated device, in the browser), BubbleGo (your app loaded on your own device through Bubble's BubbleGo app), and dev builds (a synced version of your app installed on your device).

</details>

<details>

<summary>Which preview method should I use?</summary>

Use web preview for quick iteration on layout and logic, since it's the fastest option and the only place you can inspect and debug. Switch to simulated device to confirm native behavior without needing a physical device. Use a dev build to test native features like push notifications and deep linking.

</details>

<details>

<summary>Why doesn't everything display correctly in web preview?</summary>

Some parts of the native mobile app editor rely on built-in features of mobile devices, which vary between iOS and Android, so not every element renders accurately in web preview. Simulated device closes most of that gap.

</details>

<details>

<summary>What are the current limitations of web preview?</summary>

The native maps element and native datetime picker won't render, plugins with their own third-party native libraries won't load, permissions request workflows may not work properly, camera workflows won't work properly, push notifications can't be sent to web preview, and multi-line inputs in floating groups won't expand to fit their height.

</details>

<details>

<summary>How is simulated device different from web preview?</summary>

Web preview renders your app in the browser, while simulated device runs a real build of your app on a simulated iOS or Android device, streamed into your browser. Because it's a real build, native elements and plugins that rely on their own third-party native libraries work the way they will on a device.

</details>

<details>

<summary>Do I need a device or an app store account to use simulated device?</summary>

No. Simulated device lets you check anything web preview can't render without a physical device or an App Store or Google Play connection.

</details>

<details>

<summary>What are the limitations of simulated device?</summary>

The simulator runs a real build, but it runs it in the cloud, so anything depending on physical hardware won't work: camera workflows won't work properly, push notifications can't be sent to the simulator, and device sensors won't report real data. Inspect and debug also aren't available in simulated device. To test any of these, use a dev build.

</details>

<details>

<summary>When does simulated device need a rebuild?</summary>

Most changes reach the simulator instantly, but some are baked into the build itself. When that happens, a *Rebuild* button appears in the top-right corner of the simulator. Building can take up to 10 minutes, and you can keep working in the editor while it runs. Until the rebuild finishes, the simulator keeps running the previous build, so what you see may not match your current settings.

</details>

<details>

<summary>Can BubbleGo send push notifications or run any plugin?</summary>

No. BubbleGo can't send push notifications, and it can't run plugins that rely on their own third-party native libraries. To test those plugins, use simulated device or a dev build. To test push notifications, use a dev build.

</details>

<details>

<summary>How do I refresh my app in BubbleGo?</summary>

In BubbleGo for iOS, you can refresh your app by shaking your iPhone.

</details>

<details>

<summary>What is a dev build?</summary>

A dev build is a version of your native mobile app that you install on your own device for testing. It looks and behaves like your real app, with your icon, branding, and plugins, but it stays synced with the Bubble editor, so changes appear on your phone right away, without publishing to the app stores.

</details>

<details>

<summary>What do I need before creating a dev build?</summary>

Your app needs to be connected to the App Store and Google Play Store, since the build is delivered through TestFlight and the Google Play Console.

</details>

<details>

<summary>How long does a dev build take, and how do I install it?</summary>

Building can take up to 15 minutes, and Bubble emails you when it's ready. On iOS you install it through TestFlight, and on Android through the Google Play Console, where you'll need to manually release the build to an internal testing track.

</details>

<details>

<summary>Do dev builds expire?</summary>

Yes. TestFlight builds expire 90 days after they're uploaded. If your dev build expires, create a new one.

</details>

<details>

<summary>How do I see my latest editor changes in a dev build?</summary>

Your dev build loads your app as it exists in the editor for the branch you select, and changes you make in the editor become available without a new deployment. Shake your device to refresh the app or return to the launch screen, for example to reload from scratch or switch branches.

</details>

<details>

<summary>When does a dev build need to be rebuilt?</summary>

Most changes reach your dev build instantly, but some are baked into the native binary and need a new build: adding or updating plugins that use third-party native libraries, changing native device permissions, and Bubble updates to its internal mobile engine. When this happens, the build is marked *Outdated* in Manage builds and live versions. It still receives your other changes, but won't reflect those three until you create a new build.

</details>

[^1]: Like the *We just updated the page* banner in the web app editor preview.
