Adding CloudXR to a sample#
cloudxr-runtime/ is a shared top-level component, like server-runtime/.
Any sample can stream XR content to a device by adding one line to its
orchestrator and a configuration file in the sample root. For the broader
orchestrator pattern, refer to adding-a-sample.
1 — Add the process to the orchestrator#
PROCESSES = [
Process("hub", "../../server-runtime", "xr_media_hub"),
Process("cloudxr", "../../cloudxr-runtime", "cloudxr_runtime"), # ← add this
Process("worker", "worker", "my_agent_worker"),
]
2 — Add cloudxr_runtime.yaml to the sample root#
The launcher auto-discovers this file and passes it as --config.
# CloudXR runtime configuration.
cloudxr_install_dir: ~/.cloudxr
# Accept the NVIDIA CloudXR EULA non-interactively.
# View: https://github.com/NVIDIA/IsaacTeleop/blob/main/deps/cloudxr/CLOUDXR_LICENSE
# Written once to <cloudxr_install_dir>/run/eula_accepted; ignored on subsequent runs.
accept_eula: true
# Device profile — controls transport and XR device defaults.
# Valid: auto-native | auto-webrtc | apple-vision-pro | ipad-pro | quest3
cloudxr_env:
NV_DEVICE_PROFILE: auto-webrtc
# ── Ports (do not conflict with LiveKit) ──────────────────────────────────────
# CloudXR native service: localhost:49100 (internal)
# WSS proxy (TLS): 0.0.0.0:48322 (XR clients connect here; auto-webrtc only)
Notes#
CloudXR and the XR-Media-Hub are independent stacks. CloudXR streams simulation and render content directly to XR devices over WebRTC; the hub handles agent media via LiveKit. They share no ports.
The
auto-webrtcprofile starts a WSS proxy on port 48322 for WebRTC signaling. Theauto-nativeprofile uses a direct native transport and does not need the proxy.After CloudXR is ready, activate its environment to run an OpenXR app against it. Run this in a separate terminal each time you start a new shell against a running stack:
source ~/.cloudxr/run/cloudxr.env
For the full list of supported
NV_*environment variables, refer to the CloudXR runtime documentation.