RepoNVIDIANVIDIApublished Nov 21, 2025seen Jun 26

NVIDIA/cloudxr-lovr-sample

Lua

Open original ↗

Captured source

source ↗
published Nov 21, 2025seen Jun 26captured Aug 29http 200method plain

NVIDIA/cloudxr-lovr-sample

Description: Stream your LÖVR VR applications wirelessly to supported headsets using NVIDIA CloudXR technology. This sample integrates CloudXR Runtime into LÖVR, enabling untethered VR experiences without physical cables.

Language: Lua

License: NOASSERTION

Stars: 34

Forks: 9

Open issues: 3

Created: 2025-11-21T20:23:10Z

Pushed: 2026-07-08T00:51:02Z

Default branch: main

Fork: no

Archived: no

README:

NVIDIA CloudXR™ LÖVR Plugin

NVIDIA CloudXR™ provides seamless, high-fidelity XR streaming over any network. This plugin integrates the CloudXR™ Runtime into LÖVR, a tiny, fast, open-source framework for OpenXR applications. Use it as a reference for integrating CloudXR™ into your own OpenXR apps.

  • CloudXR™ streams VR/AR rendering from a workstation or the cloud to the headset over the network instead of rendering on the headset.
  • LÖVR is an open-source XR engine built on OpenXR with Lua as the scripting language.

This plugin gives a LÖVR app three things:

1. Runtime management — automatically loads and configures the CloudXR™ service that handles wireless streaming. 2. Opaque data channels — optional bidirectional custom messaging between the app and the headset (app state, sensor data, etc.). 3. Audio streaming (Windows only) — server-to-headset audio streaming.

> Key point: CloudXR™ replaces the standard OpenXR runtime. It intercepts OpenXR calls and streams the rendered frames to a connected headset.

---

Quick Start (novice users)

This is the fast path. Follow it once and you'll have the sample running. For everything else (custom LÖVR commits, alternate device profiles, custom CloudXR.js builds, etc.) see [Advanced Configuration](#advanced-configuration).

Prerequisites

  • OS: Windows or Linux (macOS is not supported by CloudXR™).
  • GPU: NVIDIA GPU (NVIDIA RTX 6000 Ada recommended).
  • Headset: Apple Vision Pro (uses native CloudXR™ client), or Meta Quest 2/3/3S / PICO 4 Ultra (use CloudXR.js in the headset browser). PICO 4 Ultra requires HTTPS and needs you to bring your own CloudXR.js server — see [CloudXR.js configuration](#cloudxrjs-configuration).
  • Network: High-speed Wi-Fi (Wi-Fi 6 recommended), with the headset and workstation on the same network.
  • Build tools: CMake 3.10+, C/C++ compiler, git, curl.
  • Node.js v20.19.0 or later with npm — automatically used by the build to set up the CloudXR.js sample. Install it manually first if your system doesn't have it, or pass --without-cloudxrjs to skip the CloudXR.js sample setup entirely.

The build scripts download the CloudXR™ Runtime SDK and CloudXR.js package from NVIDIA NGC the first time they run. To use specific versions, see [Use a specific CloudXR Runtime / CloudXR.js version](#use-a-specific-cloudxr-runtime--cloudxrjs-version).

Apple Vision Pro

# Linux
./build.sh && ./run.sh

# Windows (US English keyboard, terminal NOT run as admin)
.\build.bat && .\run.bat

Then launch the native CloudXR™ client on Apple Vision Pro and connect to your workstation.

Meta Quest 2/3/3S (CloudXR.js over WebRTC)

# Linux
./build.sh && ./run.sh --device-profile=auto-webrtc

# Windows (US English keyboard, terminal NOT run as admin)
# Quote the profile arg so cmd.exe doesn't split on the '='.
.\build.bat && .\run.bat "--device-profile=auto-webrtc"

> PICO 4 Ultra users: skip the steps below — the PICO browser doesn't accept the insecure-origin workaround used here, so it requires HTTPS. Bring your own HTTPS CloudXR.js server and pass --without-cloudxrjs; see the HTTPS mode bullet in [CloudXR.js configuration](#cloudxrjs-configuration).

run.sh/run.bat automatically starts the CloudXR.js dev server on port 8080 when --device-profile=auto-webrtc is used. Then on the Quest:

1. Open the Meta Quest browser and navigate to http://:8080/. 2. Configure the browser to allow insecure origins so the page can use the WebXR API over HTTP. See the CloudXR.js client setup guide for the exact chrome://flags/unsafely-treat-insecure-origin-as-secure steps. 3. Press Connect in the page to start streaming.

> Note: The dev server runs over HTTP for the simplest local setup. For HTTPS, an existing CloudXR.js server on port 8080, or --without-cloudxrjs, see [CloudXR.js configuration](#cloudxrjs-configuration).

Verify it's working

A successful launch ends with these key messages (with other lines interleaved):

NVIDIA CloudXR Plugin Example
Loading CloudXR manager...

Loading NVIDIA CloudXR Runtime plugin...
NVIDIA CloudXR plugin loaded successfully
INFO [logServiceInfo] Created CloudXR™ Service
version:
tag:
...
uses: Monado™
NVIDIA CloudXR plugin initialized
CloudXR Library API Version:
CloudXR Runtime Version:
CloudXR device profile:
...
CloudXR Runtime initialized successfully

If the headset doesn't connect, jump to [Troubleshooting](#troubleshooting).

---

How It Works

Architecture

CloudXR™ replaces the standard OpenXR runtime with a custom one that streams content over the network:

1. Your LÖVR app renders VR content normally using OpenXR. 2. CloudXR™ Runtime intercepts OpenXR calls and captures the rendered frames. 3. Network streaming sends compressed frames to the headset. 4. Headset client receives and displays the streamed content. 5. Headset client sends poses and input back, which CloudXR™ Runtime forwards to the OpenXR app.

Key components

| Library (Windows / Linux) | Purpose | What it does | |---|---|---| | cloudxr.dll / libcloudxr.so | Service management | Starts/stops the CloudXR™ service, handles configuration | | openxr_cloudxr.dll / libopenxr_cloudxr.so | OpenXR interception | Replaces the standard OpenXR runtime, streams frames to the headset |

Integration outline

For developers integrating CloudXR™ into their own OpenXR application:

1. Set `XR_RUNTIME_JSON` to the CloudXR™ runtime manifest. 2. Load the CloudXR™ service library and resolve function pointers from cxrServiceAPI.h. See nvidia_cloudxr_runtime.c for an example. 3. Start the service: Create → Configure → Start the CloudXR™ service. 4. Initialize OpenXR. OpenXR calls are now intercepted and streamed.

> Critical: the...

Excerpt shown — open the source for the full document.