Omniverse Realtime Viewer
OpenAIOfficialCreated by NVIDIA OmniverseDistributed by OpenAI
- Skill
- Meta (authoring, orchestration, planning, memory)
- Software development
- Apache-2.0
- Medium risk
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
Download the skill as a ZIP:
https://autogineer.com/agent-skills/openai/omniverse-realtime-viewer/downloadUnzip 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
Read
references/routing.mdto choose the delivery path and focused references.Read
references/conventions.mdbefore implementing camera, input, selection, viewport, streaming protocol, scene loading, or environment behavior.For broad viewer requests, read
references/usd-viewer-app/README.md.If the delivery path is unclear, read
references/streaming-vs-local/README.md.If the prompt includes layout, panels, controls, inspectors, status, or UX, read
references/viewer-ux-workflow/README.mdand 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.For viewport interaction, read
references/viewer-input-routing/README.mdbeforereferences/camera-controls/README.md,references/native-picking-selection/README.md, orreferences/object-selection/README.md.Read only the focused capability references needed for the requested app.
Use
references/validation.mdto capture review evidence before handoff.
Non-Negotiables
Use
ovrtxfor all USD and 3D rendering.Browser apps display an
ovstreamWebRTC 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
ovrtxpath 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.mdand deployment choices inreferences/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
Classify the prompt by delivery path, target user, required capabilities, runtime environment, validation needs, and explicit constraints.
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.
Read selected references before writing app code. Follow their build order, import order, data-channel contracts, and renderer ownership rules.
Implement the core render path first, then input routing and camera, then selection and data panels, then scene/settings features, then packaging or deployment.
Treat the selected references as the behavior contract for API shape, compatibility, and generated project structure.
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
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- BENCHMARK.md5.5 KiB
- LICENSEAdded by AutoGineer10.0 KiB
- SKILL.md7.4 KiB
- agents/openai.yaml315 B
- evals/evals.json8.1 KiB
- references/aov-switching/README.md15.2 KiB
- references/camera-auto-select/README.md7.4 KiB
- references/camera-controls/README.md17.1 KiB
- references/camera-picker/README.md9.7 KiB
- references/cloud-assets/README.md10.4 KiB
- references/cloud-deployment/README.md18.0 KiB
- references/conventions.md5.3 KiB
- references/cpp-native-viewer/README.md2.4 KiB
- references/cpp-native-viewer/interaction-features.md19.2 KiB
- references/cpp-native-viewer/presentation-loop.md9.0 KiB
- references/cpp-native-viewer/project-build.md6.4 KiB
- references/cpp-native-viewer/renderer-session.md4.5 KiB
- references/cpp-native-viewer/validation.md3.3 KiB
- references/dependencies/README.md3.4 KiB
- references/dependencies/electron-shm.md1.5 KiB
- references/dependencies/environment-validation.md4.4 KiB
- references/dependencies/frontend.md2.3 KiB
- references/dependencies/local-openusd-gpu.md4.4 KiB
- references/dependencies/nvidia-runtime.md9.0 KiB
- references/dependencies/ovrtx.md2.4 KiB
- references/dependencies/ovstream.md2.5 KiB
- references/dependencies/quick-setup.md5.3 KiB
- references/electron-shm-viewer/README.md2.2 KiB
- references/electron-shm-viewer/architecture-project.md6.3 KiB
- references/electron-shm-viewer/electron-client.md5.6 KiB
- references/electron-shm-viewer/protocol-interaction-lifecycle.md6.9 KiB
- references/electron-shm-viewer/python-shm-server.md4.9 KiB
- references/electron-shm-viewer/validation.md2.8 KiB
- references/gl-viewport-overlay/README.md7.9 KiB
- references/gl-viewport-overlay/architecture.md4.1 KiB
- references/gl-viewport-overlay/example-gizmo.md5.5 KiB
- references/gl-viewport-overlay/interaction-pattern.md4.0 KiB
- references/gl-viewport-overlay/projection-alignment.md4.3 KiB
- references/headless-shm-cli/README.md12.2 KiB
- references/huggingface-usd/README.md7.7 KiB
- references/local-viewer/README.md15.0 KiB
- references/native-picking-selection/README.md10.4 KiB
- references/object-selection/README.md9.4 KiB
- references/ovrtx-rendering/README.md18.2 KiB
- references/ovui-library/README.md3.3 KiB
- references/ovui-library/api-reference.md4.3 KiB
- references/ovui-library/extending.md4.8 KiB
- references/ovui-local-viewer-recipe/README.md3.7 KiB
- references/ovui-local-viewer-recipe/interaction-features.md16.1 KiB
- references/ovui-local-viewer-recipe/project-structure.md6.2 KiB
- references/ovui-local-viewer-recipe/setup-shell-renderer.md14.3 KiB
- references/ovui-local-viewer-recipe/validation-build-order.md5.5 KiB
- references/ovwidgets-editor-shell/README.md8.6 KiB
- references/prim-info-display/README.md9.3 KiB
- references/prim-pick-effects/README.md5.9 KiB
- references/prim-transform-safety/README.md8.2 KiB
- references/render-settings/README.md9.9 KiB
- references/routing.md16.5 KiB
- references/seg-outline-highlight/README.md1.4 KiB
- references/selection-animation/README.md9.7 KiB
- references/selection-feedback/README.md6.6 KiB
- references/stage-attribute-reads/README.md5.5 KiB
- references/stage-hierarchy/README.md17.1 KiB
- references/stage-hierarchy/fallback-worker-protocol.md3.5 KiB
- references/stage-loading/README.md19.3 KiB
- references/stage-management/README.md10.1 KiB
- references/stage-queries/README.md5.3 KiB
- references/streaming-client/README.md17.4 KiB
- references/streaming-lifecycle/README.md8.8 KiB
- references/streaming-messages/README.md16.5 KiB
- references/streaming-messages/server-handler-map.md3.1 KiB
- references/streaming-server/README.md18.6 KiB
- references/streaming-server/frame-loop-and-continuity.md3.3 KiB
- references/streaming-viewer-recipe/README.md4.8 KiB
- references/streaming-viewer-recipe/client-protocol.md11.0 KiB
- references/streaming-viewer-recipe/interaction-features.md13.0 KiB
- references/streaming-viewer-recipe/project-structure.md7.0 KiB
- references/streaming-viewer-recipe/server-runtime.md16.8 KiB
- references/streaming-viewer-recipe/validation-build-order.md5.8 KiB
- references/streaming-vs-local/README.md8.1 KiB
- references/tauri-local-viewer/README.md18.2 KiB
- references/tauri-shm-transform-gizmo/README.md11.8 KiB
- references/transform-manipulator/README.md15.0 KiB
- references/troubleshooting/README.md7.2 KiB
- references/troubleshooting/scenario-playbooks.md18.8 KiB
- references/usd-sample-data/README.md11.7 KiB
- references/usd-viewer-app/README.md7.5 KiB
- references/validation.md3.0 KiB
- references/viewer-backend-interface/README.md17.7 KiB
- references/viewer-control-patterns/README.md4.8 KiB
- references/viewer-data-view-patterns/README.md4.8 KiB
- references/viewer-feedback-status/README.md4.9 KiB
- references/viewer-input-routing/README.md7.8 KiB
- references/viewer-layout-patterns/README.md4.7 KiB
- references/viewer-ux-workflow/README.md4.6 KiB
- references/viewport-overlays/README.md4.8 KiB
- references/viewport-resize/README.md8.5 KiB
- references/webgl-shm-transport/README.md14.5 KiB
- references/windows-native-setup/README.md5.7 KiB
- skill-card.md2.9 KiB
- skill.oms.sig28.6 KiB
references/tauri-local-viewer/README.md
Tauri + Rust OVRTX Omniverse Realtime Viewer
Triggers
Use this skill for Tauri 2, Rust desktop Omniverse Realtime Viewer, OVRTX through C FFI, Tauri Channel IPC, ViewerBackend interface, native desktop Omniverse Realtime Viewer, web-technology UI, no Python, or no ovui runtime.
Use this pattern when the app should be a native desktop binary with a React
frontend, no Python runtime, and direct Rust FFI to OVRTX. The Tauri app shares
its ViewerBackend interface with the WebRTC streaming frontend so UI components
can be reused across both paths.
For ovrtx C API behavior, FFI behavior, renderer lifecycle guidance, or
release-specific behavior not covered here, read references/dependencies for
acquisition guidance and supplemental dependency documentation.
This is not a GPU zero-copy renderer. The active display path is:
OVRTX step -> CPU map LdrColor -> raw RGBA payload -> Tauri Channel -> canvas putImageDataDo not add wgpu, CUDA/Vulkan external-memory import, NVENC, or WebCodecs as
part of the active local display path unless the app is explicitly redesigned
around a new presentation contract.
When to Use This vs Other Paths
| You want... | Use... |
|---|---|
| Native desktop, web-tech UI, no Python | This skill: Tauri + Rust FFI |
| Native desktop, Python, simple Omniverse Realtime Viewer shell | local-viewer + ovrtx-rendering |
| Native desktop, Python, full editor UI | ovui |
| Browser-based remote viewing | streaming-server + streaming-client |
| Unsure between local and streaming | streaming-vs-local |
Architecture Overview
React WebView (Vite)
|-- ViewerBackend interface (useTauriBackend.ts)
|-- Tauri invoke / Channel IPC
|
Rust backend
|-- commands.rs -> Tauri commands, events, shared-state reads
|-- render_loop.rs -> single render thread owns mutable OVRTX state
| |-- drain commands
| |-- write camera (ovrtx_write_attribute)
| |-- step renderer (ovrtx_step)
| |-- CPU map "LdrColor"
| `-- push binary frame via Tauri Channel
|-- ovrtx_bridge.rs -> OVRTX C API FFI, loading, mapping, native picking
|-- camera.rs -> OrbitCamera math and input handling
|-- session_layer.rs -> inline root/session USDA generation
|-- ovrtx_env.rs -> Windows DLL/path/runtime discovery
`-- picking.rs -> native pick requests and UI selection stateGenerated project paths may be tauri-app/src-tauri/src/ and
tauri-app/src/, or a flattened layout such as tauri-src/ and ts-src/.
Treat the module names above as the stable structure.
Critical Invariants
1. Single Render Thread
One Rust thread owns all mutable render state:
OvrtxBridgerenderer and stage handlesOrbitCameraInstanceTableselection state
frame counters and render error counters
Tauri commands enqueue RenderCommand messages through mpsc when they need to
touch OVRTX or camera state. Never call OVRTX from the IPC thread. Continuous
input is fire-and-forget; discrete actions use reply channels or events.
2. Camera Write Contract
ovrtx_write_attribute:
attribute: "omni:xform"
semantic: XFORM_MAT4X4
binding dtype: float64, lanes=16
input tensor: (1,4,4) float64 lanes=1, ndim=3, strides=NULL, CPU
prim_mode: CREATE_NEW
access: SYNC
path: /Session/Cameras/MainWrite the camera every frame before step(). Validate finite values and skip the
write on NaN. Do not use bind+map or a different lane layout; OVRTX failures here
can look like a camera that silently never moves.
3. Session Layer Paths
These paths must match the Python local Omniverse Realtime Viewer and streaming server camera setup:
/Session/Cameras/Main camera
/Session/Render/Viewport LdrColor display render product
/Session/Render/PickBuffer InstanceSeg pick render product
/Session/Render/Vars/... render vars
/Session/OVRenderSettings render settingsNon-matching paths can cause OVRTX to use a default camera or fail to expose the expected render outputs.
4. Fixed Render Resolution
Resolution is baked into the generated session USDA. Changing it requires a session reload and wipes the camera xform. Keep the backend render size fixed and use UI-side letterboxing plus pointer-coordinate mapping.
resize(width, height) is advisory in the current backend; it does not resize
OVRTX render products.
5. Channel-Based Frame Delivery
Primary frame transport is a Tauri Channel<InvokeResponseBody> registered by
subscribe_frame_events(on_frame). The payload is:
[u32 width LE][u32 height LE][u64 sequence LE][RGBA8 pixels]The frontend decodes ArrayBuffer payloads, drops duplicate or older sequence
numbers, creates ImageData, and paints with canvas.putImageData.
Do not use a named binary ovrtx-frame event for frames. Named events are used
for lifecycle, errors, picking, and selection, not for the main frame stream.
take_frame_bytes() is a pull fallback for reconnect/debug paths. Channel push
is the primary display path. New Channel subscribers should receive the latest
cached good frame immediately when one exists.
6. Stage Load Sequence
The stage load flow should:
Resolve the input path.
Read/cache a lightweight stage tree before the render-thread load.
Reset any existing OVRTX stage.
Add the user USD at the root.
Add the generated session USDA under
/Session.Clear selection and render error state.
Reset the camera to the default view.
Rebuild
InstanceTablefrom the cached tree.Mark the stage loaded and emit
stage-loaded.
Effect-fader writes are currently inactive. The load path calls
write_effect_faders with an empty shader-path list, so the helper returns
without writing anything. If real shader paths are supplied in a future feature,
the helper must keep using CREATE_NEW, not EXISTING_ONLY.
7. Render Loop Timing
The render thread drains all pending commands before rendering a frame. When no stage is loaded it waits for commands instead of busy-spinning.
The active loop targets about 16 ms per frame. Render delta time is clamped to a small lower bound and to about 0.1 seconds on the high end so long stalls do not explode camera or animation updates.
Do not call renderer.step() concurrently with stage reset/load.
8. Error Model
FrameNotReadyis not a fatal render error.Ten consecutive non-
FrameNotReadyrender failures disable rendering.Disabling rendering emits
ovrtx-render-stopped.The disabled state clears only on the next
LoadStage.Keep serving the latest good frame while rendering is disabled.
Display-frame map/result cleanup uses RAII guards.
Pick-buffer mapping uses explicit cleanup; do not assume all mapped-output paths are RAII protected.
IPC Commands and Events
Expected Tauri command inventory:
| Command | Behavior |
|---|---|
load_stage(path) | Resolves the path, parses a lightweight tree, enqueues render-thread load, emits stage-loaded, returns { path, tree } |
set_camera(...) | Enqueues camera state update |
get_camera() | Rust command exists; current TS backend may not expose it |
resize(width, height) | Advisory/no-op for OVRTX resolution |
mouse_button(...) | Enqueues input; release may become a click/pick |
mouse_move(x, y) | Fire-and-forget continuous input |
mouse_wheel(delta) | Fire-and-forget continuous input |
pick(x, y) | Returns a request id immediately; actual result arrives later |
get_stage_tree(root_path?) | Returns cached tree; current root_path is ignored |
select_prims(paths) | Updates UI selection state and emits selection event |
subscribe_frame_events(on_frame) | Registers Tauri Channel frame sink and replays latest frame |
take_frame_bytes() | Returns latest frame bytes as reconnect/debug fallback |
Expected emitted event names:
| Event | Role |
|---|---|
stage-loaded | Stage load completed |
stage-selection-changed | UI selection paths changed |
ovrtx-pick | Async pick result for a request id |
ovrtx-error | Camera, render, or pick error |
ovrtx-render-stopped | Rendering disabled after repeated failures |
Do not add a frame event named ovrtx-frame; use the Channel command for frame
payloads.
ViewerBackend Interface
The shared contract between Tauri and WebRTC frontends should look like this for the current local Omniverse Realtime Viewer:
interface ViewerBackend {
connect(): Promise<void>;
disconnect(): void;
loadStage(path: string): Promise<{ path: string; tree: PrimNode[] } | void>;
resize(width: number, height: number): Promise<void>;
setCamera(camera: CameraState): Promise<void>;
cameraMouseButton(input: PointerInput): Promise<boolean>;
cameraMouseMove(x: number, y: number): Promise<void>;
cameraWheel(delta: number): Promise<void>;
onFrame(callback: (frame: FrameData) => void): () => void;
onSelectionChanged(callback: (paths: string[]) => void): () => void;
pick(x: number, y: number): Promise<string | null>;
getStageTree(rootPath?: string): Promise<PrimNode[]>;
selectPrims(paths: string[]): Promise<void>;
getProperties(path: string): Promise<PrimProperty[]>;
}Use viewer-input-routing for the shared click-vs-drag and button semantics
behind cameraMouseButton, cameraMouseMove, cameraWheel, and pick.
getProperties is currently a frontend stub that returns only the path property.
There is no Rust/USD property-query command yet. get_camera exists on the Rust
side but may not be exposed by useTauriBackend.
To add a feature, extend ViewerBackend first. Use a Tauri command plus
RenderCommand only when the feature must touch OVRTX, camera, or render-thread
state. Shared-state reads such as cached tree access and frame-channel
subscription do not need to enqueue render-thread work.
Picking and Selection
Display and picking use the same render-product pixel coordinate space. A frontend click is mapped through the letterboxed image rect and sent to the Rust render thread, which enqueues an ovrtx native pick query for the active RenderProduct.
Picking is asynchronous from the frontend point of view:
The frontend invokes
pick(x, y).Rust returns a
request_idimmediately.The render thread enqueues the native pick query and steps the active RenderProduct.
The render thread decodes
ovrtx_pick_hit, resolves the picked path id, and emitsovrtx-pickwith therequest_idand optional path.The frontend resolves the pending pick promise, currently with a short timeout.
Do not document or implement pick as a synchronous command returning the final path directly.
select_prims(paths) stores UI selection state and emits
stage-selection-changed. When renderer-visible feedback is requested,
OvrtxBridge::set_selection should write native selection outline groups:
group 0 to clear previous paths and a non-zero styled group for selected
paths.
Stage Tree and Properties
The current stage-tree reader is intentionally lightweight:
It reads simple
.usdatext.It recognizes basic
defandoverprim declarations.It returns children under
/Worldif present; otherwise it returns roots or a fallback/Worldnode.It does not build complete nested
childrenarrays for all USD constructs.get_stage_tree(rootPath?)ignoresrootPathand returns the cached tree.
Do not present this as a full USD stage browser. Use stage-hierarchy when the
app needs robust USD traversal, properties, variants, bounds, or composition
queries.
Stage path resolution accepts an absolute existing path, then tries the current directory, parent, and grandparent before returning the original input path.
Camera and Input
The expected controls are:
left drag: orbit
middle drag: pan
right drag: dolly
wheel: zoom
button release with movement under the click threshold: pick
OrbitCamera::current_xform recomputes the camera transform and the render loop
writes it every frame. On stage load, reset the camera to the default view before
rendering.
Frontend pointer handling should use pointer capture plus window-level
pointermove, pointerup, and pointercancel listeners so drags survive
WebView edge cases and leaving the canvas bounds.
Environment Setup and Loader Notes
Runtime setup should prove the app loaded the packaged ovrtx runtime that it will use at run time, not only that Rust compiled. Read the local ovrtx C/CMake headers or examples before assuming FFI names, library names, or config keys.
On Linux, packaged runtime layouts commonly expose bin/libovrtx-dynamic.so;
do not assume libovrtx.so is the load target. On Windows, use the equivalent
packaged DLL path from the same runtime root. In both cases, resolve absolute
paths before launch and log them.
Expected runtime proof:
OVRTX_LIB_PATH=/absolute/path/to/ovrtx/binwhen the loader needs an explicit library directory.OVRTX_BINARY_PACKAGE_ROOT_PATH=/absolute/path/to/ovrtxwhen the runtime needs package-root discovery.Runtime layout contains the expected
bin,plugins,usd_plugins, andrendering-dataentries for the selected ovrtx package.Backend logs include the exact dynamic library path, ovrtx version, requested stage path, and stage-open result.
/proc/<pid>/mapson Linux, or platform-equivalent loader inspection on Windows, confirms the running desktop process mapped the expected ovrtx library from the expected package root.
On Windows, runtime setup should:
set
OVRTX_SKIP_USD_CHECK=1before OVRTX workhonor
OVRTX_BINARY_PACKAGE_ROOTwhen providedprobe upward from the executable for the OVRTX SDK/package layout
derive
OVRTX_SDK_PATHandOVRTX_BIN_PATHprepend
bin/pluginsandbintoPATH
build.rs should add OVRTX_SDK_PATH as a native link search path. Loader setup
may need to pass the package bin directory as the loader root when plugins live
under bin/plugins.
OvrtxBridge::new should pass OVRTX config entries for binary package root,
sync mode, and active CUDA GPUs according to the local SDK expectations.
Prefer one reproducible launch command or script that configures the runtime, stage, and log file together:
OVRTX_LIB_PATH=/path/to/ovrtx/bin \
OVRTX_BINARY_PACKAGE_ROOT_PATH=/path/to/ovrtx \
OVRTX_OPEN_STAGE=/path/to/stage.usd \
npm run dev:desktop 2>&1 | tee /tmp/ovrtx-tauri-viewer-dev.logFor Hugging Face-hosted USD datasets, read huggingface-usd, download or clone
the dataset to the local filesystem, preserve relative dependency layout, and
open the resolved local path. Validate that the root USD is real data before
launching; for binary crate USD, head -c 8 <file>.usd should show PXR-USDC,
not a Git LFS pointer.
FFI and Memory Safety
OVRTX FFI is layout-sensitive. Keep Rust structs synchronized with
ovrtx_types.h; in particular, OvrtxConfigEntryT must not grow an extra field
between key_type and key.
Keep strings, config arrays, tensors, and attribute buffers alive for the full duration of synchronous OVRTX calls. Do not pass pointers to temporaries that can be dropped before the C function returns.
Mapped output handling must respect DLPack layout:
accept 2D, 3D, 4D, and known fallback dimensional layouts
compute width, height, row stride, byte length, and data pointer from metadata
pack padded RGBA rows into tightly packed bytes before sending to the WebView
unmap and destroy result handles on every error path
Display mapping has RAII cleanup. Pick mapping currently uses explicit cleanup;
keep that distinction in mind when editing pick_instance.
Behavioral Reference
When behavior differs between local Tauri code and the Python viewer, prefer the local app's established contracts for:
camera write shape and session USDA paths
fixed render resolution with UI letterboxing
pointer coordinate mapping into the rendered image content rect
render-thread ownership of OVRTX state
Common Mistakes
| Mistake | Consequence | Prevention |
|---|---|---|
| Calling OVRTX from the IPC thread | Race-prone state corruption or silent failures | Route OVRTX work through the render thread |
| Wrong camera tensor shape or lanes | Camera appears stuck or OVRTX ignores the write | Match the exact camera write contract |
Custom /Session path substitutes | OVRTX resolves the wrong camera/output | Use the session paths above |
| Dynamic resize through session reload | Camera xform and state are wiped | Keep fixed render size and letterbox in UI |
| Not checking camera matrix finiteness | Bad values poison renderer state | Skip non-finite camera writes |
| Awaiting mouse move or wheel commands | Input latency and backlog | Fire-and-forget continuous input |
| JPEG/base64 frame encoding | Extra CPU cost and quality loss | Send raw RGBA over Tauri Channel |
Using a named ovrtx-frame event | Bypasses current frame transport | Register subscribe_frame_events Channel |
| Treating pick as synchronous | Lost or mismatched pick results | Use request id plus ovrtx-pick event |
| Assuming stage tree is full USD traversal | Missing hierarchy/properties/variants | Use stage-hierarchy for robust USD queries |
| Assuming selection highlights in OVRTX | UI state changes but no render highlight | Implement renderer-side selection before claiming feedback |
EXISTING_ONLY fader writes | Silent no-op when creating attrs | Use CREATE_NEW if fader paths become active |
Definition Of Done
A Tauri ovrtx viewer is not done at compile time. Before handing it off, capture evidence for the real desktop runtime path:
npm run checkor equivalent TypeScript/Rust validation passes.npm run build:desktopor equivalent Tauri package build passes.The real Tauri desktop app launches through the reproducible launch script.
The requested USD stage path is opened at startup, and backend logs show
runtime loaded,ovrtx version, andstage openedor equivalent fields.The process stays alive after stage load and produces at least one displayed frame through the Tauri Channel path.
Loader inspection confirms the process mapped the expected ovrtx dynamic library from the configured package root.
nvidia-smior the platform equivalent shows the app using the GPU when GPU rendering is expected and available.UI-visible runtime status agrees with backend logs; do not show "ready" when the runtime fell back, failed to load, or never opened the stage.
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