Nuke Write
Save EXR sequences without leaving the graph
- image
- passes
- image
- file_paths
ComfyUI's Save Image writes a PNG and calls it a day. NukeWrite is the node you switch to when a PNG isn't the deliverable: it writes EXR, TIFF, DPX, HDR, TGA, BMP, even webp, with real bit-depth and compression control, and it can write image sequences with frame padding. It's the natural end of a Nuke-style pipeline - Read in, grade, write back out in a format the rest of your post chain actually wants.
You reach for it whenever the output has to survive contact with another tool. A render for a compositor needs 16-bit or 32-bit EXR, not 8-bit PNG. A contact sheet needs DPX. A sequence for video work needs %04d padding so the next app sees frames, not one file. NukeWrite does all of that, and its all_channels mode goes further - it can write an entire multi-pass EXR from a NUKE_PASSES bundle, the thing the pack's NukeReadMultiPass produces.
How it works
Writes go through OpenImageIO when available, falling back to OpenCV/PIL. Relative paths land in ComfyUI's output directory, subdirectories get created automatically, absolute paths are used as-is. file_path supports %04d and #### patterns; frame_padding (default 4) sets how many digits frames get. When there's no pattern at all, auto_sequence (default on) appends an incrementing number so test1.png, test2.png... never overwrite - turn it off and it clobbers the same file every run.
The channels dropdown is the interesting part. rgba and rgb write the IMAGE input normally. all_channels switches the node to multi-pass mode: it takes the passes input (the NUKE_PASSES bundle from NukeReadMultiPass) and writes every pass as a multi-channel EXR - and it's smart about it, applying the colorspace conversion only to light passes while leaving data passes (normals, depth, position, motion, IDs, mattes, UVs) untouched.
Like NukeRead, colorspace describes the file on disk and encodes to it from linear Rec.709: sRGB for PNG/JPG, linear for EXR, ACEScg if the post pipeline expects AP1. raw writes as-is.
Inputs that matter
file_path+frame_start- where and when the sequence starts.file_type- exr, tiff, png, jpg, dpx, hdr, tga, bmp, webp. Default exr.bit_depth- 8, 16, 16f (half float), 32f. Default 16f - the sane default for EXR.compression- EXR codecs;dwaadefault,zip/zipsgood for interchange.channels/passes- for multi-pass EXR output.
Outputs: the image (echoed) and a file_paths STRING telling you exactly what got written.
Installing it
Ships in Nuke Nodes. Manager: search "Nuke Nodes", install. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/sumitchatterjee13/nuke-nodes-comfyui.git nuke-nodes
cd nuke-nodes
pip install -r requirements.txt
Restart, find it under Add Node → Nuke → IO. No models. OpenImageIO (from requirements) is what gives you the full format list.
Gotchas
- EXR wants a float bit depth. Writing 8-bit "EXR" is technically possible and practically useless. Stick with 16f/32f.
- PNG output washed out? Your pipeline is linear and you wrote with
colorspace="raw". Set it tosRGBso the OETF gets applied and the file looks right in a viewer. all_channelsneeds the passes input wired. If you select it without aNUKE_PASSESconnection, there's nothing to write - keepchannelsonrgbafor plain image writes.- Zero community footprint on this pack, so no threads to rescue you. The tooltips in the node are genuinely good - trust them, and the
io_nodes.pysource when they run out.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| file_path | STRING | — | |
| frame_start | INT | 1-999999–999999 | — |
| imageopt | IMAGE | Image input. Used when channels is 'rgb' or 'rgba'. Not needed when channels='all_channels'. | |
| channelsopt | COMBO | rgba | Channel layout for the output file: rgba - write 4 channels (RGB + alpha). Uses the IMAGE input. rgb - write 3 channels (RGB only). Uses the IMAGE input. all_channels - write all passes as multi-channel EXR. Uses the PASSES input. Colorspace conversion is applied only to light passes, not to data passes (normal, depth, position, motion, IDs, mattes, UVs). |
| passesopt | NUKE_PASSES | Multi-pass bundle from Nuke Read MultiPass. Used when channels='all_channels'. | |
| file_typeopt | COMBO | exr | 9 options: exr, tiff, png, jpg, dpx, hdr, +3 |
| bit_depthopt | COMBO | 16f | 4 options: 8, 16, 16f, 32f |
| compressionopt | COMBO | dwaa | 10 options: none, rle, zip, zips, piz, pxr24, +4 |
| frame_paddingopt | INT | 41–10 | Number of digits for frame numbers (e.g., 4 = 0001, 0002...) |
| overwriteopt | BOOLEAN | false | True: overwrite existing files at the exact target paths (each frame is written atomically via a temp file + rename). False: never clobber - if any target frame already exists, the WHOLE sequence is written with a versioned base name (name_1.0001.exr, name_1.0002.exr, ...) so one render always shares one consistent name. |
| create_directoriesopt | BOOLEAN | true | — |
| colorspaceopt | COMBO | raw | Colorspace to WRITE the file as on disk (matches Nuke's Write node convention). Input is assumed to be in the OCIO working space (the config's scene_linear role, e.g. ACEScg); the node converts from there into the chosen space. raw - write input as-is, no conversion (EXRs are tagged with the working-space name) any other entry - OCIO colourspace to encode to (e.g. 'sRGB Encoded Rec.709 (sRGB)' for PNG / JPG, 'ACEScg' for linear EXR) The list comes from the active OCIO config ($OCIO, or the built-in ACES Studio config) and is built when ComfyUI starts - restart ComfyUI after changing $OCIO. |
| show_previewopt | BOOLEAN | true | Show thumbnail preview in node |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| file_paths | STRING | — |