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/streaming-viewer-recipe/interaction-features.md

Streaming Interaction Features

9. Add Camera Controls

Read references/viewer-input-routing first for transport button mapping, viewport ownership, wheel deltas, and click-vs-drag dispatch. Then implement camera math in server/input_router.py and server/camera_controller.py:

  • Track mouse press, movement, release, buttons, wheel, keyboard modifiers, and viewport dimensions from ovstream InputEvent callbacks.

  • Convert browser input coordinates into render-image coordinates, accounting for letterboxing or scaling.

  • Use drag thresholding so a short left press/release selects and a left drag orbits.

  • Support orbit, pan, dolly/zoom, wheel zoom, fit-to-stage, and optional WASD fly mode when requested.

  • Set camera aspect from the fixed RenderProduct resolution; keep horizontal aperture stable and derive vertical aperture from height / width.

  • Sanitize camera state before input handling and before writing matrices.

  • Write the viewer camera transform to the camera prim through ovrtx live attributes.

Critical contracts:

  • The camera is a USD prim. Camera movement writes omni:xform on the viewer camera path.

  • Use the row-vector matrix layout expected by USD/ovrtx: basis vectors in rows and translation in the final row.

  • Clamp elevation away from straight up/down singularities.

  • Clamp camera distance above a small positive minimum.

  • Skip camera writes when any matrix value is non-finite.

  • Use the same world-up convention as the scene when fitting and orbiting.

  • Left-click selection fires only on release if movement stayed below the drag threshold.

  • Do not use JSON messages for routine pointer movement.

  • The browser displays the fixed-resolution stream with object-fit: contain; use the letterbox transform for any app-owned coordinate math, while NVST handles stream input mapping.

Decision points:

  • If the user wants DCC-style navigation, use Alt+left for orbit, Alt+middle for pan, and Alt+right for dolly while preserving left-click selection.

  • If the user wants simple browser navigation, use left drag orbit, middle drag pan, right drag dolly, and wheel zoom.

  • If the stage has an authored camera and the app policy is to use it, initialize viewer camera settings from that camera before allowing interaction.

  • If the user requests camera UI buttons, send high-level camera commands over the data channel; keep continuous pointer input in ovstream input.

Common failure modes:

  • Putting matrix basis vectors in columns instead of rows places the camera inside, behind, or under the scene.

  • Ignoring letterboxing makes picks and orbit centers offset from the visible image.

  • Treating every left release as selection causes accidental selections after orbit drags.

Read for depth: see references/viewer-input-routing, references/camera-controls, and references/stage-hierarchy for the full input, camera math, and bounds contracts.

10. Add Object Selection And Highlighting

Do this in server/selection_controller.py; the completed click gesture should come from references/viewer-input-routing:

  • On left mouse release after a click gesture, map the visible image coordinate to the render pixel coordinate and enqueue a native ovrtx pick query.

  • After the next render step, read the synthetic ovrtx_pick_hit render var, validate its params, resolve primPath ids to USD prim paths, and deduplicate the result.

  • Maintain selected prim paths in server state.

  • Send stageSelectionChanged whenever selection changes.

  • Support selectPrimsRequest from the frontend for tree-driven selection.

  • Clear selection on selectPrimsRequest with an empty path list, scene reset, or scene switch.

  • Apply visual selection feedback by writing native selection outline group attributes on the runtime stage, not by permanently editing the user USD.

Critical contracts:

  • The pick query rectangle uses render-product pixel space after letterbox/scaling correction.

  • Picking coordinates must use render-pixel space after letterbox/scaling correction.

  • Selection state is server-authoritative. The frontend mirrors it from stageSelectionChanged.

  • Enable selection outlines at renderer creation and set per-group outline/fill colors with Renderer.set_selection_group_styles(...).

  • Clear previous outlines by writing group 0; assign selected prims to a non-zero group such as 1.

  • Do not let selection picking run while the scene is loading or the renderer is resetting.

  • Check operation status for the stage load, render step, and pick query before changing selection. An empty or failed pick should not corrupt the previous selected state.

Decision points:

  • If the user only asks for tree selection, implement selectPrimsRequest first and defer click picking.

  • If the user asks for visual highlight, use native selection outlines after selection state works.

  • If the user asks for hover, multi-select, or marquee selection, extend the protocol with explicit event names and keep final selected state server-authoritative.

  • If selection needs property display, trigger or expect a getPropertiesRequest for the selected prim rather than stuffing full properties into every selection event.

Common failure modes:

  • Selection appears offset when coordinate transforms ignore video scaling or letterboxing.

  • No pick result arrives when the query was enqueued for a different RenderProduct than the next renderer.step().

  • Highlight persists across scene loads when old selection outline groups are not cleared.

  • Frontend and server selection diverge when the frontend mutates local selection without waiting for stageSelectionChanged.

Read for depth: see references/viewer-input-routing, references/object-selection, references/selection-feedback, and references/prim-info-display for the full input, picking, highlighting, and info contracts.

11. Add Scene Switching And Asset Browsing

Do this in server/scene_manager.py, server/assets.py, and frontend/src/components/ScenePicker.tsx:

  • Build a server-side scene registry from configured local sample paths or an allowed asset root.

  • Expose scene choices to the frontend through a message or static config that does not leak arbitrary server filesystem paths.

  • When the user selects a scene, send openStageRequest with the scene URL or registry id.

  • In the server render loop, enter loading state, stop stepping the old scene, reset renderer stage state, create the new inline root/session data, load the new stage, restore persistent settings, fit or restore camera, clear selection, and resume streaming.

  • Send loading progress/activity events during long loads.

  • Send openStageResult after load success or failure.

  • Send root hierarchy after successful load or when the frontend requests it.

Critical contracts:

  • Never call renderer.step() concurrently with scene reset/load.

  • Preserve render settings across scene switches unless the user explicitly asks for per-scene settings.

  • Preserve camera across scenes only when that policy is requested and the old camera state is valid for the new bounds; otherwise fit to the new stage.

  • Recompute hierarchy, properties cache, variants cache, bounds, pickability filters, and selection outline state for the new stage.

Decision points:

  • If assets are local files, validate paths against an allowed root and reject traversal outside it.

  • If assets are cloud-backed, use references/cloud-assets and keep cloud logic behind the same asset registry interface.

  • If scene load fails, keep the previous scene streaming if it is still valid, or enter idle/error state with a clear frontend error.

  • If variant changes require stage reload, route them through the same load lock and loading-state path as scene switching.

Common failure modes:

  • Leaving render loop active during reset produces intermittent crashes or corrupted frames.

  • Not clearing caches after scene switch shows stale tree children or properties.

  • Persisting a camera blindly can place the viewer far away from a very different scene.

  • Returning raw absolute server paths to the browser exposes local filesystem details.

Read for depth: see references/stage-management, references/stage-loading, references/stage-hierarchy, and references/cloud-assets for the full scene switching and asset contracts.

12. Add Hierarchy, Properties, And Variants

Do this in server/stage_queries.py, frontend/src/components/StageTree.tsx, and frontend/src/components/PrimInfoPanel.tsx:

  • Query root children after a scene loads.

  • Load tree children lazily through getChildrenRequest.

  • Represent each prim with name, path, type, and child-load state.

  • Fetch properties for the selected prim through getPropertiesRequest.

  • Fetch variants through getVariantsRequest and apply changes through setVariantRequest.

  • After variant changes, refresh affected hierarchy, properties, bounds, and selection if the variant changes composition.

Critical contracts:

  • Do not perform long USD traversal in ovstream callback threads.

  • Include prim_path in every response so the frontend can discard stale data.

  • Keep children response semantics consistent with the frontend tree implementation.

  • Do not assume all USD property values are JSON-serializable without conversion. Normalize arrays, tokens, paths, numbers, booleans, and fallback display strings.

  • Avoid loading the entire stage tree by default for large scenes.

Decision points:

  • Use ovrtx query_prims for basic hierarchy roots and prim discovery whenever it provides the needed data.

  • If direct pxr imports are stable in the server process, direct query helpers are acceptable for USD features not covered by ovrtx native queries after ovrtx initialization.

  • If imports conflict or the platform is Windows, use a subprocess query mode for those remaining pxr queries.

  • If the user asks for full property editing, treat it as a separate feature and add explicit edit/apply/reload contracts.

Common failure modes:

  • Large scenes freeze the stream when the full hierarchy is traversed synchronously.

  • Non-serializable USD values break data-channel sends.

  • Variant changes leave stale property and child rows unless caches are invalidated.

Read for depth: see references/stage-hierarchy, references/prim-info-display, and references/streaming-messages for the full hierarchy and property contracts.

13. Add Render Settings And Lighting Controls

Do this in server/render_settings.py, server/settings_store.py, and frontend/src/components/RenderSettingsPanel.tsx:

  • Define a small persistent settings model for validated render settings, camera policy, segmentation/debug state, stream/profile defaults, and non-live defaults after the backend capability list is known.

  • Build a server-owned supported-settings capability list from verified backend apply paths. The frontend render settings panel must render from that list, not from hard-coded optimistic controls.

  • Load settings at server start.

  • Apply validated immediate settings and accepted profile/default settings after every scene load.

  • Send the effective settings and capabilities to the frontend after connection and after every change.

  • Persist user changes after validation.

  • Keep scene-independent settings separate from scene-specific transient state.

Critical contracts:

  • Do not add viewer lights by default. Only create viewer-owned lights when the user requests lighting controls.

  • If changing a user-selected fixed resolution, treat it as a render product and stream config change with explicit reconfiguration or restart. Do not tie stream resolution to browser CSS viewport size.

  • If changing render vars, update scene setup and frame extraction together.

  • Persist validated settings across scene switches.

  • Validate every setting value from the client before applying it.

  • Reject unsupported setting keys. Do not report success for client-side form state alone.

  • Send the full effective settings after applying a change so the UI reflects clamped values, applied, applies_at, requires_reload, and any message.

Decision points:

  • If the user wants a basic Omniverse Realtime Viewer, provide only verified immediate controls by default. AOV/debug view is acceptable when implemented through aov-switching; exposure/tone mapping are acceptable only when backed by frame conversion or a verified ovrtx path.

  • If the user wants material or renderer internals, read references/render-settings before exposing them.

  • If the setting can be applied live through ovrtx attributes, enqueue a render-thread command.

  • If the setting requires stage reload, expose it as an explicit render-profile or scene-load action rather than a live control.

Common failure modes:

  • UI says a setting changed while the renderer is still using the old value because the server did not echo effective settings.

  • UI exposes controls that cannot apply because React hard-coded settings that the backend did not advertise as capabilities.

  • Viewer-created lights change the look of authored scenes unexpectedly.

  • Resolution changes break video because the frontend, ovstream config, render product, and frame pitch no longer agree.

Read for depth: see references/render-settings and references/stage-management for the full settings contract.

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