All posts
5 min readBy BetterCodePush

Set up React Native OTA updates with Claude Code, Cursor or Codex

A coding agent can add over-the-air updates to a React Native or Expo app, deploy a first update and check it on a device. How to give it the right instructions, what it does on its own, and the steps that stay with you.

AICoding AgentsOTAReact NativeExpo

Ask a coding agent to "add OTA updates to this app" and it will usually write something that looks right. Whether it works is another matter. Setting up over-the-air updates is only partly code. It also takes an account, API keys, a native build that contains the SDK, and a check on a real device that the update actually arrived. And an agent working from memory may reach for CodePush, which Microsoft retired in March 2025, or invent flags the CLI never had.

BetterCodePush publishes an agent skill for this: a set of instructions that tells the agent the order of the steps, the exact commands, which steps need you, and what it must never touch. With the skill installed, one prompt takes an app from no OTA setup to a verified update on a device.

Install the skill

From your app's root:

npx skills add bettercodepush/skills

The installer asks which agents you use and puts the skill where each one looks for it. It works with Claude Code, Cursor, Codex, GitHub Copilot and any other agent that loads SKILL.md skills. Commit the skill with your project so everyone on the team, and your CI agents, use the same instructions. The skill is updated with every stable release of the CLI, and npx skills update fetches the newest copy.

The three things you do yourself

The agent stops and asks you for the steps that need your account or your judgement, instead of trying to work around them:

  1. Create an account and one app per platform at console.bettercodepush.com, and give the agent the app IDs. They are not secrets.
  2. Create an API key in the console and write it into .env.bettercodepush yourself. Do not paste it into the chat. The agent is told never to read, print or commit it, and checks only that the variable exists.
  3. If you sign updates, which we recommend, paste the public key the agent generates into your app's settings in the console.

You also build and publish the native app. The agent can make a release build for an Android emulator to test with; iOS builds and store releases stay with you.

The prompt

Use the bettercodepush skill to set up BetterCodePush in this app, deploy a
first OTA update to my Android emulator, and verify it. My Android app ID is
app_... . I will add the API key to .env.bettercodepush myself.

From there, the agent:

  1. Works out whether the project is bare React Native or Expo, and which package manager the lockfile uses.
  2. Installs the SDK and CLI and runs bettercodepush init with your app IDs, so nothing waits on an interactive prompt.
  3. Creates signing keys, if you want signed updates.
  4. Wraps your root component and runs bettercodepush doctor until the setup is clean.
  5. Helps you make a release build of the app once. A debug build loads JavaScript from Metro and never takes an OTA update, which is the most common reason a first test fails.
  6. Changes a visible piece of text and deploys it as an update.
  7. Checks the result on the device in two launches. On the first, the app downloads the update and still shows the old text. On the second, it shows the new text. Only then does it report success.

That two-launch check matters. An agent that deploys and declares victory has proved that an upload worked, not that an update reached a phone. If the second launch does not show the change, the skill sends the agent to diagnose with doctor rather than deploy again.

After setup: releases by prompt

The skill also covers day-to-day release work. Once your app is set up, prompts like these do what they say, with the agent naming the release, platform and channel before it changes anything:

  • "Ship this fix to 10% of production on iOS."
  • "The last Android release looks fine, widen it to everyone."
  • "Users report a crash since this morning's release. Roll it back."
  • "Promote the beta release to production."
  • "A tester says the update never arrived. Find out why."

If you are new to staged releases, our guide to rollouts and rollbacks explains what the agent is doing for you, and Insights shows how a release is doing on real devices before you widen it.

What the agent will not do

A skill is also a set of limits. The BetterCodePush skill tells the agent to:

  • never read, print or commit your API key or private signing key;
  • say what it is about to do before any command that changes a release, and never deploy to a channel you did not name;
  • never delete a release, change signing keys or let doctor --fix rewrite files without asking;
  • leave your store, signing and CI configuration alone unless you asked about them.

Treat it like any change from a teammate: read the diff before you merge it, and keep the first deploys small.

Why this matters more for agent-built apps

If an agent helped you build the app, it can probably write tonight's fix in minutes. Getting that fix through store review can still take days. An OTA channel closes that gap, and with the skill, the same agent that wrote the fix can ship it safely to a small share of users first. We wrote more about that in AI-built apps ship faster than app review.

Get started

The agent skill is free and works on every plan, Hobby included. Create an account at console.bettercodepush.com, run npx skills add bettercodepush/skills in your app and give your agent the prompt above.

Ship your first update

Create an organization and deploy an over-the-air update in minutes. No billing setup required.

Start with BetterCodePush