Skip to content
useffect.sh
Book 30 min with a senior
Build & release

Runtime version

The identifier that guarantees an OTA update is only applied to builds whose native code is compatible with it.

Definition

The runtime version is a property of a build and of an update that guarantees their compatibility: an EAS update is only delivered to builds whose runtime version matches its own exactly. It describes the interface between JavaScript and the native layer; whenever a native change alters that interface (a new module, an SDK upgrade, an added permission), the runtime version must change, which means a new build has to ship before any update. It is configured in app.json under runtimeVersion, either as a manual string ("1.0.0") or through a policy: appVersion reuses the version field, nativeVersion combines version and the native build number (1.0.0(1)), and fingerprint hashes the native project with @expo/fingerprint at every build and every update. It is the mechanism that replaces the manual discipline CodePush demanded. A published update that never reaches phones almost always comes down to a runtime version mismatch.

In a real app

Choosing the policy is a team decision. appVersion is simple but relies on the discipline of bumping version at every release that includes native changes; one forgotten bump and an update breaks production builds. fingerprint removes that risk by hashing whatever touches native code (native folders, config, native dependencies); since SDK 58, the default balanced preset ignores version bumps and hashes native modules by name and version, which cuts needless rebuilds. It still yields more runtime versions than a manual policy, so more builds to keep alive in parallel. A manual string suits projects that already follow a strict release process.

To check what a build embeds, eas build:list shows each build’s runtime version, and eas update:list each update’s; the two must match for the platform concerned. eas fingerprint:compare explains why two fingerprints differ, which avoids the “but I changed nothing native” conversation when a dependency updated a podspec. The Updates.runtimeVersion API gives the value at runtime, useful in an internal debug screen.

The most expensive pitfall: projects that keep runtimeVersion frozen at "1.0.0" for months “so updates reach everyone”. Sooner or later an update references a native module the old builds lack, and the crash hits precisely the users who never update their app.

Sources

All 35 glossary terms

One of these is blocking your app?

30 minutes with a senior to look at the problem in your code. Free.