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.
Download the WRAPP zip archive from the NGC Catalog
Extract the archive to a location of your choice
Add the extracted directory to your system PATH, or run
wrappdirectly 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.
Download the WRAPP wheel (
.whl) file from the NGC CatalogInstall the wheel using pip, specifying
pypi.nvidia.comas an extra index URL to resolve theomniverseclientdependency:
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.