Generated banner for Omniverse Realtime Viewer
Generated logo for Omniverse Realtime Viewer

Omniverse Realtime Viewer

NVIDIAOfficialCreated by NVIDIA Omniverse

  • Skill
  • Tool integration
  • Software development
  • Apache-2.0
  • Medium risk

From the author

Use as the top-level router for Omniverse Realtime Viewer USD apps, XR delivery, SPG GPU processing, stylized rendering, and focused viewer reference documents.
— the description by NVIDIA Omniverse

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The Omniverse Realtime Viewer skill acts as a central routing and architectural framework for developing USD-based 3D viewer applications. It provides a structured approach to composing rendering, scene state, and delivery mechanisms, ensuring that developers can integrate OVRTX rendering, OVStage scene management, and various UI or streaming adapters effectively. The skill emphasizes a modular architecture where the viewer runtime, UI/input adapters, and delivery systems are decoupled, allowing for consistent behavior across local and streamed environments.

What it does

  • Provides a routing architecture for USD viewer apps, XR delivery, and GPU-accelerated rendering.
  • Defines the separation of concerns between viewer runtime, UI adapters, and delivery systems.
  • Offers guidance on integrating OVRTX for high-fidelity 3D rendering.
  • Establishes conventions for camera interaction, scene state management, and input handling.
  • Supports the implementation of specialized features like stylized rendering and CAE/CFD visualization.
  • Provides protocols for agent-to-UI communication and scene control.

When to use it

  • When starting the development of a new USD-based realtime viewer application.
  • When integrating advanced rendering features like stylized visualization or AOV switching.
  • When building XR or spatial editing capabilities into an existing Omniverse application.
  • When you need to standardize the architecture for local and streamed viewer deployments.
  • When implementing chat-driven scene control or agent-based inspection of a 3D scene.

Advantages

  • Promotes a clean, modular architecture that separates rendering logic from UI and transport.
  • Ensures consistent behavior across different delivery methods, such as local windows or WebRTC streaming.
  • Provides clear paths for extending functionality without disrupting the core viewer runtime.
  • Facilitates the integration of complex simulation and visualization data into the viewer.
  • Standardizes conventions for scene state, selection, and camera control.

Usage examples

“How do I set up a basic USD viewer application using the Omniverse Realtime Viewer architecture?”
The agent will guide you to start with the viewer app reference, resolve dependencies, and implement the core runtime owner to manage the OVStage and OVRTX renderer.
“I need to add stylized rendering to my existing viewer. Where should I start?”
The agent will direct you to the stylized visualization references to implement the required USD/Lua/CUDA nodes within your existing runtime owner.
“How can I enable an AI agent to control the viewer scene?”
The agent will point to the A2UI Scene Copilot reference to implement an operation interface that allows the agent to send commands through the existing runtime owner.
“How do I switch between different render outputs like beauty and depth in my viewer?”
The agent will explain how to use the AOV switching reference to map RenderVars and update the RenderProduct's orderedVars through the runtime owner.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/nvidia/omniverse-realtime-viewer/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip omniverse-realtime-viewer.zip -d .agents/skills

Documentation by NVIDIA Omniverse

<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->

<!-- SPDX-License-Identifier: Apache-2.0 -->

Omniverse Realtime Viewer

Build responsive USD viewers by composing OVRTX rendering, OVStage scene state, and the delivery/UI libraries appropriate to the app. Use this package for viewer architecture and interaction; use each selected SDK's upstream guidance for installation and exact release-specific APIs.

Start With The App

  1. When delivery is explicit, select its recipe through references/routing.md and follow its current phase. Otherwise start with references/usd-viewer-app/README.md. For an existing app, keep its architecture and read only the references for the requested change. Broad app, conventions and UI catalogs are lookups as needed.

  2. Resolve the selected libraries through references/dependencies/README.md. Preserve the project's manifest unless an upgrade is requested.

  3. Build a working frame and camera interaction in the chosen shell, then add the requested capabilities. Read references/conventions.md for shared input, camera, selection, and protocol conventions.

  4. Use references/viewer-ux-workflow/README.md for broader interface design. Loading, selection feedback, errors, and input responsiveness belong in the first working app, alongside rendering.

  5. Validate the actual delivery path with references/validation.md. A browser screenshot does not validate a native window or a different transport.

Architecture

OwnerResponsibility
Viewer runtimeOwn the live OVStage, publication clock, OVRTX renderer, scene changes, and render stepping.
UI and input adapterDisplay frames and copied app state; send user intent to the runtime owner.
Storage/query/simulation workersPerform their assigned work and return results through the selected integration boundary.
Delivery adapterPresent locally or stream through ovstream; respect frame ownership and backpressure.

Use OVRTX for USD/3D rendering. Browser apps display its WebRTC video; local apps present its output through their native shell. A missing GPU means rendering is unverified, not a reason to substitute a browser 3D renderer.

Keep viewer cameras, settings, effects, and transient edits in app-owned session or runtime state so the source USD stays intact. Serialize scene mutation and render stepping through the runtime owner. Read references/ovstage-ovrtx-integration/README.md for that loop, then the population or data-plane references when implementing scene loading or attribute writes.

Keep expensive loading and metadata work off the UI and render threads. Keep transport details behind a delivery adapter so camera, selection, properties, and loading state can be reused across local and streamed shells.

Add Capabilities As Needed

Use references/routing.md to select camera/picking, scene management, render settings, cloud assets, simulation, editor tools, deployment, or CAE/CFD visualization. Read the selected capability's implementation flow and its linked contract; the full reference catalog is not a prerequisite for a first frame.

For simulation, use the routing reference's Simulation Ecosystem section plus references/realtime-sim-integration/README.md. For UI-driven forces or control, add references/interaction-round-trip/README.md.

For example scenes, use references/usd-sample-data/README.md. When a runtime failure needs diagnosis, use references/troubleshooting/README.md and the selected SDK's matching release guidance before changing the architecture.

Solid Modeling: Upstream First

For usd-brep, exact BRep, solid modeling, kernel failures, CAD topology, or BrepArray questions, first read references/dependencies/README.md → USD BRep. Follow the owning repository's current agent guidance, skills, operation docs, and package API before selecting local integration references. Discover the upstream router rather than assuming skill names or directory layouts remain fixed. Upstream owns modeling semantics, schema rules, tuning, and diagnostics; this package owns OVRTX display, worker handoff, selection mapping, and publication timing.

GPU Processing And Stylized Viewers

For custom GPU processing, chained outputs and lens sampling, read references/spg-processing/README.md. For toon, ink, technical/X-Ray styles, geometry strokes or full wireframe, continue to references/stylized-visualization/implementation.md. Its USD/Lua/CUDA starting node and geometry/depth/composite build sequence work with the selected viewer recipe; use references/stylized-visualization/style-recipes.md for the preset math and references/stylized-visualization/README.md for supporting contracts. Implement the result inside the existing OVRTX/runtime owner and deliver the published processed output. These instructions do not require a sample checkout or a prior stylized-rendering implementation.

For an optional usd-brep geometry source, first read references/dependencies/README.md → USD BRep and the owning repository's current agent guidance, skills, and operation docs; then read references/stylized-visualization/usd-brep-source.md for the display boundary.

XR Viewers

For headsets, immersive viewers, or spatial editors, start with references/xr-viewer-recipe/README.md. Resolve SDK setup and contracts through references/dependencies/ovxr.md; the library owns OpenXR lifecycle and frame submission. For controllers, hands, navigation, or scene tools, add references/xr-spatial-input/README.md and references/ovxr-python-interactions/README.md. For projection-integrated UI, read references/ovxr-composition-ui/README.md and references/ovxr-composition-ui-validation/README.md.

Files

references/streaming-vs-local/README.md

Streaming vs Local Omniverse Realtime Viewer

Use this before choosing the app shell. Local lightweight, Tauri/Rust, Electron + SHM, and streaming paths can share USD stages, renderer concepts, storage resolution, camera math, selection logic, and query helpers, but they optimize for different users and deployments.

Focused viewer paths in this skill package separate lightweight viewers from the full-editor shell. If the user explicitly requires an editor shell with docking, undo, transform gizmos, and editor lifecycle, read ovwidgets-editor-shell.

Choose Tauri/Rust When

Use a Tauri 2.0 desktop app with Rust FFI to OVRTX when:

  • The user runs on the GPU workstation but you need web-technology UI (React).

  • No Python runtime dependency is acceptable.

  • You want to share UI components or styling with the WebRTC streaming Omniverse Realtime Viewer.

  • The target is a packaged desktop binary (.exe/.app) rather than a script.

  • A ViewerBackend interface must be shared across local and web paths.

Architecture:

React WebView (Vite/Tauri)
  -> useTauriBackend.ts (ViewerBackend)
  -> Tauri IPC invoke / Channel
  -> Rust render thread
  -> ovrtx C FFI (step/map/write)
  -> CPU-mapped RGBA -> binary push to WebView

See skill: tauri-local-viewer

Choose Electron + SHM When

Use electron-shm-viewer when:

  • The app runs locally on the GPU workstation.

  • The renderer should stay in a separate Python process (not embedded in the UI process).

  • The UI should be Electron + React, sharing components with streaming and Tauri frontends.

  • Python is acceptable for the server, but should not run inside the UI process.

  • You want raw local frames without WebRTC, video codecs, or network transport.

  • The same JSON event_type/payload protocol as streaming is needed, but over IPC/local transport.

  • The frontend uses useShmBackend behind the same ViewerBackend interface.

Architecture:

Electron React renderer
  -> useShmBackend.ts (ViewerBackend)
  -> Electron preload / IPC
  -> N-API C++ addon
  -> POSIX SHM (/dev/shm)
  -> Python ovrtx render server
  -> ovrtx renderer.step()

See skill: electron-shm-viewer

Choose Local Lightweight When

Use local-viewer when the user runs on the GPU workstation and wants a focused app:

  • Full desktop interactivity without a network stack.

  • Header, viewport, narrow sidebar, scene switching, picking, info display, and settings.

  • Access through local monitor, Xvfb, VNC, or similar.

  • One operator or developer workflow.

python -m local_app
  -> ovui standalone GLFW window
  -> ImageBridge/ImageWithProvider
  -> ovrtx renderer
  -> local GPU framebuffer

Full Editor Requests

Do not route full-editor requests to the lightweight local-viewer path.

For a focused Omniverse Realtime Viewer that needs inspector-style features, combine local-viewer with focused references:

  • stage-hierarchy for the hierarchy tree and variants.

  • prim-info-display for selected prim properties.

  • selection-feedback and selection-animation for visual selection state.

  • render-settings and viewport-overlays for controls and viewport UI.

Choose ovwidgets-editor-shell only when the requested experience truly needs full-editor capabilities:

  • Built-in stage browser, property inspector, layer/content windows, selection outline, transform gizmos, camera inertia, and undo.

  • Docking, shortcuts, themes, settings, status bar, and editor lifecycle.

Choose Streaming When

Use ovrtx + ovstream + WebRTC + React when the Omniverse Realtime Viewer must run remotely:

  • Browser clients connect to a GPU host.

  • Remote access, web UI, auth, routing, embedding, or service deployment matters.

  • Input travels over the NVST native input channel; app state travels over the WebRTC data channel.

  • Frames must be encoded/transported to another machine.

React/Vite frontend
  <-> WebRTC signaling/data/video
  <-> ovstream server
  <-> Python render loop
  <-> ovrtx renderer
  <-> CUDA/NVENC

Shared Pieces

  • USD stage assets and composition patterns.

  • ovrtx concepts: camera prims, render products, LdrColor, renderer.step(), and write_attribute().

  • Optional S3-compatible asset sync to a local cache.

  • Stage query logic, picking/highlight concepts, camera math, and transform-authoring conventions.

  • GPU/display/headless environment setup, OVRTX_SKIP_USD_CHECK, and stale GPU process checks.

Differences

ConcernLocal lightweightTauri/RustStreaming
UIovui lightweight shellReact WebView (Vite)React/Vite, optional server ovui overlays
LanguagePythonRust + TypeScriptPython + TypeScript
Transportlocal framebufferTauri binary IPC ChannelWebRTC video + data channel
Interactiondirect in-process API callsWebView events -> Tauri invoke/direct native callsNVST native input channel -> binary InputEvent structs
Panelslocal sidebar/panelsReact components via ViewerBackendReact components via JSON server APIs
Lifecyclelocal app loopTauri + render threadserver owns renderer + frontend connection

Decision Rule

When the user does not name a UI framework, default to a React-based shell. Choose streaming/WebRTC when browser access, remote GPU execution, embedding, or web deployment is plausible. Choose Tauri when the user clearly wants a packaged local desktop binary. Choose the lightweight ovui path only when Python, omni.ui, native local UI, or an in-process viewer is explicit.

Start streaming if the GPU is remote, the user must stay in a browser, or the Omniverse Realtime Viewer must integrate with a web product.

Start Tauri if the app runs on the GPU workstation, needs a web-tech UI (React), wants to share components with the streaming path, and should ship as a native binary without Python.

Start Electron + SHM for local GPU apps that need React/Electron UI, process isolation, Python ovrtx server, and raw local frames without WebRTC.

Start local lightweight (Python/ovui) for a focused viewer without editor affordances.

For full editor shell requests, use this skill only for preliminary routing. Then follow the full-editor guidance provided by the current ovui dependency guidance if it is available; otherwise state that this skill package does not define a full-editor implementation path.

Choose the renderer topology deliberately. A Tauri app should not bring in ovstream or ovui. An Electron SHM app should not bring in ovstream WebRTC, NVENC, or browser streaming unless it is also intentionally exposing a remote co-viewing stream. A streaming app should not depend on Tauri IPC. A local ovui app should not bring in WebRTC.

Input Path Contract

  • WebRTC: use NVST's native input channel by default. Browser mouse, keyboard, wheel, and touch input reaches server.on_input as binary InputEvent structs. A browser JSON fallback is allowed only after viewer-input-routing verifies that native callbacks are absent while the data channel works; it must replace, not duplicate, native camera input.

  • SHM: use ovstream.Client(ovstream.ClientType.SHM, stream_name="...").send_input_event(event) from Python, or ovstream_client_send_input_event(client, event) from C, to send InputEvent structs. Do not use JSON mouseInput for SHM camera control.

  • In-process: call the Python/C++ camera, selection, and settings APIs directly from the local UI/event loop.

Read viewer-input-routing before implementing any path that handles camera gestures, click picking, viewport input ownership, or transport button ids.

Streaming Loop Skeleton

import os
os.environ.setdefault("OVRTX_SKIP_USD_CHECK", "1")
import ovrtx
ovrtx.register_schema_paths()
import ovstage
from ovstage import PopulationDomain, population

stage = ovstage.Stage("viewer")
# Populate the viewer-owned composite, wait, then publish ordinal 1.
population.open_usd_from_string(stage, composite_usda, ordinal=1, domains=PopulationDomain.RENDERING)
stage.advance_write_floor(1).wait()
renderer = ovrtx.Renderer(...)
renderer.attach_ovstage(stage)
server = ovstream.Server()
server.on_message = handle_message
server.on_input = handle_input
server.start(config)
while running:
    products = renderer.step(render_products={render_product}, delta_time=dt, ordinal=runtime.current_committed_ordinal)
    stream_ldr_color(products[render_product])  # helper maps/copies before returning

Keep shared code below the shell boundary: stage resolution, storage sync, USD metadata queries, camera math, and renderer setup. Keep UI state, input routing, and lifecycle in the chosen shell.

Gotchas

  • Local import order: set OVRTX_SKIP_USD_CHECK=1, import ovrtx, call ovrtx.register_schema_paths(), then create/populate OVStage. Keep pxr behind the selected isolation boundary; do not let another OpenUSD consumer initialize before schema registration.

  • Streaming import order can differ, especially when pxr is isolated in a worker.

  • LdrColor casing is required in all paths.

  • Browser media ports are negotiated by WebRTC; do not manually invent frontend media-port settings.

  • Local frame readback may be hidden inside a widget; streaming must explicitly map/copy/encode frames.

  • Tauri frame delivery is raw RGBA binary Channel push — no JPEG/base64 encoding.

  • Kill stale Python GPU processes before diagnosing renderer hangs.

See also: tauri-local-viewer, local-viewer, dependencies, viewer-input-routing, streaming-client, streaming-server.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Python, Needs Node.js

The author says: Orchestrator skill. Downstream focused references may require NVIDIA GPUs, ovrtx, ovstream, ovui, OpenUSD, Python, Node/React, Tauri, Electron, C++, or cloud GPU deployment access depending on the selected viewer path.

Security

What our scanner noticed· Medium risk

  • Large base64-encoded blobs
  • Instructions that use the network

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
NVIDIA Omniverse
Publisher
NVIDIA (Official)
Source
NVIDIA/skills · skills/omniverse-realtime-viewer · commit fce3cca
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE-APACHE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by NVIDIA Omniverse or NVIDIA.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download omniverse-realtime-viewer.zip