The Big Question
What happens when you could fix a critical bug in your React Native app and have the fix in users' hands within minutes without submitting a new version to the App Store? When you could update business logic or feature flags for a subset of users instantly, without waiting for review times or user-initiated updates? What if the mobile app could evolve as fluidly as the web?
The answer lies in over-the-air (OTA) updates and dynamic delivery. The traditional release cycle is slow and inefficient. Apple reports that over 90% of App Store submissions are reviewed in under 24 hours which is fast for a review process but still a day, with users updating on their own schedule after that . A meaningful chunk of users can sit on a broken version for weeks . The future of mobile updates is about eliminating that gap.
What Are Over-the-Air (OTA) Updates?
Over-the-air updates allow developers to push changes to a live mobile app without going through the app store's full review and release process . For React Native, the mechanism involves updating the JavaScript bundle the app's logic and UI code which is downloaded and applied dynamically by the app at runtime .
How it works:
-
An SDK integrated into your app checks a server for updates on launch (or periodically).
-
If an update exists, the SDK downloads the new JavaScript bundle and assets.
-
The update is applied either immediately (for mandatory fixes) or on the next app restart.
-
If a new bundle crashes, the SDK can automatically roll back to the previous working version .
This is not a new concept. Microsoft's CodePush has been the standard for years, enabling OTA updates for React Native apps . However, with Microsoft App Center shutting down, the ecosystem has fragmented into a range of alternatives that offer more control and flexibility .
What Can and Cannot Be Updated via OTA?
What OTA Can Update
JavaScript/TypeScript Logic: Bug fixes, feature improvements, and UI logic changes can all be shipped instantly .
Assets: Images, fonts, JSON files, and localization strings are all updateable .
Configuration and Business Logic: For Flutter, libraries like dart_patch_updater can push changes to feature flags, pricing rules, validation logic, workflow definitions, and API endpoints all without touching Dart compilation .
What OTA Cannot Update
Native Code: Android Kotlin/Java and iOS Swift/Objective-C code changes still require a full app store release .
New Permissions: Adding a permission to your Android manifest or iOS Info.plist requires a store release .
SDK or Framework Version Upgrades: Upgrading the React Native or Flutter framework itself requires a new binary .
App Icons and Splash Screens: These assets are part of the native app bundle and cannot be updated via OTA.
App Store Policies: What's Allowed?
The official stance: Both Apple and Google allow OTA updates as long as they don't change the app's primary functionality or introduce significant modifications . Major UI/UX overhauls should still go through a full review to keep app store descriptions accurate .
Critical rule: OTA updates are for minor bug fixes, UI tweaks, and non-native updates. They must be used judiciously to comply with store policies and maintain user trust .
The Landscape: Key Solutions
For React Native
CodePush: The original standard. It uses deployment keys to separate staging from production, supports staged rollouts to a percentage of users, and handles mandatory updates that install immediately .
AppsOnAir: A modern drop-in replacement for CodePush, designed for developers needing more control. It provides full OTA update functionality through a dashboard with monitoring, rollbacks, and app distribution capabilities .
react-native-update-ota: An open-source alternative that gives you full control over update hosting, supporting both custom servers and Git repositories as update sources .
For Flutter
Shorebird: A commercial service that provides OTA code updates for Flutter apps, enabling instant fixes without app store review cycles . It's specifically designed for Dart-only code and asset changes .
flutter_patcher: A hot-patch solution that replaces the Dart AOT artifact (libapp.so) and assets. It works on Android (and some iOS support is coming) with automatic MD5 and signature verification .
quickpatch_code_push: A Flutter package that provides OTA updates from a self-hosted QuickPatch server, supporting different update tracks (stable, beta, internal) .
dart_patch_updater: Focuses on updating data-driven business logic (feature flags, pricing rules, configs) via a JSON rule engine and supports GitHub Releases as an update server .
For Capacitor
cap-update: A lightweight OTA solution for Capacitor apps that allows updating the web bundle at runtime without rebuilding . It leverages Capacitor's native engine and offers secure, atomic updates .
For Super Apps (React Native + Module Federation)
Re.Pack + Zephyr Cloud: This approach enables OTA updates for "Super Apps" large applications with multiple independent modules by using Module Federation . Feature teams can deploy their bundles independently, and the app fetches the latest versions at runtime . This approach effectively gives each feature team its own "OTA update capability."
Android Dynamic Feature Modules
For Android, Dynamic Feature Modules (DFM) offer a way to modularize apps, allowing features to be downloaded on-demand rather than bundled in the base install. This keeps the base app lean and improves install rates, especially in low-bandwidth regions . At Halodoc, usage analysis revealed that many features were only relevant later in the user journey, yet they were bundled in the base app so every user downloaded and stored them regardless of actual need . By extracting these into DFMs, the base app was significantly reduced .
How to Implement OTA Updates
Step 1: Choose the Right Tool
-
For React Native: Consider AppsOnAir or react-native-update-ota after CodePush's sunset .
-
For Flutter: Evaluate Shorebird, flutter_patcher, or quickpatch_code_push depending on your needs .
-
For Capacitor: Use cap-update for web-based updates .
Step 2: Integrate the SDK
-
Follow the tool's documentation to add the SDK to your app.
-
For React Native, CodePush uses
codePush.sync()to check for updates . -
For Capacitor,
CapUpdate.sync()handles the update cycle .
Step 3: Set Up Deployment Keys (for CodePush-style tools)
-
Create deployment keys for your environments (e.g., Staging, Production) .
-
Embed the appropriate key in each build.
Stagingis for internal testing, whileProductionis for end users .
Step 4: Release an Update
-
Build a new JavaScript bundle (or Dart patch) and release it to your OTA provider.
-
For CodePush:
code push release <appName> <platform>.
Step 5: Monitor and Rollback
-
Use the provider's dashboard or API to monitor update adoption, crash rates, and user feedback .
-
If issues arise, rollback the update instantly to a previous version.
Best Practices
1. Treat OTA Releases with the Same Discipline as Store Releases
The distribution channel changed; the risk didn't. A bad bundle pushed to 100% of users breaks the app for 100% of users, faster than any store release ever could .
2. Use Staged Rollouts
Release to 5-10% of users first, monitor crash rates and key metrics, then expand. The fixes that break things always looked "obviously safe" .
3. Mark Releases as Mandatory Sparingly
Mandatory installs interrupt users mid-session. Reserve them for genuine breakage: crashes on launch, security issues, broken payments .
4. Test the Update Flow on Real Devices
Test how updates behave (including mandatory flows) on real devices from time to time .
Implementation Roadmap
Phase 1: Foundation (Weeks 1-2)
-
Identify updateable components in your app: Review your app's codebase. What can be updated via OTA (logic, UI, assets) vs. what requires a native release?
-
Select a tool: Choose the right OTA solution (AppsOnAir, Shorebird, cap-update, etc.) based on your tech stack.
-
Set up deployment environments: Define clear rules for Staging and Production OTA deployments.
Phase 2: Integration (Weeks 3-4)
-
Integrate the SDK: Add the chosen SDK and set up the update check logic.
-
Configure deployment keys: Ensure your builds know which environment they belong to.
-
Implement staged rollouts: Start the rollout process with 5-10% of users.
Phase 3: Refine and Scale (Weeks 5-8)
-
Test mandatory updates: Understand how the mandatory update flow works in practice.
-
Monitor and iterate: Use analytics to track update adoption and performance.
-
Build internal tooling: For self-hosted solutions like react-native-update-ota, build infrastructure to manage updates and rollbacks.
Frequently Asked Questions
Q1: What is the difference between a full app release and an over-the-air (OTA) update?
A full release involves building a new native binary, submitting it to the app store, waiting for review, and requiring the user to download the new version from the store . An OTA update pushes a new JavaScript bundle, assets, or configuration directly to the app at runtime, bypassing both the app store and the user download step .
Q2: Are OTA updates allowed by Apple and Google?
Yes, as long as they don't change the app's primary functionality or introduce significant modifications . OTA updates are intended for bug fixes, UI tweaks, and non-native updates.
Q3: Can OTA updates affect native Android/iOS code?
No. OTA updates cannot change native code, permissions, or SDK versions. Those changes always require a full app store release .
Q4: Are there alternatives to Microsoft CodePush?
Yes, the market has fragmented. For React Native, AppsOnAir and react-native-update-ota are popular alternatives . For Flutter, Shorebird is the leading commercial option .
Q5: What are Dynamic Feature Modules?
A way to modularize your Android app, allowing features to be installed on-demand, rather than being bundled in the initial install. This reduces the base app size and speeds up installation .
Q6: How can Innovative AI Solutions help?
We help organizations design, build, and operationalize mobile update strategies from OTA implementation and dynamic feature modularization to CI/CD pipeline integration and governance. Based in Delhi, serving clients across India.
Why Delhi is a Great Hub for Mobile Innovation
Delhi is emerging as a hub for mobile and AI innovation, backed by a thriving app development ecosystem and a massive mobile-first user base. With the rapid adoption of technologies like UPI and India's Digital Public Infrastructure, mobile applications in India are often more feature-rich and performance-sensitive than their Western counterparts. The need for faster, more efficient update mechanisms is a business imperative here, making Delhi an ideal location for building the next generation of mobile update strategies.
What We Offer at Innovative AI Solutions
-
Mobile Update Strategy: We help you design a comprehensive OTA, dynamic feature, and store release strategy.
-
Implementation Support: We help you integrate OTA solutions and set up dynamic feature modules.
-
CI/CD Integration: We help you build automated pipelines for OTA releases and store deployments.
-
Governance: We help you establish policies for staged rollouts, mandatory updates, and app store compliance.
Final Thought
The future of mobile app maintenance is moving away from monolithic, full-version releases and toward a modular, instantaneous, and user-transparent model. OTA updates are the new reality, enabling teams to respond to issues and ship improvements at the speed of the web. The organizations that master this model will have a decisive advantage in user retention, market responsiveness, and engineering productivity.
Contact Us:
Phone: +91 7464 099 059 / +91 9689967356
Email: info@innovativeais.com
Address: Netaji Subhash Place, Pitampura, Delhi – 110034
Website: https://innovativeais.com
About the Author
Abhishek Kumar
Founder & CEO, Innovative AI Solutions
5+ years building AI, cloud, and enterprise systems. Based in Delhi, serving clients across India.