Skip to content

Releasing updates for Expo apps

Expo projects do not use aether release-react: it bundles through the React Native community CLI, which Expo apps do not ship. Bundle with npx expo export:embed, Expo’s own bundler entry point, then upload the folder with aether release.

This flow is maintained as docs/RELEASING.md in the aether-expo-plugin repository; when that file changes, this guide must be updated to match.

The folder name is a protocol requirement, not a convention: devices look for the update signature at CodePush/.codepushrelease and hash file paths under a CodePush/ prefix. The CLI refuses to sign any other folder name.

iOS:

Terminal window
rm -rf build/CodePush && mkdir -p build/CodePush
npx expo export:embed \
--platform ios \
--dev false \
--bundle-output build/CodePush/main.jsbundle \
--assets-dest build/CodePush

Android:

Terminal window
rm -rf build/CodePush && mkdir -p build/CodePush
npx expo export:embed \
--platform android \
--dev false \
--bundle-output build/CodePush/index.android.bundle \
--assets-dest build/CodePush

Use the bundle filename your binary expects: main.jsbundle on iOS, index.android.bundle on Android.

Terminal window
aether release MyApp build/CodePush 1.2.0 -d Staging

The third argument targets the binary version of the builds that should receive the update, as a semver version or range. To sign, add the private key; the signature is written into the folder before upload:

Terminal window
aether release MyApp build/CodePush 1.2.0 -d Staging --privateKeyPath keys/private.pem

Signed updates need the matching publicKey prop in your plugin configuration.

Run the release build and watch the update arrive with aether debug ios or aether debug android. When Staging looks good:

Terminal window
aether promote MyApp Staging Production