The command-line interface for Aether, over-the-air JavaScript bundle updates for React Native apps.
The CLI follows semver and is on a 0.x line: a minor release may still change flags or output. Pin the exact version in CI and read the changelog before upgrading.
Microsoft retired App Center CodePush in March 2025. Aether is a drop-in successor: the same release workflow, the same client contract, and a maintained SDK (@aetherpush/react-native-code-push) that replaces react-native-code-push without code changes. You release to named channels (Staging and Production by default), roll out to a percentage of devices, and roll back when a release goes wrong. Apps can be shared with collaborators.
Full documentation lives at docs.aetherpush.com.
npm install -g @aetherpush/cliRequires Node.js 22 or later.
-
Create an account and sign in.
registerasks for your email, name, and password, then sends a verification email; click the link before signing in.loginopens your browser, where you finish signing in — including any second factor — and authorize this machine.aether register aether login
-
Create an app. This also creates its Staging and Production deployments. Print the deployment keys and wire one into your app binary.
aether app add my-react-native-app aether deployment ls my-react-native-app -k
-
Release an update. The command bundles the app and reads the target binary version from the project.
aether release-react my-react-native-app ios
-
Manage the release: widen a rollout, promote it, or roll it back.
aether patch my-react-native-app Staging -r 25 aether promote my-react-native-app Staging Production aether rollback my-react-native-app Production
| Command | What it does |
|---|---|
register |
Create a new Aether account |
login, logout |
Session management |
whoami |
Show the current account |
app add|ls|rm|rename|transfer |
Manage apps (same-workspace transfer) |
app-transfer create|ls|accept|cancel |
Cross-workspace pending app transfers |
deployment add|ls|rm|rename|history|metrics|clear |
Manage deployment channels |
release, release-react |
Upload a new release |
patch |
Update metadata of an existing release (rollout %, mandatory, disabled, description) |
promote |
Promote a release between deployments |
rollback |
Roll a deployment back to a previous release |
collaborator add|ls|rm |
Manage app collaborators |
access-key ls|patch|rm |
List, rename and revoke CLI access keys (created in the dashboard under Account > CLI access keys) |
api-key ls|patch|rm |
List, rename, narrow and revoke scoped API keys for CI/CD (created in the dashboard under API Keys) |
session ls|rm |
Manage active login sessions |
debug ios|android |
Stream Aether logs from a running app |
Full reference and flags: aether <command> --help, or the CLI reference in the docs.
release-react compiles the bundle to Hermes bytecode when the project has Hermes enabled, or when you pass -h / --useHermes. For that step the CLI runs the hermesc compiler from the project's own node_modules, checking these locations in order and using the first one that exists:
node_modules/hermes-compiler(React Native 0.84 and newer)node_modules/react-native/sdks/hermesc(React Native 0.69 to 0.83)- the
hermesCommandpath fromandroid/app/build.gradle, if set node_modules/hermes-engineornode_modules/hermesvm(older projects)
If no compiler is found, the command fails and prints the paths it tried.
Known limitation: on Windows, some versions of the hermes-compiler package ship without a win64-bin binary. If a Hermes release fails on Windows with that path list, run it from macOS or Linux (for example in CI) instead.
aether login opens your browser, you approve the device there, and the CLI receives its own credential. The browser handles passwords, passkeys, authenticator codes and recovery codes, so the terminal never needs to.
On a machine with no browser — over SSH, in a container, on a locked-down host — ask for a code instead. The CLI prints a short code and a URL to open anywhere else:
aether login --deviceThe CLI falls back to this automatically when it cannot open a browser or bind a local callback port.
For CI and other machines, keep passing a key:
aether login --accessKey <your-api-key>aether logout revokes the device on the server and then clears the local credential. If the server cannot be reached, the local credential is cleared anyway and the device can still be revoked from the dashboard under Account > CLI & Devices.
--password still signs in with email and password, but it is deprecated and cannot complete sign-in on accounts with multi-factor authentication.
The credential lives in ~/.aether/credentials.json, readable only by you. Everything else — server URL, device id, account email — is in ~/.aether/cli.json. Both are created on aether login; the credential file is deleted on aether logout. A ~/.aether/config.json left by an earlier version is migrated automatically the first time you run this one.
To target a non-default server (e.g. local development):
aether login --serverUrl http://localhost:3000The CLI detects CI environments through the CI variable and runs non-interactively there; --ci forces it. Ready-made pipeline templates for GitLab CI, CircleCI, Jenkins, and Bitrise live in examples/ci/, and GitHub Actions has a dedicated action, aetherpush-deploy-action. The CI/CD guides walk through each platform.
The migration guide covers both routes. In short: the Aether SDK is a drop-in replacement for react-native-code-push on React Native 0.76 and newer, and older apps can keep Microsoft's SDK pointed at Aether's CodePush-compatible endpoints. Existing deployment keys can be preserved with aether deployment add -k, so shipped binaries keep updating.
- Website: aetherpush.com
- Documentation: docs.aetherpush.com
- Issues: GitHub