React Native can run JavaScript from a bundle stored on the device, much like a browser runs a web app. An OTA system downloads a new bundle and points the app to it, but this only updates JavaScript; native changes still require a store release.
The OTA Illusion: What No One Tells You About Instant Updates At Scale
Speaker
Adam Mruk, a senior engineer at Clara, explains the engineering and release challenges of React Native OTA updates at RUC 2025, presented by Callstack.
Clara’s system tracks builds and artifacts, stores them on S3, and lets the app check for updates and download them. To reduce bandwidth, the team compares build artifacts and ships only changed chunks. For a single large bundle, Hermes base bytecode can make binary diffs smaller.
Clara keeps an update in an evaluating state until health checks pass, then can revert to the previous bundle if the app crashes before it is marked applied. The team also checks chunk checksums before applying an update, which can catch damaged downloads or extraction errors. A custom iOS asset resolver fixed image paths that broke when OTA updates moved the main chunk.
Clara merges about 40 changes to main each day and releases to app stores weekly, so its team manually controls OTA updates rather than using continuous delivery. Updates require an app restart and may be delayed by download or extraction failures. Rollout percentages apply to a particular app version, and multiple store and OTA versions complicate monitoring.
Mruk advises most teams to use an existing OTA solution because building and maintaining one involves many hidden complexities. He recommends checking whether a tool supports rollback, update health checks, and diffs, and understanding exactly what it ships and how it applies updates. Teams should also plan for analytics and monitoring across multiple native and OTA versions.
Takeaways
- Treat OTA as a JavaScript delivery path; native changes still need a store release.
- Use artifact diffs to reduce update size and customer data usage.
- Add health checks, rollback, and checksum validation to handle failed updates.
- Track rollout percentages against the specific app version receiving the update.
- Plan monitoring for the different native and OTA versions users may have installed.
Mentioned in this talk
Search inside this talk
What was claimed 10
- metricClara: Over 100 million customers
“We have over 100 million customers all over the world”
YouTube Unverified1 source· Talk
- role at
“I'm a senior engineer at Clara.”
YouTube Unverified1 source· Talk
- featureOTA updates: deliver JavaScript changes to clients without a native releasedeliver JavaScript changes to clients without a native release
“deploy changes to your clients without doing a native release”
YouTube Unverified1 source· Talk
- builtClara built OTA updatescustom OTA solution
“At Clara, we implemented our own OTA solution completely from scratch”
YouTube Unverified1 source· Talk
- featureRe.Pack: code splitting and programmatic JavaScript bundle loadingcode splitting and programmatic JavaScript bundle loading
“it lets us do code splitting ... [and] programmatically choose how our JavaScript bundle is loaded”
YouTube Unverified1 source· Talk
- uses
“For this, we use Re.Pack.”
YouTube Unverified1 source· Talk
- usesClara uses
Hermes Agent
base bytecode when compiling JavaScript“Hermes has you covered ... with a special option called 'base bytecode'”
YouTube Unverified1 source· Talk
- uses
“It all started with a Sentry error we noticed”
YouTube Unverified1 source· Talk





