WRAPP Tutorials#

This guide walks through WRAPP installation and common workflows with practical examples. For command reference and API documentation, see the Commands Reference.

Installation#

WRAPP is available from the NVIDIA NGC Catalog in two formats: a standalone CLI package (zip) and a Python wheel for integration into your own Python environment.

Installing the CLI from NGC#

The standalone CLI package is the simplest way to get started with WRAPP.

  1. Download the WRAPP zip archive from the NGC Catalog

  2. Extract the archive to a location of your choice

  3. Add the extracted directory to your system PATH, or run wrapp directly from the extracted location

Windows users: Before running WRAPP, ensure the Microsoft Visual C++ runtime is installed. If you see errors about missing DLLs, download and install it from https://aka.ms/vs/17/release/vc_redist.x64.exe.

Verify the installation:

wrapp --help

Installing the Python Package#

For programmatic access via the Python API or integration into existing Python projects, install WRAPP from the wheel file available on NGC.

  1. Download the WRAPP wheel (.whl) file from the NGC Catalog

  2. Install the wheel using pip, specifying pypi.nvidia.com as an extra index URL to resolve the omniverseclient dependency:

pip install wrapp-<version>-py3-none-any.whl --extra-index-url https://pypi.nvidia.com

Replace <version> with the actual version number of the downloaded wheel file.

Verify the installation:

python -c "import wrapp; print('WRAPP installed successfully')"

Working with Packages#

This section covers the core WRAPP workflows for creating, distributing, and managing versioned asset packages.

Basic Package Lifecycle#

Let’s walk through a typical scenario: you’re an asset developer who has created a vegetation library at omniverse://localhost/lib/props/vegetation, and a colleague needs to use it in their SanDiego project.

Creating the First Package Version#

Your vegetation assets are ready for release. Let’s publish them as version 20230505 using create:

wrapp create vegetation_pack 20230505 omniverse://localhost/lib/props/vegetation

WRAPP snapshots your content and stores it at omniverse://localhost/.packages/vegetation_pack/20230505. Your original files remain untouched—the repository now holds an immutable copy. Files in a WRAPP repository should never be modified.

By default, packages go to the .packages folder at the server root. For project-specific repositories, specify a different location with --repo:

wrapp create vegetation_pack 20230505 omniverse://localhost/lib/props/vegetation \
    --repo omniverse://localhost/project_repos/assets

Checking What’s Available#

Your colleague wants to know what packages they can use. They run list-repo:

wrapp list-repo omniverse://localhost
vegetation_pack: 20230505
rocks_pack: v1.0.0

Great—your vegetation_pack is listed and ready to use.

Installing in a Project#

Your colleague installs the vegetation pack into the SanDiego project using install:

wrapp install vegetation_pack 20230505 omniverse://localhost/scenarios/SanDiego/vegetation

This creates a copy at the destination. USD scenes in the project can now reference files under /scenarios/SanDiego/vegetation/ without version numbers in the paths. WRAPP tracks which version is installed via a .<package>.wrapp file (e.g., .sandiego.wrapp).

A Week Later: Updating the Package#

You’ve improved the vegetation assets and want to release an update. Create a new version:

wrapp create vegetation_pack 20230512 omniverse://localhost/lib/props/vegetation

Your colleague can see the new version is available:

wrapp list-repo omniverse://localhost
vegetation_pack: 20230512, 20230505
rocks_pack: v1.0.0

Before updating, they check if their installed copy has local modifications using status:

wrapp status omniverse://localhost/scenarios/SanDiego/.sandiego.wrapp

If everything is clean, they update to the new version by running install again:

wrapp install vegetation_pack 20230512 omniverse://localhost/scenarios/SanDiego/vegetation

WRAPP replaces the old version with the new one. If there were local modifications, the install would fail with a conflict message—see Handling Conflicts for how to resolve this.

Removing an Installed Package#

If the vegetation pack is no longer needed in the project, remove it with uninstall:

wrapp uninstall vegetation_pack omniverse://localhost/scenarios/SanDiego/vegetation

Multi-Repository Workflow#

Your team has grown. Development happens on dev.nvidia.com, but releases need to go to staging.nvidia.com for QA, and eventually to prod.nvidia.com. Let’s see how to move packages between these environments.

Promoting a Package to Staging#

The vegetation pack is ready for QA. Use mirror to copy it from dev to staging:

wrapp mirror vegetation_pack 20230505 \
    --source-repo omniverse://dev.nvidia.com \
    --destination-repo omniverse://staging.nvidia.com

The package now exists in both repositories. QA can install it from staging without touching the development server.

If the package depends on other packages (like a textures_base pack), mirror them all at once:

wrapp mirror vegetation_pack 20230505 \
    --source-repo omniverse://dev.nvidia.com \
    --destination-repo omniverse://staging.nvidia.com \
    --recursive

Handling Large Transfers#

Mirroring a 50GB package over a slow connection? If the transfer gets interrupted, don’t start over—resume where you left off:

wrapp mirror vegetation_pack 20230505 \
    --source-repo omniverse://dev.nvidia.com \
    --destination-repo omniverse://staging.nvidia.com \
    --resume

Handling Conflicts#

Your colleague made some tweaks to the installed vegetation pack—adjusted a few materials, added a custom tree variant. Now they want to update to your new version. What happens?

When Updates Fail#

They try to install the new version:

wrapp install vegetation_pack 20230512 omniverse://localhost/scenarios/SanDiego/vegetation

WRAPP detects the local modifications and refuses to overwrite them. Good—no work is lost. But how do they proceed?

Recording What Changed#

Run the install again with --patch to capture the conflicts:

wrapp install vegetation_pack 20230512 omniverse://localhost/scenarios/SanDiego/vegetation \
    --patch install_conflicts.patch

This creates a patch file (JSON format) listing every conflict: files that were modified locally but also changed in the new version.

Applying the Update#

After reviewing the patch file to understand what will change, apply it with apply-patch:

wrapp apply-patch install_conflicts.patch

Catalog-Based Workflows#

Sometimes you need to work with file trees outside of the normal package workflow—tracking changes over time, comparing directories, or creating one-off archives. Catalogs are the tool for this.

Taking a Snapshot#

You want to track what’s in the company’s sky assets folder. Create a catalog using catalog:

wrapp catalog omniverse://localhost/NVIDIA/Assets/Skies/Cloudy/ cloudy_skies.json

This JSON file now contains a complete inventory: every file, its size, and its hash. It’s a snapshot of that directory at this moment in time.

For assets stored on S3 or Azure (which don’t have Nucleus checkpoints), calculate hashes locally:

wrapp catalog s3://my-bucket/assets/ assets.json --local-hash

Excluding Files from Catalogs#

Thumbnail caches, logs, and temp files shouldn’t be tracked. Create a .wrappignore file (same syntax as .gitignore):

.thumbs
*.txt
*.log

WRAPP automatically uses this file when cataloging. For one-off exclusions:

wrapp catalog omniverse://localhost/assets/ assets.json --ignore-file custom_ignore.txt

Comparing Snapshots Over Time#

A month later, you want to know what changed. Take another catalog and compare them with diff:

wrapp diff cloudy_skies_january.json cloudy_skies_february.json --show

You’ll see exactly which files were added, removed, or modified.

Creating Archives with Freeze#

The art director needs a frozen copy of the vegetation assets for a client demo. Use freeze to copy everything to an archive location:

wrapp freeze omniverse://example.nvidia.com/lib/props/vegetation \
    omniverse://example.nvidia.com/archive/vegetation_20230505

For CI/CD pipelines, freeze directly to local disk:

wrapp freeze vegetation.json file:///C:/build_jobs/vegetation_20230505 --catalog

Offline Transfer (Export/Import)#

Your client’s production environment is air-gapped—no internet access for security reasons. How do you deliver packages to them?

Exporting to a File#

Use export to bundle a package into a portable tar file:

wrapp export vegetation_pack 20230505 --repo omniverse://dev.nvidia.com

This creates vegetation_pack.20230505.tar on your local machine. Copy it to a USB drive, ship it, or transfer it however you need.

For large packages with many duplicate files (common with texture variations), enable deduplication to shrink the archive:

wrapp export vegetation_pack 20230505 --repo omniverse://dev.nvidia.com --dedup

Importing at the Destination#

At the client site, someone with access to their internal server uses import:

wrapp import vegetation_pack.20230505.tar --repo omniverse://client-internal.com

The package is now in their repository, ready to install—no network connection to your servers required.


Verifying Package Integrity#

You have trouble with your content in a WRAPP package and want to make sure nothing got corrupted. Use check to verify every file in a package matches its recorded hash:

wrapp check vegetation_pack 20230505 --repo omniverse://localhost

If the package depends on others, verify the entire dependency tree:

wrapp check vegetation_pack 20230505 --repo omniverse://localhost --recursive

Any mismatches are reported immediately—you’ll know exactly which files have problems.


Tracing Package History#

Six months later, someone asks: “Where did this package originally come from?” Use traceback to follow the ancestry:

wrapp traceback omniverse://localhost/scenarios/SanDiego/.sandiego.wrapp

WRAPP shows you the full history: which repository it was installed from, which repository that was mirrored from, and ultimately which source directory it was created from. Useful for auditing and debugging provenance issues.


Further Information#

For all available options on any command, run:

wrapp <command> --help

For detailed documentation of all commands including the Python API, see the Commands Reference.