Codemagic Patch is a self-hosted over-the-air (OTA) update service for React Native and Capacitor apps. Ship JavaScript and web-asset changes straight to installed apps, with no app-store review for changes that live outside the native binary.
You have two options to try out Patch.
Local + simulator - Installs the stack locally and lets you deliver updates to the simulator, including to the included demo app.
Local + ngrok + device - Installs the stack locally, plus uses a free ngrok account so you can deliver updates to the app on your real device.
Run the server on localhost, with a one-click local login. No OAuth account, ngrok account, or domain. You need Docker. This reaches the iOS Simulator, an Android emulator, and a USB-connected Android device. A phone on the network cannot reach it.
npm install -g @codemagic/patch-cli
cmpatch selfhost local-evalWhen it finishes, the dashboard is at http://localhost:8080. Then run the guided demo. It builds a React Native storefront on a simulator or emulator, publishes a one-line fix, and lets you watch the running app install it:
cmpatch demoThe demo needs Node.js 22.20+, Yarn (via Corepack), and either Xcode with an iOS Simulator or an Android SDK with a running emulator. See the on-device demo. To connect your own app instead, see Quickstart: try it locally.
Run the real server, with sign-in, on your own machine, and reach it from any phone at the free https:// address your ngrok account comes with. You need Docker, a free ngrok account, and a GitHub, Bitbucket, or GitLab account to sign in with. No domain, DNS records, certificates, or open ports.
npm install -g @codemagic/patch-cli
cmpatch selfhost install --ngrokThe command finds your ngrok address, walks you through the OAuth app with that address filled in, installs the server, and points cmpatch at it. When it finishes, it prints the dashboard and the two values your app is configured with, both on the ngrok address:
| App config key | Value |
|---|---|
CodemagicPatchApiUrl |
https://<address> |
CodemagicPatchDownloadBaseUrl |
https://<address>/codemagic-patch |
- React Native: run
cmpatch login, thencmpatch initfrom your project root, as the installer prints them.initcreates one app per platform and writes the URLs and deployment keys into your native projects. Build a release build, then publish withcmpatch release-react. Guides: Native setup · First release. - Capacitor: install the SDK (
@codemagic/capacitor-patch) in your app and the CLI (@codemagic/capacitor-patch-cli) globally. Sign in withcmpatch-capacitor login --server-url https://<address>, create one app per platform withcmpatch-capacitor app create, and copy each app's deployment key fromcmpatch-capacitor deployment list. Put the two URLs and the keys incapacitor.config.ts(one block per platform), runnpx cap sync, and build. Publish withcmpatch-capacitor release create. Guides: Native setup · First release.
This is for testing: ngrok's free plan carries 1 GB and 20,000 requests a month, and apps keep the address they were built with, so install on your own domain before you ship. See Install › ngrok.
Install the server from your own machine. You need a host you can reach over SSH, two hostnames (one for the API and dashboard, one for artifact storage), and a GitHub, Bitbucket Cloud, or GitLab account for sign-in. The wizard asks for everything else, and offers to put Cloudflare or CloudFront in front of storage. Without a server or domain of your own, cmpatch selfhost install --fly deploys Patch onto Fly.io instead (see Install › Fly.io).
npm install -g @codemagic/patch-cli
cmpatch selfhost installThen connect your app and publish a release:
| React Native | Capacitor | |
|---|---|---|
| Connect the app | cmpatch init |
cmpatch-capacitor app create, then capacitor.config.ts |
| Publish a release | cmpatch release-react |
cmpatch-capacitor release create |
| Guides | Native setup · First release | Native setup · First release |
Start with the Install guide for the server. Backups, restores, and upgrades also run from your machine, with cmpatch selfhost backup, restore, and upgrade (see Operations).
The full documentation is at patch.codemagic.io/docs. Pages that differ between frameworks have a React Native / Capacitor switcher.
| Topic | Pages |
|---|---|
| Learn | How it works · Core concepts · How delivery works · How Patch compares: React Native / Capacitor |
| Run the server | Install · Cloudflare · CloudFront · Infrastructure · Ongoing maintenance |
| Integrate the SDK | Native setup: React Native / Capacitor · Checking for updates · Applying updates · Manual control |
| Ship releases | Dashboard · Releasing updates · Fingerprinting (React Native) · Binary versions (Capacitor) · Verify a test release · Preparing for production · Production control · Security and code signing · CI integration |
| Operate | Operations · Analytics · Troubleshooting · FAQ |
| Reference | SDK · cmpatch CLI · cmpatch-capacitor CLI · Configuration · Delivery protocol |
| Migrate | From CodePush · From Expo Updates · From Appflow Live Updates |
| Release notes | All components |
Your feedback helps us improve Codemagic Patch. Tell us what works well, what has been challenging, and what you would like to see next.
- 💬 Ask questions in the Codemagic Discord, where our developers help out and take feature requests.
- 🗣️ Start a discussion in GitHub Discussions.
- 📅 Book a feedback call, or email zach@codemagic.io.