OTA Update Model
EAS Update ships compatible JavaScript and assets to installed app binaries.
Safe OTA Changes
| Usually safe | Requires caution |
|---|---|
| Copy changes | Route behavior with native deep-link assumptions |
| JavaScript bug fixes | Large asset changes |
| Layout and style changes | Feature flags that expose hidden native assumptions |
| API endpoint logic | Changes depending on new native module behavior |
| Images and static assets | Platform-specific behavior that was not device-tested |
Not OTA-Safe
- Native code.
- Native dependencies.
- Expo SDK upgrades.
- Android permissions.
- iOS usage descriptions or background modes.
- App package name or bundle identifier.
- Icons and splash config that affect native projects.
- Runtime-incompatible JavaScript.
- Store policy or privacy behavior that needs review.
Runtime Version
Runtime version is the compatibility label between a binary and an update. A binary only receives updates with a compatible runtime version.
Common policies:
| Policy | Use when |
|---|---|
appVersion | Solo-dev apps that bump app version for native releases |
fingerprint | You want automatic runtime changes when native inputs change |
| Custom | You need manual cross-platform control and can maintain discipline |
Default to appVersion for simple solo-dev apps unless the project has frequent native changes or strong reasons to use fingerprint.
Rollout Flow
eas update --branch preview --message "Smoke update"
# install/open compatible preview build and verify
eas update --branch production --message "Production hotfix"
# if bad
eas update:rollback
Warning: Store rules still apply to OTA updates. Do not use OTA to sneak around review for sensitive permissions, payment behavior, privacy changes, or platform policy.