React Viro — v2.54.0 Release Notes
Release date: March 31, 2026
What's New
Semantic Masking
Virtual objects can now react to what the camera sees in the real world. A material can be configured to appear only on specific surfaces — for example, render a cloud effect exclusively on pixels classified as sky, or hide a character wherever a person is detected. Eleven real-world categories are supported: sky, building, tree, road, sidewalk, terrain, structure, object, vehicle, person, and water. Available on both Android and iOS.
iOS setup: Semantic masking on iOS requires the ARCore Semantics pod. Add includeSemantics: true to your Expo plugin config in app.json to have it included automatically. If you are already using provider: "arcore" or includeARCore: true, the pod is already included and no extra config is needed.
["@reactvision/react-viro", {
"ios": {
"includeSemantics": true
}
}]Animated GLB Models
3D models in GLB/glTF format with embedded animations now play correctly. This covers the three main animation systems used by artists — skeletal rigs (character movement), morph targets (facial expressions, blend shapes), and skinning (soft-body deformation). No extra configuration is needed; animations embedded in the file are automatically available.
Permission Helpers
Two new utility functions make it easier to handle camera and location permissions:
requestRequiredPermissions(permissions?)— prompts the user for the specified permissions. Pass a list to request only what your feature needs ("camera","microphone","storage","location"), or call with no arguments to request all four at once.checkPermissions(permissions?)— reads the current permission status without prompting the user. Useful for checking what has already been granted before deciding whether to ask.
Expo 54 & 55 Support
The package is now compatible with both Expo SDK 54 and Expo SDK 55.
Bug Fixes
Android — App crash on launch (Android 15 / 16)
Apps were crashing immediately on launch on devices running Android 15 or 16 due to a new 16 KB memory page-size requirement introduced by Google. All native libraries have been rebuilt to comply with the new standard.
Android — App crash after returning from background
A combination of three separate issues caused a guaranteed crash whenever the operating system suspended the app and reclaimed GPU memory. On resume, the app attempted to use GPU resources that no longer existed. All three root causes have been fixed; the app now recovers cleanly from background suspension.
Android — ViroARImageMarker detection callback not firing
The onAnchorFound callback on ViroARImageMarker was never called on Android, making it impossible to respond to image detection events in JavaScript. The native event bridge has been corrected.
Android — Model texture overlaying the screen during video recording
When recording AR scenes, the 3D model's texture was incorrectly rendered over the entire screen instead of just the model. This was caused by a stale GPU state cache when switching between the display and recording graphics contexts. The cache is now correctly reset on each context switch.
iOS — Portal scene interior not rendering (#452)
On iOS, looking through a ViroPortalScene showed only the camera feed — none of the 3D content inside the portal was visible. This was caused by leftover GPU stencil state from the previous frame that prevented interior content from passing the render test. The stencil state is now correctly reset each frame.
iOS — EAS cloud build failure (Podfile syntax error) (#441)
iOS builds through Expo Application Services (EAS) were failing with a CocoaPods syntax error in the generated Podfile. The Expo plugin now generates a valid Podfile in all build environments.
Summary
| Area | Change |
|---|---|
| New feature | Semantic masking for materials (Android + iOS) |
| New feature | Animated GLB — skeletal, morph targets, skinning |
| New feature | requestRequiredPermissions utility |
| New feature | checkPermissions utility |
| Platform | Expo 54 & 55 support |
| Fix — Android | Crash on launch on Android 15 / 16 (16 KB page size) |
| Fix — Android | Crash after returning from background |
| Fix — Android | ViroARImageMarker onAnchorFound never fired |
| Fix — Android | Model texture overlay during video recording |
| Fix — iOS | Portal scene interior content not rendering (#452) |
| Fix — iOS | EAS cloud build Podfile syntax error (#441) |