Releases: ReactVision/viro
v2.50.0
ReactVision 2.50.0 Release Notes
New Features
All features from ViroCore 2.50.0 are included, plus React Native specific bug fixes.
Cloud Anchors
Cross-platform AR anchor sharing between iOS and Android devices.
- Cross-Platform: Share anchors between iOS and Android devices
- Persistent: Anchors can be stored for 1-365 days
- Accurate: Sub-centimeter accuracy in good conditions
- Scalable: Supports multiple concurrent users
<ViroARSceneNavigator cloudAnchorProvider="arcore">
{/* Use sceneNavigator.hostCloudAnchor() and resolveCloudAnchor() */}
</ViroARSceneNavigator>API Highlights:
hostCloudAnchor(anchorId, ttlDays)- Upload anchor to Google's serversresolveCloudAnchor(cloudAnchorId)- Retrieve anchor on another devicecancelCloudAnchorOperations()- Cancel pending operations
Geospatial API
Location-based AR with GPS coordinates using Google's ARCore Geospatial API.
- Earth Tracking: Track device position using GPS and Visual Positioning System (VPS)
- Three Anchor Types: WGS84 (absolute altitude), Terrain (relative to ground), and Rooftop (relative to buildings)
- VPS Availability Check: Verify if enhanced positioning is available at a location
<ViroARSceneNavigator geospatialAnchorProvider="arcore">
{/* Use createGeospatialAnchor(), createTerrainAnchor(), createRooftopAnchor() */}
</ViroARSceneNavigator>API Highlights:
createGeospatialAnchor(lat, lng, altitude, quaternion)- WGS84 anchorcreateTerrainAnchor(lat, lng, altitudeAboveTerrain, quaternion)- Ground-relative anchorcreateRooftopAnchor(lat, lng, altitudeAboveRooftop, quaternion)- Building-relative anchorgetCameraGeospatialPose()- Get current location with accuracy metricscheckVPSAvailability(lat, lng)- Check VPS support at location
Scene Semantics
ML-based scene understanding with 12 semantic labels.
- 12 Semantic Labels: sky, building, tree, road, sidewalk, terrain, structure, object, vehicle, person, water, unlabeled
- Real-time Processing: Per-frame label fractions
- Use Cases: Outdoor detection, environment-aware content, safety warnings
// Enable via cloudAnchorProvider or geospatialAnchorProvider
// Use getSemanticLabelFractions() for environment detection
const { fractions } = await arSceneNavigator.getSemanticLabelFractions();
if (fractions.sky > 0.1) {
console.log("User is outdoors!");
}Depth Occlusion
Visual occlusion behind real-world objects for realistic AR blending.
- Three Modes: Disabled, DepthBased, PeopleOnly
- Realistic Blending: Virtual objects hidden behind real surfaces
- People Segmentation: Option to only occlude behind detected people
<ViroARSceneNavigator occlusionMode="depthBased">
{/* Virtual content properly occluded behind real surfaces */}
</ViroARSceneNavigator>Occlusion Modes:
"disabled"- No occlusion (virtual objects always on top)"depthBased"- Use depth data to occlude behind real surfaces"peopleOnly"- Only occlude behind detected people
Extended glTF Support
Expanded glTF 2.0 support with 17 additional features for improved 3D model compatibility.
Core Geometry & Materials
- Non-indexed geometry support - Primitives without index buffers
- LINE_LOOP primitive type - Converted to line strip with closing segment
- TRIANGLE_FAN primitive type - Converted to individual triangles
- Mipmap filter modes - Proper separation of min/mip filtering
- Alpha masking (MASK mode) - With alphaCutoff support
- Emissive materials - emissiveFactor and emissiveTexture
- STEP animation interpolation - Discrete keyframe transitions
- Sparse accessor support - Override specific buffer values
Camera & Scene
- Perspective cameras - FOV, near/far planes, aspect ratio
- Orthographic cameras - xmag, ymag, clipping planes
- Default scene selection - Respects model.defaultScene
Lighting (KHR_lights_punctual)
- Directional lights - Color, intensity
- Point lights - Color, intensity, range/attenuation
- Spot lights - Color, intensity, range, inner/outer cone angles
Material Extensions
- KHR_materials_unlit - Constant/unlit lighting model
- Normal texture scale - Controls bump intensity
- Occlusion texture strength - Controls AO influence
Bug Fixes
Memory Leak Fix
- Enhanced memory safety across 8 Java modules through Fabric architecture migration
- Fixed null reference issues in prop application during React Native's pre-attachment phase
- Improved stability during AR session transitions and low-end device scenarios
- Migrated 30 methods to use Fabric's
UIBlockpattern for safer memory management
Affected Modules:
- ARSceneModule
- ARSceneNavigatorModule
- CameraModule
- ControllerModule
- NodeModule
- SceneModule
- SceneNavigatorModule
- VRT3DSceneNavigatorModule
onClick iOS Fix
- Fixed ViroText onClick event handling on iOS
- Resolved issue where onClick prop was incorrectly passed to native code, interfering with event delegation
- Fixes GitHub issue #272
AR Image Marker Fix
- Improved ARImageMarker lifecycle management with proper weak reference patterns
- Prevents retain cycles and memory leaks during image target tracking
- Proper cleanup via
removeARImageTarget()when updating targets
Setup
Expo Projects
{
"expo": {
"plugins": [
[
"@reactvision/react-viro",
{
"googleCloudApiKey": "YOUR_API_KEY",
"cloudAnchorProvider": "arcore",
"geospatialAnchorProvider": "arcore",
"android": {
"xRMode": ["AR"]
}
}
]
]
}
}Then rebuild:
npx expo prebuild --clean
npx expo run:ios
# or
npx expo run:androidBare React Native Projects
iOS - Podfile:
use_frameworks! :linkage => :dynamic
pod 'ARCore/CloudAnchors', '~> 1.51.0'
pod 'ARCore/Geospatial', '~> 1.51.0'
pod 'ARCore/Semantics', '~> 1.51.0'iOS - Info.plist:
<key>GARAPIKey</key>
<string>YOUR_GOOGLE_CLOUD_API_KEY</string>Android - AndroidManifest.xml:
<meta-data
android:name="com.google.android.ar.API_KEY"
android:value="YOUR_GOOGLE_CLOUD_API_KEY" />Requirements
- iOS: iOS 12.0+, ARKit-capable device
- Android: Android 7.0+ (API 24), ARCore-supported device
- Google Cloud: Valid API key with ARCore API enabled
- Depth Features: LiDAR (iOS) or ToF sensor/ARCore Depth API (Android)
v2.44.2
This is a minor patch update that removes some layers in the Android side to get 1:1 plane detection compared with direct ARCore implementations.
See at v2.44.1 for more details.
v2.44.1
Release Notes – v2.44.1
AR Plane Detection & Selection – Major Update
ViroARPlaneSelector – Complete Rewrite
Accurate Plane Shape Rendering
- Planes now render using their actual geometric boundaries from ARKit/ARCore (via boundary vertices).
- Automatic fallback to rectangular visualisation when vertex data is not available.
- New
useActualShapeproperty to control rendering mode (default:true).
Map-Based Plane Tracking
- Replaced array-based tracking with
Map<string, ViroARPlaneType>for reliable and deterministic plane handling. - Plane identification now uses
anchorId, eliminating index-based race conditions. - Improved stability for both plane selection and update cycles.
Multi-Alignment Detection
- Added new alignment mode:
"Both"for concurrent horizontal and vertical plane detection. - 25 detectors per alignment type for broader and more consistent scene coverage.
- Enhanced scene understanding through simultaneous multi-plane detection.
Plane Classification Support (iOS)
- ARKit plane classification now exposed, including: Wall, Floor, Ceiling, Table, Seat, Door, Window.
- Classification data is included in all plane update callbacks.
- Enables semantic placement and surface-specific logic.
Enhanced Properties & Callbacks
onPlaneDetected?: (updateMap) => boolean— Validate planes before adding them.disableClickSelection?: boolean— Enables visual-only mode.useActualShape?: boolean— Controls shape rendering behaviour.
Visual Improvements
- Updated material to a bright, translucent blue (
rgba(0, 122, 255, 0.5)) for improved visibility. cullMode: "None"enabled for better Android rendering compatibility.- Corrected alpha blending and depth buffer behaviour.
ViroARPlane Improvements
Improved Vertex Handling
- More accurate 3D-to-2D vertex conversion for shape mapping.
- Unified coordinate system handling across iOS and Android.
- Corrected rotation logic for horizontal and vertical surfaces.
Enhanced Anchor Data
- Plane anchors now provide full metadata: position, rotation, scale, centre, and dimensions.
- Classification and vertex data included in all callbacks.
- Consistent and reliable
anchorIdtracking throughout the plane lifecycle.
Architecture & Performance
16KB Page Size Support
- Full compatibility with modern Android devices using 16KB memory pages.
Breaking Changes
Removed Properties (ViroARPlaneSelector)
maxPlanesremoved (replaced by dynamic 25-detector-per-alignment behaviour).ViroCommonPropsandViroObjectPropsremoved from type definitions.- These properties were previously documented but non-functional.
- The component now exposes only explicit, fully supported props.
Internal State Refactor
- Internal state has been migrated from an array to a
Map.- (This affects only direct internal state access and does not impact typical usage.)
v2.43.6
This is a patch release targeting the pod installation issues happening in EAS mainly. We have tested this update in different installation scenarios all with success.
v2.43.5
v2.43.5
iOS Improvements
- Fixed pod install issues: Rebuilt ViroCore framework for iOS
- Resolved pod installation failures
- Improved compatibility with modern CocoaPods versions
- Fixed framework architecture issues
Fabric Architecture Improvements
-
Enhanced Fabric compatibility: Migrated 30 methods across 8 Java modules to use Fabric's
UIBlockpattern- Fixed
ReactNoCrashBridgeNotAllowedSoftExceptionerrors in production - Replaced deprecated
getNativeModule(UIManagerModule.class)withUIManagerHelper.getUIManager() - Updated to use
com.facebook.react.fabric.interop.UIBlockandUIBlockViewResolver - Modules updated: ARSceneModule, ARSceneNavigatorModule, CameraModule, ControllerModule, NodeModule, SceneModule, SceneNavigatorModule, VRT3DSceneNavigatorModule
- Fixed
-
Improved prop handling: Added Fabric-aware error recovery system in VRTNodeManager
- Removed
isAttachedToWindow()checks that blocked prop updates in Fabric's pre-attachment phase - Implemented
safelyApplyProp()pattern with automatic retry on transient failures - Enhanced error logging for better debugging
- Refactored 28 @ReactProp methods for consistent error handling
- Reduced boilerplate code by ~250 lines
- Removed
-
Better resilience: Automatic prop retry handles GL context initialization timing issues
- Prevents props from being silently lost during scene transitions
- Recovers from view state timing issues on low-end devices
- Improved stability during AR session interruptions
v2.43.4
🛠 ReactVision 2.43.4
React Native 0.79 has several internal changes that break some features of the ReactVision platform, we have updated the dependencies and then tracked the major issues.
- Added support for Expo 53 and React Native 0.79.5
- Fixed props issues affecting various components and features (e.g. materials, sources, scale etc)
- Fixed ViroVideo remote URL not working.
- Fixed a context issue in ARSceneNavigator (thanks to iamprometheus)
v2.43.2
🛠 ReactVision 2.43.2 – Patch Release
This patch addresses several issues introduced in the previous release and brings improved stability across platforms.
🔧 Fixes
• Resolved linking issues that affected certain environments when integrating ReactVision.
• Fixed the Expo plugin compatibility for both Android and iOS, restoring expected behaviour.
• Patched internal problems in the new event handling layer, improving reliability and interaction consistency.
v2.43.1
🚀 React Native New Architecture Support
We’re excited to introduce support for React Native's New Architecture in the ReactVision (Viro) library! This release integrates with the new Fabric rendering system via a custom interop layer.
✅ What’s New
- Fabric Integration: Introduced a custom Fabric Interop Layer for seamless communication between JS and native code.
- Full Backward Compatibility: No migration steps required — continues to support existing usage and APIs (assuming you're using a compatible Expo version).
- Component Updates: Over 50 core components updated for compatibility with the new rendering pipeline.
📘 Notes
- Only New Architecture is supported from this release onward.
- No migration required — existing usage remains compatible.
- Updated examples for New Architecture will be published soon.
v2.43.0
📦 Release Notes – v2.43.0
🚀 What’s New
This release brings important stability improvements across both iOS and Android, along with full compatibility for Expo 52+ and React Native 0.76.9+. It also resolves a series of crashes and memory issues related to component unmounting, AR navigation, and property updates.
🔧 Fixes & Improvements
To improve compatibility, we've relaxed the version constraints for React Native and Expo. Projects can now run on Expo SDK 52 or higher, and React Native 0.76.9 or above, making upgrades smoother and less restrictive.
On iOS, we addressed crashes occurring during component unmounting—especially around navigation—by adding extra safety checks when accessing nodes and parent portal references. We've also improved the unmounting sequence to avoid accessing invalid memory.
For both platforms, we fixed errors that were happening when updating shadow node properties. These issues were caused by operations on null or already-detached nodes. We’ve added defensive coding, including try-catch wrappers and detailed error logging. On Android specifically, the onTearDown() method has been rewritten to ensure proper cleanup of resources, cancellation of active tasks, and state resets.
We also tackled AR-related crashes, especially on iOS, where the app could crash if methods were called on the SceneNavigator during teardown. Now, AR sessions are correctly finalised during cleanup.
Finally, we resolved memory leaks tied to ViroARPlaneSelector. This was caused by abrupt unmounting and improper handling of its child components. The selector logic has been refactored to ensure stability and prevent crashes.
✅ Recommended Update
To take advantage of all these fixes, we recommend updating your project to use:
- Expo SDK 52 or later
- React Native 0.76.9 or later
🧰 Troubleshooting
If you encounter issues after updating, first ensure your project is using the latest version of Expo. Most problems are resolved by aligning with the supported SDK and React Native versions.
v2.41.6
This is a hot fix, I found the Expo plugin was broken because of dependencies mismatch that cause a crash when trying to use ViroVideo.
It also updates the telemetry route, pointing it to ReactVision servers instead of the old NativeVision.