Omniverse Client Library Changes


  • OM-57674: Update to Carbonite 128.0

  • CC-735: Added python bindings for omniClientMakePrintable and updated it to also percent-decode valid utf-8 and unreserved ascii characters (previously it would percent-encode invalid characters, but not percent-decode the valid ones).

  • CC-762: Automatically prepend message to checkpoint when copying & moving: “Copied from …” or “Moved from …”


  • CC-713: Update dependencies to latest versions:

    • Python: 3.7.13, 3.8.13, 3.9.13, 3.10.5

    • OpenSSL: 1.1.1q

    • zlib: 1.2.12

    • curl: 7.83.1

    • brotli: removed (no longer needed)

  • OM-54427: Add Python 3.10 builds

  • CC-749: Allow multiple connections to the same host by using the “userinfo” field of the URL


  • OM-55823: Update to connection library 113.26 to resolve a crash that could happen during disconnect while downloading a file through LFT.


  • CC-691: increase default curl timeout to 1800, make it configurable in omniverse.toml, properly check curl error code from curl_multi handles.

  • CC-693: Fall back to old copy method when copying from a mount on older servers.

  • CC-534: Add ability to configure an S3 provider via omniClientSetS3Configuration

  • CC-124: Add ‘bookmark’ functions: omniClientAddBookmark, omniClientRemoveBookmark, omniClientListBookmarks. The python bindings are add_bookmark, remove_bookmark, and list_bookmarks_with_callback

  • CC-732: Update to connection library 113.25 to resolve a crash that could happen during disconnect while downloading a file through LFT.


  • CC-581: Fixed setting the checkpoint message when copying on the same Nucleus server

  • CC-583: Fix a case where automatic checkpoints didn’t exactly emulate atomic checkpoints. There was one case where automatic checkpoints would use the provided message for the checkpoint before and after the overwrite but atomic checkpoints use a blank message for the checkpoint prior to the overwrite.

  • CC-590: Fixed resolving UDIM URIs that have been percent encoded

  • CC-594: Always check that the logcallback function is valid before calling it.

  • CC-566: Added documentation: As part of this change, we have combined a number of include files. You should now only include “OmniClient.h”


  • CC-517: Move calling the log callback to its own thread. This moves having to acquire the GIL to call the log callback to its own thread, which can prevent deadlocks. This specifically fixes an observed deadlock with USD/usd-resolver trying to resolve several paths at once while holding the GIL. Additionaly this moves calling the log callback out of any critical paths, making the code more robust against potentially slow log callback implementations.

  • CC-493: Retry without cache when cache download fails

  • CC-553: Fixed two timing issues that could cause Stat/Resolve requests to hang. One affected Linux only and involved the initial callback, and the other affected both Windows and Linux and involved the subscription callback.


  • CC-491: Switch to using copy2 function in NucleusProvider to support atomic checkpoints.

  • CC-311: Map RESOURCE_BUSY error code to eOmniClientResult_ErrorLocked

  • CC-501: Add omniClientBreakUrlAbsolute & omni.client.break_url_absolute

  • OM-46177: Fix “checkpoint_version” could be stopped before it’s ever sent to the server

  • OM-49835: Speculative fix for a crash on shutdown

  • CC-504: Add message parameter to omniClientCopy, omniClientMove, and omniClientWriteFile that allows users to set the message field of the atomic checkpoints created by those functions.

  • OM-47306: Print a warning (and a traceback) when python calls wait() and it takes longer than 20ms


  • OM-47514: Calling stat on a checkpoint will no longer have the “writable file” flag set

  • CC-476: Add user/group mangement python bindings

  • OM-35591: supporting atomic checkpoints

  • CC-424: Make NucluesProviderFactory::initializeConnectionLibrary() thread safe.

  • CC-482: Change shutdown warning to only print after Core::Shutdown is complete.

  • CC-436: Fix URL parsing methods to not percent-decode raw file paths

  • OM-49023: Properly handle large reads and writes in windows and linux file providers.


  • CC-333: Removed USD plugin (moved to OmniUsdResolver)

  • CC-397: Fixed makeRelative when there are percent-encoded urls

  • CC-406: Add Python 3.8 and 3.9 builds

  • CC-407: Fix listcache going out of date if the server sent a meta event after a deleted event

  • CC-437: Add python bindings for omniClientLiveSetQueuedCallback

  • OM-47554: Downgrade some “Error” messages during auth to “Verbose” We attempt to connect using 3 different methods, and it’s normal for 2 of them to fail. This avoids confusing users with error messages for a connection that ultimately succeeds.

  • OM-48252: Lower required “list2” version, to allow connecting to servers running Nucleus 112.0.

  • OM-28724: Retry up to 3 times when there’s an LFT error

Notes for updating:

  1. If you are working with USD, you should no longer pull this omni_client_library directly anymore.

    Instead, pull the package “usd-resolver”:

<dependency name="omni_usd_resolver" linkPath="../_build/target-deps/omni_usd_resolver">
  <package name="omni_usd_resolver.nv-20_08.py37.${platform}" version="1.0.0" />

This includes a file named “deps/redist.packman.xml” that you can include in your own packman.xml to grab the exact version of USD and the client library that the resolver was built against. Note: This requires packman 6.4 or later!

<project toolsVersion="5.0">
  <import path="../_build/target-deps/omni_usd_resolver/deps/redist.packman.xml">
  <dependency name="usd_debug" linkPath="../_build/target-deps/usd/debug">
  <dependency name="usd_release" linkPath="../_build/target-deps/usd/release">
  <dependency name="omni_client_library" linkPath="../_build/target-deps/omni_client_library">

Ensure your build scripts also copy from (or refrence) the binaries in omni_usd_resolver.

NOTE: omniClientInitialize no longer registers the Omniverse USD Resolver plugin! You must either copy the omni_usd_resolver plugin in the default USD plugin location, or register the plugin location at application startup using PXR_NS::PlugRegistry::GetInstance().RegisterPlugins.

See the in omni_usd_resolver for more information about how to set this up.

  1. “OmniUsdLive.h” was renamed to “OmniClientLive.h” C: All the function prefixes were changed from “omniUsdLive” to “omniClientLive” Py: All the function prefixes were changed from “omni.client.usd_live” to “”

  2. There are no longer specific python flavors of client library. Instead, it ships with bindings for Python 3.7, 3.8, and 3.9 all in one package. In packman.xml, change “omni_client_library.py37.${platform}” to “omni_client_library.${platform}” This is only relevant if you are NOT getting this omni_client_library from the omni_usd_resolver.


  • CC-357: Fixed a deadlock that could occur when a python file status callback is being unregistered on one thread while another thread is simultaneously trying to call that file status callback

  • CC-367: Allow stat & list using URLs

  • CC-384: Remove support for Nucleus 109 & 110

  • OM-45887: Enable extra connection logging

  • CC-366: Update OpenSSL to avoid a security vulnerability

  • CC-380: Fix SdfLayer::OpenAsAnonymous with “omniverse” URLs


  • OM-43249: Fixed crash that could occur when authentication result arrives after authentication was cancelled

  • OM-23151: Allow multiple authentication requests to be in flight at the same time This changes:

    • C: omniClientSetAuthenticationMessageBoxCallback

    • C: omniClientAuthenticationCancel

    • py: authentication_cancel

    • py: set_authentication_message_box_callback

  • CC-339: omniClientMakeRelative returns relative paths with ‘/’ even on Windows

  • CC-343: Files inside a mount should not have fOmniClientItem_WriteableFile

  • CC-186: Add support for moving/renaming files & folders

    • C: omniClientMove

    • Py: omni.client.move

    • Py: omni.client.move_async

    • Py: omni.client.move_with_callback

  • CC-219: Add user/group management for nucleus provider (other providers do not support user management)


  • CC-166: Trigger omniClientStatSubscribe callback when .live files change

  • CC-236: Add support for checkpoint change notification


  • CC-245: Fixed a deadlock that could occur rarely when connection failed.

  • CC-221: Upgrade OmniTrace to 0.5.8831531e for correct libstdc++ license

  • CC-32: Fixed a crash that could happen on disconnect

  • OM-43009: Removed “stop” from list of required capabilities, to discover newer servers which don’t advertise that capability

  • CC-271: Removed support for Nucleus 107 (released in Nov 2019)


  • CC-228: Subscription based authentication using ‘nonce’

  • CC-231: Discover API server using minimum required capabilities rather than all capabilites

  • CC-239: Fixed an issue where log messages issued when omniclient.dll is unloading could access invalid memory.

  • OM-41660: updating the connection library which was build with a proper toolchain (licensing fixes)

  • CC-225: Fixed a rare crash that could happen when disconnecting from a Nucleus server.

  • CC-123: Add support for deleting a checkpoint


Big Live Mode Changes!

You can no longer enable live mode on any arbitrary layer. Instead, layers with the “.live” extension are considered live layers. Changes made to a live layer are replicated to other users when you call omniUsdLiveProcess (py: usd_live_process). Calling Save on a live layer does nothing.

This is not a backwards-compatible change. All clients must be using either client library version 1 or version 2 in order to do live-syncing with each other.

New (v2) clients can read & write USD files on old servers, but require a Nucleus server 111 or later in order to do live updates.

You can detect if a server supports the new live update method by calling “omniClientGetServerInfo” (py: omni.client.get_server_info) and checking the “omniObjectsEnabled” (py: omniojects_enabled) field.

Live files show up in “list” with the flags “fOmniClientItem_IsOmniObject” and “fOmniClientItem_CanLiveUpdate” (py: IS_OMNI_OBJECT | CAN_LIVE_UPDATE).

Copying a .live file from one Nucleus server to the same server or a different Nucleus server is supported, but copying it to a local drive or other provider types (http, for example) is not.

Removed the following functions:

  • omniUsdLiveSetDefaultEnabled & omniUsdLiveGetDefaultEnabled

  • omniUsdLiveSetModeForUrl & omniUsdLiveGetModeForUrl

  • omniUsdLiveSetResolveMethod & omniUsdLiveGetResolveMethod

The equivalent python bindings have also been removed:

  • usd_live_set_default_enabled & usd_live_get_default_enabled

  • usd_live_set_mode_for_url & usd_live_get_mode_for_url

Other Changes:

  • CC-223: Fixed some cases where the list cache would be invalidated at the wrong time

  • CC-156: Improve Tokens Caching (cache moved to “auth.toml” and its structure changed to use auth. transport info)

  • CC-229: Fixed a case where the client library would not connect to Nucleus securely