Save USD
Get your stage off the canvas and onto disk
- USD
- USD
Every other node in the ComfyUI-OpenUSD pack edits a stage in memory. Save USD is the one that gets your work off the canvas and onto disk. You feed it a USD stage and a filename, and it writes the file - which is also why it's the pack's terminal node in the sense ComfyUI means: it's marked an output node, so it always runs and the graph doesn't consider the job done until it has.
Why you'd reach for it
The whole pack is pure Python - there's no DCC, no Blender, no viewport rendering pipeline underneath. So the deliverable of any USD workflow in ComfyUI is a file. Whether you've been assembling a scene with Create USD Stage, editing prims with TransformUSDPrim and SetUSDAttribute, or loading something and cleaning it up, Save USD is how the finished stage leaves. It's the USD answer to SaveImage.
How it works
The node takes your stage, exports its root layer to output_path, and then re-opens the saved file so the USD output is a live stage you can keep piping. The extension you choose in output_path decides the format: .usda for human-readable ASCII, .usdc for compact binary, .usd for the generic format, .usdz for the zipped, packaged form used by Apple's AR Quick Look. Directories are created for you; existing files are overwritten without ceremony.
The three toggles are where the real behavior lives:
flatten_stage- bakes the whole composition (references, sublayers, everything) into a single self-contained layer. Leave it off and your saved file keeps its composition arcs pointing at other files; turn it on for a one-file deliverable.make_paths_relative(default on) - rewrites external references so they're relative to the saved file instead of absolute. This is what keeps the output portable. Turn it off if you specifically want absolute paths.package_assets- copies any referenced external files (textures, referenced USD) into anassets/folder next to your output and rewrites the references to point at them. It's the "collect files" checkbox, the closest thing here to USDZ packaging without zipping.
Inputs and outputs
The inputs that matter are USD (the stage), output_path (a path widget - this is a raw filesystem path, not ComfyUI's auto-numbered output folder), and the three booleans above. The output is a single USD - the saved stage, re-opened - so you can chain Save into more edits.
Install
Comes with the cjhosken/ComfyUI-OpenUSD pack. Through ComfyUI Manager, search "ComfyUI-OpenUSD"; or:
cd ComfyUI/custom_nodes
git clone https://github.com/cjhosken/ComfyUI-OpenUSD
Then restart. The dependency to budget for is usd-core==26.5, Pixar's USD Python bindings - a heavy one-time install. Nothing else to download; there are no model files in this pack.
Troubleshooting
- Saved
.usdais full of@./../absolute/path@references - that'smake_paths_relativedoing its job. If you wanted a single file, flipflatten_stageon. - The file shows up "empty" - check that you actually connected a
USDstage and that it isn't a stage with only composition arcs pointing at files you didn't copy.package_assetsorflatten_stagefixes the portable case. - It overwrote a file you cared about - it will, without asking. Path discipline is on you.
One honest caveat, same as every node in this pack: it's version 0.1.1, brand new, no community track record yet. The mechanisms above are straight from the source, but don't be shy about backing up outputs while the pack matures.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| USD | USD | — | |
| output_path | STRING | path/to/file.usda | — |
| make_paths_relative | BOOLEAN | true | — |
| package_assets | BOOLEAN | false | — |
| flatten_stage | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| USD | USD | — |