---
description: Understand how Capacitor and Cordova Live Updates work under the hood — the web layer vs the native binary, bundle swapping, and App Store compliance.
title: How Live Updates Work - Capawesome
image: https://capawesome.io/docs/assets/images/social/cloud/live-updates/how-it-works.png
---

[ Skip to content](#how-live-updates-work) 

[ 🔐 Introducing the **Capacitor Vault** plugin — store secrets behind biometrics or a device passcode.](/blog/announcing-the-capacitor-vault-plugin/) 

* [  SDKs ](/docs/sdks/)
* [  Formbricks ](/docs/sdks/capacitor/formbricks/)
* [  Geocoder ](/docs/sdks/capacitor/geocoder/)
* [  Google Sign-In ](/docs/sdks/capacitor/google-sign-in/)
* [  Grafana Faro ](/docs/sdks/capacitor/grafana-faro/)
* [  libSQL ](/docs/sdks/capacitor/libsql/)
* [  Live Update ](/docs/sdks/capacitor/live-update/)
* [  Managed Configurations ](/docs/sdks/capacitor/managed-configurations/)
* [  Media Session ](/docs/sdks/capacitor/media-session/)
* [  ML Kit ](/docs/sdks/capacitor/mlkit/)
* [  Navigation Bar ](/docs/sdks/capacitor/navigation-bar/)
* [  NFC ](/docs/sdks/capacitor/nfc/)
* [  OAuth ](/docs/sdks/capacitor/oauth/)
* [  Pedometer ](/docs/sdks/capacitor/pedometer/)
* [  Photo Editor ](/docs/sdks/capacitor/photo-editor/)
* [  PostHog ](/docs/sdks/capacitor/posthog/)
* [  Printer ](/docs/sdks/capacitor/printer/)
* [  Purchases ](/docs/sdks/capacitor/purchases/)
* [  RealtimeKit ](/docs/sdks/capacitor/realtimekit/)
* [  Screen Orientation ](/docs/sdks/capacitor/screen-orientation/)
* [  Screenshot ](/docs/sdks/capacitor/screenshot/)
* [  Secure Preferences ](/docs/sdks/capacitor/secure-preferences/)
* [  Speech Recognition ](/docs/sdks/capacitor/speech-recognition/)
* [  Speech Synthesis ](/docs/sdks/capacitor/speech-synthesis/)
* [  Share Target ](/docs/sdks/capacitor/share-target/)
* [  Square Mobile Payments ](/docs/sdks/capacitor/square-mobile-payments/)
* [  SQLite ](/docs/sdks/capacitor/sqlite/)
* [  Superwall ](/docs/sdks/capacitor/superwall/)
* [  Torch ](/docs/sdks/capacitor/torch/)
* [  Vault ](/docs/sdks/capacitor/vault/)
* [  Wifi ](/docs/sdks/capacitor/wifi/)
* [  Zip ](/docs/sdks/capacitor/zip/)
* [  Cordova ](/docs/sdks/cordova/)
* [  Cloud ](/docs/cloud/)
* [  Integrations ](/docs/cloud/live-updates/integrations/)
* Concepts
* [  Bundles ](/docs/cloud/live-updates/bundles/)
* [  Binary-Compatible Changes ](/docs/cloud/live-updates/binary-compatible-changes/)
* Reference
* [  Troubleshooting ](/docs/cloud/live-updates/troubleshooting/)
* [  FAQ ](/docs/cloud/live-updates/faq/)
* [  Native Builds ](/docs/cloud/native-builds/)
* [  Set Up Environments ](/docs/cloud/native-builds/environments/)
* [  Overwrite Native Configurations ](/docs/cloud/native-builds/native-configurations/)
* [  Auto-Increment Build Numbers ](/docs/cloud/native-builds/auto-incrementing-build-numbers/)
* [  Configure the Web Build Script ](/docs/cloud/native-builds/web-build-script/)
* [  Build from a Monorepo ](/docs/cloud/native-builds/monorepo/)
* [  Use pnpm or Yarn ](/docs/cloud/native-builds/package-managers/)
* [  Install Private npm Packages ](/docs/cloud/native-builds/npm-private-registry/)
* [  Override the Java Version ](/docs/cloud/native-builds/override-java-version/)
* [  Custom iOS Provisioning Profiles ](/docs/cloud/native-builds/custom-ios-provisioning-profiles/)
* [  Build without Git ](/docs/cloud/native-builds/build-without-git/)
* [  Access Git Behind a Firewall ](/docs/cloud/native-builds/firewall-access/)
* [  Integrations ](/docs/cloud/native-builds/integrations/)
* Reference
* [  Troubleshooting ](/docs/cloud/native-builds/troubleshooting/)
* [  FAQ ](/docs/cloud/native-builds/faq/)
* [  App Store Publishing ](/docs/cloud/app-store-publishing/)
* [  Submit a Build ](/docs/cloud/app-store-publishing/submit-a-build/)
* [  Submit Automatically After a Build ](/docs/cloud/app-store-publishing/submit-automatically/)
* [  Troubleshooting ](/docs/cloud/app-store-publishing/troubleshooting/)
* [  FAQ ](/docs/cloud/app-store-publishing/faq/)
* [  Automations ](/docs/cloud/automations/)
* [  Reference ](/docs/cloud/automations/reference/)
* [  Troubleshooting ](/docs/cloud/automations/troubleshooting/)
* [  FAQ ](/docs/cloud/automations/faq/)
* [  Assist ](/docs/cloud/assist/)
* [  CLI ](/docs/cloud/cli/)
* APIs and SDKs
* [  Webhooks ](/docs/cloud/webhooks/)
* [  Integrations ](/docs/cloud/integrations/)
* Account
* [  Organization ](/docs/cloud/organizations/)
* [  Two-Factor Enforcement ](/docs/cloud/organizations/two-factor-authentication/)
* [  Audit Logs ](/docs/cloud/organizations/audit-logs/)
* [  Billing ](/docs/cloud/organizations/billing/)
* [  License Keys ](/docs/cloud/license-keys/)
* [  AI ](/docs/ai/)
* [  Insiders ](/docs/insiders/)
* [  Billing & Plans ](/docs/insiders/billing-and-plans/)
* [  FAQ ](/docs/insiders/faq/)
* [  License ](https://capawesome.io/legal/eula/)
* [  Support ](/docs/support/)
* [  Contributing ](/docs/contributing/)
* Contributing code
* [  Code of Conduct ](/docs/contributing/code-of-conduct/)
* [  Questions ](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#creating-a-discussion)
* [  Blog ](/blog/)
* Categories

# How Live Updates Work[¶](#how-live-updates-work "Permanent link")

A hybrid app has two layers. The **native layer** is the compiled binary installed from the App Store or Google Play — it contains the WebView, the native plugins, and the platform glue. The **web layer** is everything that runs inside that WebView: your HTML, CSS, JavaScript, and static assets.

A Live Update is an **over-the-air (OTA) update of the web layer only**. The native binary stays untouched. Instead of pushing a new build to the stores, you upload a new web bundle to Capawesome Cloud, and the Live Update SDK in your app downloads it, swaps it in, and reloads.

That constraint is also the feature: because nothing native changes, you don't need an app store review and your users don't have to take any action. It also means a bundle must stay compatible with the installed binary — see [Binary-Compatible Changes](/docs/cloud/live-updates/binary-compatible-changes/).

## Key terms[¶](#key-terms "Permanent link")

Live Updates revolve around a handful of entities in Capawesome Cloud. Here's what each one means:

* **App** — the top-level container in Capawesome Cloud that everything below belongs to. It maps to a single Capacitor or Cordova app.
* **Build** — a build of your app's web assets, run in the cloud or uploaded from your machine. Each build produces one artifact.
* **Artifact** — the output of a build. For a web build, that artifact _is_ the bundle: a zip of your web assets, or a manifest pointing to your own server for [self-hosted](/docs/cloud/live-updates/self-hosting/) bundles.
* **Bundle** — the artifact of a web build (the bundle's ID is that build artifact's ID): the packaged web assets delivered over-the-air. It's the unit you deploy to a channel — one "Live Update". See [Bundles](/docs/cloud/live-updates/bundles/).
* **Channel** — a named stream of bundles that devices subscribe to, such as `production` or `staging`. Each device subscribes to exactly one channel. See [Channels](/docs/cloud/live-updates/channels/).
* **Deployment** — the link between a bundle and a channel. Deploying a bundle to a channel makes it the latest update for that channel's devices.
* **Rollout** — a deployment delivered gradually, to a growing percentage of the channel's devices, so you can limit exposure to a bad release. See [Rollouts](/docs/cloud/live-updates/rollouts/).
* **Device** — an installed instance of your app. Each device receives the latest [compatible](/docs/cloud/live-updates/binary-compatible-changes/) bundle from its channel. See [Devices](/docs/cloud/live-updates/devices/).

The publishing side fits together like this — a build produces an artifact, that artifact is the bundle, and a deployment puts it on a channel:

![Relationship between channels, deployments, builds, and artifacts](/docs/assets/images/diagrams/capawesome-cloud-bundles-light.png#only-light) ![Relationship between channels, deployments, builds, and artifacts](/docs/assets/images/diagrams/capawesome-cloud-bundles-dark.png#only-dark) 

How channels, deployments, builds, and artifacts relate in Capawesome Cloud

On the device side, each device subscribes to one channel and pulls the latest bundle deployed there. The next section follows a single update all the way from your machine to that device.

## The update lifecycle[¶](#the-update-lifecycle "Permanent link")

Every Live Update follows the same path, from publishing a bundle to applying it on a device. It happens in two stages.

**On your side** — you publish the update:

1. **Build** — produce your web assets, locally or in the cloud. See [Publish an update](/docs/cloud/live-updates/publish/).
2. **Deploy** — deploy the resulting bundle to a [channel](/docs/cloud/live-updates/channels/), making it the latest update for that channel's devices.

**On the device** — the [Live Update SDK](/docs/cloud/live-updates/setup/) takes over automatically:

1. **Check** — the SDK asks Capawesome Cloud whether a newer bundle is available for the device's channel.
2. **Download** — if there is, the bundle is downloaded and written to a local directory inside the app's sandbox.
3. **Stage** — the SDK records the downloaded bundle as the _next_ bundle to load.
4. **Apply** — on the next app launch (or immediately, if you call `reload()`), the WebView loads the new bundle instead of the one shipped inside the binary.

By default, the WebView loads your web assets from a local path bundled inside the native app — the output of your build at the time you shipped the binary. Applying a Live Update simply points the WebView at the downloaded bundle's path instead. The path is persisted natively (in `SharedPreferences` on Android and `UserDefaults` on iOS), so the app keeps using the updated bundle across restarts until a newer one is applied.

When and how the _Apply_ step happens is controlled by your [update strategy](/docs/cloud/live-updates/update-strategies/).

## Are Live Updates compliant with app store policies?[¶](#are-live-updates-compliant-with-app-store-policies "Permanent link")

Yes. Both Apple and Google explicitly allow downloading and executing code inside a WebView, which is exactly what Live Updates do.

* **Apple** — the App Store Review Guidelines (section 3.3.2) allow downloading interpreted code as long as it doesn't change the primary purpose of the app, doesn't create a store for other code, and doesn't bypass the system's signing or sandbox. Web code running in a `WKWebView` meets all three conditions.
* **Google Play** — the Device and Network Abuse policy forbids apps from modifying or replacing themselves outside of Play, with an explicit exception for code interpreted in a runtime such as JavaScript in a WebView.

In short, app stores draw the line at _native_ self-modification. Live Updates only touch the web layer, so they stay safely on the right side of that line.

June 9, 2026 

 Back to top 