Nodes/ComfyUI-NL_Nodes/πŸ“€ NL Write
ComfyUI Node

πŸ“€ NL Write

Versioned, EXR-first, pipeline-friendly output β€” NL Write is the 'O' in this pack's IO

By NOLABEL-VFXΒ·Created 9 months agoΒ·Updated 2 months agoΒ· 0
πŸ“€ NL Write
  • images
  • mask
  • comparison_images
    β—„modeβ–Ύβ–Ί
    β—„namerenderβ–Ί
    β—„preview_modecolorβ–Ί
    β—„input_colorspaceautoβ–Ί
    β—„output_colorspaceACEScgβ–Ί
    β—„preview_colorspaceOutput - Rec.709β–Ί
    β—„save_modecolorβ–Ί
    β—„sequence_fps0.00β–Ί
    β—„single_extensionexrβ–Ί
    β—„sequence_save_pngfalseβ–Ί
    β—„reverse_sequencefalseβ–Ί
    β—„range_modecontextβ–Ί
    β—„range_start-1β–Ί
    β—„range_end-1β–Ί
    β—„sequence_save_mp4falseβ–Ί
    β—„sequence_mp4_crf23β–Ί
    β—„sequence_mp4_presetβ–Ύβ–Ί
    β—„sequence_save_movfalseβ–Ί
    β—„sequence_mov_profileβ–Ύβ–Ί
    β—„save_comparisonfalseβ–Ί
    β—„comparison_layouthorizontalβ–Ί
    β—„sequence_save_exrtrueβ–Ί
    β—„image_info_jsonβ€”β–Ί

    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 - single or sequence. This decides whether you're writing one image or a frame range.
    • save_mode - none, color, color+mask, transparent, or mask. 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 with sequence_mp4_crf (lower is better) and a sequence_mp4_preset; MOV writes ProRes profiles from proxy up to 4444xq.
    • range_mode / range_start / range_end - which frames of a sequence to save, context defaulting to the workflow frame range.
    • sequence_fps - custom FPS for video output; 0 falls back to workflow context FPS.
    • preview_mode - including comparison and comparison reveal, with save_comparison and comparison_layout to write comparison frames alongside.
    • Color: input_colorspace auto-resolves from image_info_json (assuming ACEScg if absent), output_colorspace is the canonical managed space for EXR, and preview_colorspace is 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.

    CategoryNOLABEL/IO

    Inputs (26)

    NameTypeDefaultDescription
    modeCOMBOWrite a single image or a sequence.
    nameSTRINGrenderBase output name; version suffix is added automatically.
    preview_modeCOMBOcolorChoose which preview(s) to show.
    input_colorspaceSTRINGautoIncoming image colorspace. Auto resolves from image_info_json, otherwise assumes ACEScg.
    output_colorspaceSTRINGACEScgCanonical colorspace used for EXR and managed color outputs.
    preview_colorspaceCOMBOOutput - Rec.709OCIO View used only for NL Write preview rendering.
    save_modeCOMBOcolorChoose what to save (color, mask, or alpha).
    sequence_fpsFLOAT0.000–240Custom sequence FPS. Set to 0 to use workflow context FPS.
    single_extensionCOMBOexrFile extension for single-image saves.
    sequence_save_pngBOOLEANfalseSave PNG preview frames for sequences.
    reverse_sequenceBOOLEANfalseReverse the order of sequence frames before saving.
    range_modeCOMBOcontextSelect frame range for image sequences.
    range_startINT-1-1–999999Custom range start frame (used when range_mode is custom).
    range_endINT-1-1–999999Custom range end frame (used when range_mode is custom).
    sequence_save_mp4BOOLEANfalseEncode an MP4 preview for sequences.
    sequence_mp4_crfINT230–51MP4 quality (lower is higher quality).
    sequence_mp4_presetCOMBOFFmpeg preset used for MP4 encoding.
    sequence_save_movBOOLEANfalseEncode a MOV (ProRes) for sequences.
    sequence_mov_profileCOMBOProRes profile used for MOV output.
    save_comparisonBOOLEANfalseSave comparison images as a separate output.
    comparison_layoutCOMBOhorizontalStack comparison frames horizontally or vertically.
    sequence_save_exrBOOLEANtrueSave canonical EXR frames for sequences.
    imagesoptIMAGEMain image input.
    maskoptMASKMask input (grayscale or alpha).
    comparison_imagesoptIMAGEOptional comparison image sequence.
    image_info_jsonoptSTRINGOptional serialized image metadata from NL Read.

    Outputs (0)

    No outputs