π€ NL Write
Versioned, EXR-first, pipeline-friendly output β NL Write is the 'O' in this pack's IO
- images
- mask
- comparison_images
NL Write is the output half of this pack's color-managed IO story, and the first thing to understand about it is the default: EXR-first. New nodes default to writing EXR stills and sequences, with PNG, MP4, and MOV as options. That's a deliberate choice, and it tells you exactly who this pack is for. If you're a VFX compositor, EXR is the format your downstream tools actually want - 16-bit float channels, alpha, working-space accuracy. If you're a solo image gen hobbyist, you'll change the extension to PNG on your way in and never think about it again.
The other half of its personality is versioning. Give it a base name (default "render") and it appends version suffixes automatically, driven by the workflow context. No more final_v3_actual_really_final.png. Combined with the NL Workflow panel, your outputs land in project-aware, versioned locations instead of ComfyUI/output/.
The settings that matter
mode-singleorsequence. This decides whether you're writing one image or a frame range.save_mode-none,color,color+mask,transparent, ormask. What you persist per frame.single_extension- PNG, JPG, WebP, TIFF, BMP, or EXR. EXR is default.sequence_save_exr/sequence_save_png- for sequences: canonical EXR frames, optional PNG previews, or both.sequence_save_mp4/sequence_save_mov- encode a video preview. MP4 uses ffmpeg withsequence_mp4_crf(lower is better) and asequence_mp4_preset; MOV writes ProRes profiles fromproxyup to4444xq.range_mode/range_start/range_end- which frames of a sequence to save,contextdefaulting to the workflow frame range.sequence_fps- custom FPS for video output; 0 falls back to workflow context FPS.preview_mode- includingcomparisonandcomparison reveal, withsave_comparisonandcomparison_layoutto write comparison frames alongside.- Color:
input_colorspaceauto-resolves fromimage_info_json(assuming ACEScg if absent),output_colorspaceis the canonical managed space for EXR, andpreview_colorspaceis display-only.
Inputs: images, mask, optional comparison_images, and image_info_json from NL Read to keep the color metadata honest. Outputs: none - it's an output node; it writes files.
Install and gotchas
Same pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes
or Manager β "ComfyUI-NL_Nodes", restart. For MP4/MOV you need ffmpeg on the system; for color-managed EXR you want the PyOpenColorIO/OpenEXR deps from requirements-color.txt. Where people get tripped up: forgetting the versioning is context-driven, so a blank NL Workflow context gives you pathless output that lands wherever the pack's fallback puts it. Set project context first. And if your PNG looks washed out next to the EXR, that's the preview_colorspace vs output_colorspace split doing its job - the EXR is the truth, the 8-bit video and previews are the display rendition of it.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | Write a single image or a sequence. | |
| name | STRING | render | Base output name; version suffix is added automatically. |
| preview_mode | COMBO | color | Choose which preview(s) to show. |
| input_colorspace | STRING | auto | Incoming image colorspace. Auto resolves from image_info_json, otherwise assumes ACEScg. |
| output_colorspace | STRING | ACEScg | Canonical colorspace used for EXR and managed color outputs. |
| preview_colorspace | COMBO | Output - Rec.709 | OCIO View used only for NL Write preview rendering. |
| save_mode | COMBO | color | Choose what to save (color, mask, or alpha). |
| sequence_fps | FLOAT | 0.000β240 | Custom sequence FPS. Set to 0 to use workflow context FPS. |
| single_extension | COMBO | exr | File extension for single-image saves. |
| sequence_save_png | BOOLEAN | false | Save PNG preview frames for sequences. |
| reverse_sequence | BOOLEAN | false | Reverse the order of sequence frames before saving. |
| range_mode | COMBO | context | Select frame range for image sequences. |
| range_start | INT | -1-1β999999 | Custom range start frame (used when range_mode is custom). |
| range_end | INT | -1-1β999999 | Custom range end frame (used when range_mode is custom). |
| sequence_save_mp4 | BOOLEAN | false | Encode an MP4 preview for sequences. |
| sequence_mp4_crf | INT | 230β51 | MP4 quality (lower is higher quality). |
| sequence_mp4_preset | COMBO | FFmpeg preset used for MP4 encoding. | |
| sequence_save_mov | BOOLEAN | false | Encode a MOV (ProRes) for sequences. |
| sequence_mov_profile | COMBO | ProRes profile used for MOV output. | |
| save_comparison | BOOLEAN | false | Save comparison images as a separate output. |
| comparison_layout | COMBO | horizontal | Stack comparison frames horizontally or vertically. |
| sequence_save_exr | BOOLEAN | true | Save canonical EXR frames for sequences. |
| imagesopt | IMAGE | Main image input. | |
| maskopt | MASK | Mask input (grayscale or alpha). | |
| comparison_imagesopt | IMAGE | Optional comparison image sequence. | |
| image_info_jsonopt | STRING | Optional serialized image metadata from NL Read. |
Outputs (0)
No outputs