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

Omniverse Realtime Viewer

OpenAIOfficialCreated by NVIDIA OmniverseDistributed by OpenAI

  • Skill
  • Meta (authoring, orchestration, planning, memory)
  • Software development
  • Apache-2.0
  • Medium risk

From the author

Use as the top-level router for Omniverse Realtime Viewer USD app requests 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 orchestrator for developing USD-based viewer applications. It provides a structured approach to selecting implementation recipes, enforcing architectural conventions, and managing dependencies. By utilizing a set of focused reference documents, it guides developers through the lifecycle of building, configuring, and validating viewer applications, ensuring consistent behavior across different delivery paths such as local workstations or streaming environments.

What it does

  • Routes development requests to specific implementation recipes based on the target delivery path.
  • Enforces architectural rules for USD rendering, stage management, and UI integration.
  • Provides guidance on camera selection, input handling, and viewport interaction.
  • Standardizes the integration of AOV switching and render product configuration.
  • Facilitates the capture of validation evidence for viewer readiness.
  • Maintains separation between user-provided USD files and application-specific session state.

When to use it

  • When initiating the development of a new USD viewer application within the Omniverse ecosystem.
  • When determining the appropriate delivery path for a viewer, such as local native or streaming.
  • When needing to implement consistent camera, selection, or UI behavior across viewer projects.
  • When integrating advanced rendering features like AOV switching into an existing viewer.

Advantages

  • Ensures architectural consistency across diverse viewer implementations.
  • Provides a clear, modular path for adding specific capabilities like input routing or data display.
  • Promotes clean separation of concerns between stage data and viewer-owned state.
  • Standardizes the validation process for consistent delivery.

Usage examples

“I need to build a browser-based viewer for USD files.”
The agent will route you to the streaming viewer recipe, providing guidance on WebRTC stream setup, UI integration, and viewport interaction.
“How do I implement AOV switching in my local USD viewer?”
The agent will provide the AOV switching reference, detailing how to map render vars and update the display state on the server.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/openai/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

This is the top-level entry point for the Omniverse Realtime Viewer skill package. It is self-contained: all required routing, conventions, and validation guidance live in the selected references.

Use the focused reference documents as implementation recipes. This file chooses the right recipes and preserves the architectural rules that must hold across all generated viewer apps.

Instructions

Start by classifying the requested viewer, then read only the references needed for that delivery path and feature set. Implement the render path first, layer interaction and UI behavior on top of it, and finish by capturing validation evidence from references/validation.md.

Read Order

  1. Read references/routing.md to choose the delivery path and focused references.

  2. Read references/conventions.md before implementing camera, input, selection, viewport, streaming protocol, scene loading, or environment behavior.

  3. For broad viewer requests, read references/usd-viewer-app/README.md.

  4. If the delivery path is unclear, read references/streaming-vs-local/README.md.

  5. If the prompt includes layout, panels, controls, inspectors, status, or UX, read references/viewer-ux-workflow/README.md and then the focused viewer UI references. This applies to React/WebRTC, Tauri, Electron, ovui, ovwidgets, and Dear ImGui apps; "frontend" means user-facing UI, not only browser UI.

  6. For viewport interaction, read references/viewer-input-routing/README.md before references/camera-controls/README.md, references/native-picking-selection/README.md, or references/object-selection/README.md.

  7. Read only the focused capability references needed for the requested app.

  8. Use references/validation.md to capture review evidence before handoff.

Non-Negotiables

  • Use ovrtx for all USD and 3D rendering.

  • Browser apps display an ovstream WebRTC video stream plus UI. The browser does not render USD geometry.

  • Do not substitute WebGL, Three.js, Babylon.js, PlayCanvas, A-Frame, model-viewer, react-three-fiber, glTF browser viewers, or other client-side 3D renderers.

  • If local validation cannot run because the GPU/runtime environment is absent, scaffold the ovrtx path and document the runtime requirement. Do not add a browser-renderer fallback.

  • Keep user USD files unmodified. Viewer cameras, render products, render vars, settings, selection metadata, and runtime state belong in session/composite layers or app state.

  • Keep one owner for renderer.step(), stage mutation, native picking, selection writes, and live attribute writes.

  • Keep dependency acquisition in references/dependencies/README.md and deployment choices in references/cloud-deployment/README.md; do not duplicate package locations or deployment setup.

Focused Reference Families

  • Entry points and recipes: references/usd-viewer-app/README.md, references/streaming-viewer-recipe/README.md, references/ovui-local-viewer-recipe/README.md, references/streaming-vs-local/README.md, references/electron-shm-viewer/README.md, references/ovwidgets-editor-shell/README.md.

  • Rendering and stage: references/ovrtx-rendering/README.md, references/stage-loading/README.md, references/stage-management/README.md, references/render-settings/README.md, references/aov-switching/README.md, references/stage-hierarchy/README.md, references/stage-queries/README.md, references/stage-attribute-reads/README.md, references/prim-transform-safety/README.md, references/usd-sample-data/README.md.

  • Delivery and runtime: references/streaming-server/README.md, references/streaming-client/README.md, references/streaming-messages/README.md, references/streaming-lifecycle/README.md, references/local-viewer/README.md, references/tauri-local-viewer/README.md, references/cpp-native-viewer/README.md, references/headless-shm-cli/README.md, references/viewer-backend-interface/README.md, references/webgl-shm-transport/README.md.

  • Viewer UI/UX: references/viewer-ux-workflow/README.md, references/viewer-layout-patterns/README.md, references/viewer-control-patterns/README.md, references/viewer-data-view-patterns/README.md, references/viewer-feedback-status/README.md.

  • Interaction: references/viewer-input-routing/README.md, references/camera-controls/README.md, references/object-selection/README.md, references/native-picking-selection/README.md, references/selection-feedback/README.md, references/selection-animation/README.md, references/transform-manipulator/README.md, references/gl-viewport-overlay/README.md, references/ovui-library/README.md, references/prim-pick-effects/README.md, references/prim-info-display/README.md, references/viewport-overlays/README.md.

  • Infrastructure: references/dependencies/README.md, references/windows-native-setup/README.md, references/cloud-assets/README.md, references/cloud-deployment/README.md, references/troubleshooting/README.md.

Build Workflow

  1. Classify the prompt by delivery path, target user, required capabilities, runtime environment, validation needs, and explicit constraints.

  2. Select a small reference set. Start with the recipe or routing reference, then add focused capabilities such as camera, picking, hierarchy, properties, render settings, transform tools, cloud assets, or deployment.

  3. Read selected references before writing app code. Follow their build order, import order, data-channel contracts, and renderer ownership rules.

  4. Implement the core render path first, then input routing and camera, then selection and data panels, then scene/settings features, then packaging or deployment.

  5. Treat the selected references as the behavior contract for API shape, compatibility, and generated project structure.

  6. Capture validation evidence before calling the viewer ready.

Examples

  • For a browser viewer request, use the streaming recipe references plus camera, picking, hierarchy, properties, render settings, and stream-status references.

  • For a local workstation viewer request, use the local or native delivery references plus renderer setup, stage loading, viewport input, and validation.

Completion Checklist

  • Selected references match the user's intent and delivery path.

  • No code path uses a browser-side 3D renderer for USD.

  • The generated app has one clear owner for render stepping and stage mutation.

  • User USD files remain untouched by viewer-owned session data.

  • Camera, input, selection, scene loading, and stream behavior follow references/conventions.md.

  • Setup/build/run results and visual interaction evidence are captured with references/validation.md.

Files

references/ovui-local-viewer-recipe/setup-shell-renderer.md

ovui Local Setup, Shell, And Renderer

2. Install Dependencies And Configure The Environment

Read references/dependencies FIRST. Its references/nvidia-runtime.md file is the source of truth for NVIDIA runtime locations. Do not guess or repeat ovui package URLs, wheel names, artifact locations, or fallback install commands in this recipe.

Do this:

  • Install ovrtx using the package guidance in references/dependencies.

  • Install ovui using the current PyPI package guidance in references/dependencies.

  • Install any selected local UI companion packages from the same ovui package set as the base UI package.

  • Install usd-core==24.11 when the local app needs pxr queries. Pin to 24.11 — newer versions cause TfType schema conflicts with ovrtx.

  • Install numpy for matrices, camera math, and CPU frame handling (pip install numpy).

  • Install warp-lang only when the local app needs CUDA-side display or image-processing utilities (pip install warp-lang).

  • Do not install ovstream or frontend streaming packages for a local-only viewer.

Set these environment contracts before starting the app:

  • OVRTX_SKIP_USD_CHECK=1 must be set before ovrtx is imported or the renderer is constructed.

  • OVRTX_BIN_PATH must point at the ovrtx bin directory when materials or renderer plugins fail to resolve.

  • The ovrtx plugin library path must be first in the dynamic library path if another USD build is present.

  • PYTHONPATH must include any ovui import paths required by the selected package.

  • A real display must be available. For headless validation, use a configured X display such as Xvfb.

Decision points:

  • If the local app imports pxr in the main process, follow the local import discipline documented in references/local-viewer.

  • If USD registry or DLL conflicts appear, isolate pxr queries into a subprocess and keep the main app focused on ovui plus ovrtx.

  • If the user only needs rendering and camera navigation, defer usd-core until hierarchy or bounds queries are required.

  • If running on Windows, read references/windows-native-setup before changing import order or subprocess strategy.

  • If local UI imports report missing package metadata or missing VIEWPORT_CAMERA_POSE_SOURCE, read references/dependencies and use one compatible local UI package set.

Common failure modes:

  • usd-core detected, duplicate USD debug symbols, _tf import failures, or MDL resolver crashes usually mean import order or library path is wrong.

  • Magenta materials usually mean OVRTX_BIN_PATH or plugin library path is missing.

  • ovui import failure usually means the selected package was not installed or its required import path is not on PYTHONPATH.

  • A blank or crashing local window in CI usually means no real display is available.

Read for depth: see references/dependencies, references/local-viewer, references/ovrtx-rendering, and references/windows-native-setup for the full environment contracts.

3. Build The ovui Window Shell

Do this in local_app/app.py and local_app/viewport.py:

  • Initialize ovui once with the requested title, width, height, and target FPS.

  • Create one main window that fills the app window.

  • Use a large central viewport, a compact header or toolbar, an optional scene tree or info sidebar, and an optional render settings panel.

  • Put the rendered image inside a viewport frame that can resize with the window.

  • Add a transparent hit surface above the image for mouse input.

  • Route toolbar actions to runtime commands such as load scene, reload, fit camera, clear selection, toggle tree, and toggle render settings.

  • For lightweight viewers, prefer a path field plus one LOAD button for scene loading. Add native file dialogs only after they are validated in the same display/session environment as the app.

  • Wrap ovui callbacks so exceptions are logged and do not tear down the app loop.

Critical contracts:

  • Use fill_app_window=True for the main ovui window so the UI frame tracks GLFW window resizes.

  • The viewport widget must report its current size or provide a reliable fallback so letterbox math remains valid.

  • The transparent mouse surface must be above the image and marked as receiving mouse events.

  • Header, tree, info, and settings widgets must not intercept viewport gestures unless the pointer is actually over those controls.

  • The app loop must call runtime tick/update work from one predictable place.

  • If a selected-prim transform gizmo is visible, dragging it must write the selected prim's live omni:xform through the serialized renderer runtime; a visual-only handle is not complete.

Decision points:

  • If the user wants a compact visual tool, keep a header plus viewport and place advanced panels in collapsible sidebars.

  • If the user wants a dense inspection app, reserve width for a stage tree and prim info panel from the start.

  • If the user wants a context menu, show it on right-button release only when the drag threshold was not exceeded.

  • If the user wants a camera gizmo, build it as a local ovui scene overlay rather than using streaming overlay patterns.

  • If the user wants selected-prim movement in a lightweight shell, either use a proven transform manipulator that emits transform deltas or add an app-owned fallback that treats presses near the selected pivot as transform drags.

Common failure modes:

  • Without fill_app_window=True, the OS window resizes but the UI frame stays at the initial dimensions.

  • If the hit surface is behind the image or not opaque to mouse events, orbit, pan, zoom, and picking never receive input.

  • A separate OPEN button can be worse than no button if the native dialog is not implemented or cannot appear under the target display stack. Keep the path-field LOAD path reliable and make dialogs secondary.

  • A selected-prim gizmo that appears but does not move the prim usually means handle input is being consumed by camera/orbit logic or the manipulator is not connected to renderer.write_attribute.

  • Uncaught callback exceptions can stop the app loop or leave drag state stuck.

  • DOM-style browser assumptions do not apply; input comes from ovui callbacks in the desktop process.

Read for depth: see references/local-viewer, references/viewer-input-routing, references/camera-controls, and references/viewport-overlays for ovui shell, input routing, context menu, and local overlay guidance.

4. Construct The ovrtx Renderer Runtime

Do this in local_app/renderer_runtime.py:

  • Create the ovrtx renderer after environment variables are set and import order is settled.

  • Use synchronous rendering first.

  • Store the active render product path, render width, render height, current frame index, and whether a valid stage is loaded.

  • Expose render-loop-only operations for loading a scene, resetting the stage, stepping a frame, mapping render vars, enqueueing and decoding native pick queries, writing native selection outline groups, and writing live attributes.

  • Keep renderer mutations serialized with scene loading, scene reset, settings changes, and camera writes.

Critical contracts:

  • The application calls renderer.step() explicitly. ovrtx does not run a hidden app loop for the viewer.

  • Pass the exact viewer RenderProduct path to every step call.

  • Extract LdrColor for local image display. It is RGBA8 from ovrtx.

  • For local UI display, copy CPU-mapped pixel data inside the map context before returning it to the widget.

  • Use write_attribute for live camera transforms and other live state. Write omni:xform, not authored xformOp:*, for interactive updates.

  • Use the correct transform semantic and create-new prim mode for attributes that may not already exist in Fabric.

Decision points:

  • If the app only needs basic local viewing, start with LdrColor only.

  • Object selection uses native ovrtx pick queries. Do not add segmentation render vars just to make picking work.

  • If the app needs high-FPS local display, profile CPU readback first before introducing a CUDA-to-UI path.

  • If the renderer reports stale GPU hangs after a crash, inspect running Python GPU processes before changing code.

Common failure modes:

  • Unable to find RenderProduct prim means scene setup did not create the path used by renderer.step().

  • Black frame usually means camera relation, render product resolution, render var source, or camera transform is invalid.

  • Live camera changes doing nothing usually means the app wrote xformOp:transform instead of omni:xform, or used existing-only prim mode.

  • Crashes during scene switches usually mean renderer.step() overlapped a reset, load, or layer mutation.

Read for depth: see references/ovrtx-rendering for the full renderer construction, frame extraction, and live attribute contract.

5. Implement Scene Loading

Do this in local_app/scene_loader.py and call it only from the render loop or serialized runtime load path:

  • Resolve the requested URL/path against the configured asset root, allowed schemes, and security policy.

  • Create viewer-owned camera, RenderProduct, RenderVar, and RenderSettings data through one inline root/session USDA string when the user stage lacks viewer render config.

  • Load the user stage without modifying it.

  • Store the viewer camera path and render product path in runtime state.

  • Reset selection, native selection outline groups, stage query caches, pending pick queries, and loading status for the new stage.

  • Fit the camera to the stage bounds unless the user requested preserving the current camera or using an authored stage camera.

Critical contracts:

  • Every loaded stage needs Camera -> RenderProduct -> RenderVar -> RenderSettings wiring that ovrtx can find.

  • The viewer camera path must be the same path used by camera controls when writing omni:xform.

  • Do not inject lights unless the user explicitly asks for viewer-controlled lighting.

  • Include segmentation render vars only for explicit debug/AOV display modes, not for picking.

  • Prefer renderer.open_usd_from_string() for inline roots that sublayer the user USD and author viewer render config.

  • Do not call reference or layer-add APIs after a stage is already loaded unless the renderer has been reset to an empty stage and the operation is part of the serialized load path.

Decision points:

  • Use a single inline root USDA string with subLayers = [@user_scene@] when the user file needs viewer camera/render-product/render-var data.

  • If the user stage has an authored camera and the requested policy is stage-camera, copy its focal length, apertures, clipping range, and transform into the viewer camera.

  • If the user requests persistent camera across scene switches, keep camera state but sanitize and refit only when the old state is invalid for the new bounds.

  • If the user requests viewer lighting controls, add explicit viewer-owned light prims only with a verified live apply path or an explicit reload/profile workflow; otherwise leave lighting untouched and omit live lighting controls.

Common failure modes:

  • Inline roots that omit or misquote the user sublayer path fail composition or break relative asset resolution.

  • Camera path mismatch makes input appear connected but the view never moves.

  • A stage-load operation that reports an error must not be treated as a successful load just because the enqueue call returned.

Read for depth: see references/stage-loading, references/render-settings, references/selection-feedback, and references/stage-hierarchy for the full scene setup contract.

6. Display The Rendered Image

Do this in local_app/viewport.py:

  • Create an ImageBridge with the render width and height.

  • Display the bridge provider through an ovui image widget using preserve-aspect fit.

  • Before connecting ovrtx output, push a synthetic RGBA gradient through the same provider path and capture a window screenshot proving the native widget paints nonblank, non-solid pixels.

  • On each rendered frame, update the bridge with copied RGBA pixels from LdrColor.

  • Compute the visible image rectangle inside the viewport widget after every resize.

  • Store the current widget size, visible image offset, visible image size, render width, and render height for input mapping.

  • Show explicit idle, loading, and error states when no frame should be displayed.

Critical contracts:

  • The ovrtx LdrColor buffer is RGBA8 and is suitable for local image display through ImageBridge.

  • Copy CPU-mapped pixel data while the render var map context is still open.

  • Preserve-aspect display creates letterboxing. All pick and camera coordinates must pass through the same letterbox transform.

  • If render resolution changes, recreate or resize all dependent state: render product, ImageBridge, letterbox math, pending pick coordinate state, and viewport overlays.

  • Do not run scene load/reset work while the image update is reading render output.

  • A nonblank direct LdrColor artifact plus a blank ovui window points at presentation, not scene setup. Fix or switch the ovui presentation path before changing camera, render product, or USD composition.

  • If ImageBridge or ByteImageProvider updates do not paint in the active ovui runtime, validate with another ovui-native presentation path such as a RasterImageProvider screenshot/frame fallback instead of continuing to debug renderer state.

Decision points:

  • If the target is a simple viewer, keep render resolution fixed and let the image widget scale with letterboxing.

  • If the target requires pixel-perfect viewport resolution, treat resize as an explicit render product reconfiguration path.

  • If the app needs a screenshot command, read from the same copied LdrColor frame used by display unless a higher-quality render path is requested.

  • If CPU readback is too slow, investigate a GPU-native UI path only after the basic Omniverse Realtime Viewer is correct.

Common failure modes:

  • Reading pixels after the map context closes returns invalid or stale data.

  • Ignoring letterboxing makes picks offset and camera drag speed inconsistent.

  • Recreating the image bridge on every frame causes flicker, memory churn, or UI stalls.

  • Changing render resolution without updating viewport math and pick query coordinates causes selection to drift.

  • A solid red, brown, or unexpectedly light background can be a style-color byte order problem. ovui integer colors are 0xAARRGGBB.

Read for depth: see references/local-viewer, references/ovrtx-rendering, and references/object-selection for image bridge, frame extraction, and coordinate mapping details.

Requirements and compatibility

Written for: OpenAI Codex

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.

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
OpenAI (Official)
Distributed by
OpenAI
Source
openai/plugins · plugins/nvidia/skills/omniverse-realtime-viewer · commit d420d13
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (written by AutoGineer)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

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

Download ZIP

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