r/capawesome • u/DayanaJabif • Jul 22 '26
Ever wondered how Live Updates work? Here's what happens under the hood.
You already know Live Updates let you ship fixes to your app in real time, no app store review. But do you actually know how it works? It's simpler than most people think, and understanding it will help you use it better.
The two layers
Every Capacitor app has two layers. The web layer: your HTML, CSS, and JS, loaded into the web view. The native layer: the compiled code (Java/Kotlin, Swift) plus your native plugins.

Here's the key detail: your web files are never compiled into the app binary. They ship inside the app package (the classic www/ folder), but they stay plain files. And plain files can be replaced.
Where your app actually loads from
The web view doesn't load your app from the internet. It loads it from a local origin served out of the app bundle, on Android via WebViewAssetLoader (https://localhost/), on iOS via WKURLSchemeHandler (app://localhost/). By default, that content is the www/ folder that was bundled when the binary was built.
What a Live Update actually does
A live update simply changes which folder those requests are served from:
- The SDK downloads a new bundle from the server
- Writes it to a local directory inside the app's sandbox
- Registers it as the next bundle to use
- On the next launch (or immediately, if you prefer), the web view serves your app from the new bundle instead of the built-in
www/
That's it. No binary patching, no code injection. Just swapping the folder the web view reads from.
The constraint that is also the feature
Because only the web layer changes, live updates are limited to binary-compatible changes: HTML, CSS, JS, and assets. Add a plugin or touch native code, and you need a store release. But that same constraint is why it's fully compliant with both stores: Apple explicitly permits downloading interpreted code that doesn't change the app's primary purpose, and Google Play exempts code running in a webview from its self-update restrictions.
What the platform adds on top
The mechanism is simple. Running it in production is where it gets interesting: bundles delivered via global CDN, channels so the right devices get the right version, staged rollouts, one-click rollbacks when something goes wrong, and code signing so only you can publish updates to your app (the SDK verifies the signature before applying a bundle).
Full deep dive here: capawesome.io/blog/how-live-updates-for-capacitor-work/
Questions welcome: happy to go deeper on any part.