ComfyUI-ACES-IO
Professional OpenColorIO / ACES color-management nodes for ComfyUI. Mirrors Nuke's OCIO node set with ACES 2.0, 1.3, and 1.2 support, EXR sequence loading, animated preview, and video export (MP4, WebP, GIF).
Nodes (13)
Convert between any two color spaces without losing your mind
The one node every other ACES IO node plugs into
Bake a display transform into pixels — the Viewer's more committed sibling
Read EXR sequences like a Nuke Read node — the node AI pipelines were missing
Write real EXR sequences — half-float, full codecs, Nuke-Write style color transform
Drop any LUT file into your graph — .cube, .clf, .3dl, whatever
Stop guessing what your OCIO config actually contains
The one-switch bridge between linear and log — without typing space names
Apply ACES looks — gamut compression and studio looks in one node
Drop ProRes and MP4 footage straight into your graph
A preview node that doesn't break your chain
Turn a frame batch into MP4, ProRes, WebP, or GIF without leaving the graph
Why your ACES render looks washed out — and the node that fixes it
ComfyUI-ACES-IO
Professional OpenColorIO / ACES color-management nodes for ComfyUI, mirroring Nuke's OCIO node set. Supports ACES 2.0, ACES 1.3, and ACES 1.2 — with Nuke-style colorspace pickers, EXR sequence read/write, animated preview, ProRes MOV export, and video output.
What's New in v1.3
- OCIODisplay node — bake a Display View Transform into image data with a one-click Invert toggle (display → scene-linear roundtrip)
- EXR Loader color transforms — optional
ocio_configinput +colorspace/output_transformconvert on load, mirroring Nuke's Read node - EXR Saver color transforms — optional
ocio_configinput +input_transform/colorspaceconvert before write, mirroring Nuke's Write node - ProRes MOV export — Video Saver now supports ProRes 422, 422 HQ, 4444, and 4444 XQ via PyAV (10-bit; alpha preserved for 4444)
- ACES 1.2 always in dropdown — no longer requires a pre-existing download; auto-fetches the config (~130 MB) on first use
Features
- Full OCIO pipeline — every node mirrors its Nuke counterpart
- ACES 2.0 & 1.3 built-in — no download needed (bundled with PyOpenColorIO 2.3+)
- ACES 1.2 support — always in the preset dropdown; auto-downloads on first use
- Nuke-style colorspace picker — tabbed family browser with live search (ACES / Display / Input/ARRI / Input/Sony / Utility …)
- EXR Loader (Nuke Read node) — auto-detects full sequences from any single frame; supports
render.0001.exr,render_0001.exr,####,%04d;all/range/singleframe modes;error/black/holdmissing-frame policy; optional color transform on load - EXR Saver (Nuke Write node) — full 16f / 32f EXR with ZIP, PIZ, DWAA and all standard codecs; optional color transform before write
- Animated preview — sequence loads play back as animated WebP directly in the node
- Video Loader — loads
.mov,.mp4,.mxfand other formats; full ProRes support via PyAV - Video Saver — export IMAGE batches to MP4 (H.264), MOV ProRes (422 / 422 HQ / 4444 / 4444 XQ), Animated WebP, or Animated GIF
- Cache bypass — every node re-executes on each queue run so colorspace changes always take effect
Nodes
| Node | Nuke equivalent | Category | |------|----------------|----------| | ACES IO — Config Loader | Project Settings → OCIO | ACES IO/Config | | ACES IO — ColorSpace | OCIOColorSpace | ACES IO/Transform | | ACES IO — Display Transform | OCIODisplay | ACES IO/Transform | | ACES IO — Viewer | Nuke Viewer (LegacyViewingPipeline) | ACES IO/Viewer | | ACES IO — Look Transform | OCIOLookTransform | ACES IO/Transform | | ACES IO — File LUT | OCIOFileTransform | ACES IO/LUT | | ACES IO — Log Convert | OCIOLogConvert | ACES IO/Transform | | ACES IO — Config Info | — (utility) | ACES IO/Utility | | ACES IO — EXR Loader | Read node | ACES IO/EXR | | ACES IO — EXR Saver | Write node | ACES IO/EXR | | ACES IO — Video Loader | — (MOV/ProRes/MP4 input) | ACES IO/EXR | | ACES IO — Video Saver | — (MP4 / ProRes / WebP / GIF export) | ACES IO/EXR | | ACES IO — Preview | PreviewImage | ACES IO |
Installation
Via ComfyUI Manager (recommended)
- Open ComfyUI Manager → Install Custom Nodes
- Search for ComfyUI-ACES-IO
- Click Install and restart ComfyUI
Manual
cd ComfyUI/custom_nodes
git clone https://github.com/BISAM20/ComfyUI-ACES-IO
cd ComfyUI-ACES-IO
pip install -r requirements.txt
Then restart ComfyUI.
Dependencies
| Package | Purpose |
|---------|---------|
| PyOpenColorIO >= 2.3.0 | Core OCIO processing + built-in ACES configs |
| numpy | Image array operations |
| Pillow | Preview thumbnails, animated WebP / GIF export |
| opencv-python | MP4 video export + EXR fallback if OpenEXR is unavailable |
| OpenEXR (optional) | Full EXR read/write with all compression codecs |
| av (PyAV) (optional) | Video input (MOV/MP4/MXF) + ProRes MOV export |
PyOpenColorIO, numpy, Pillow, and opencv-python install automatically via pip install -r requirements.txt.
For full EXR compression support and ProRes export:
pip install openexr av
Quick Start
Basic ACES workflow
Load Image → Config Loader → ColorSpace (sRGB → ACEScg)
↓
[your nodes]
↓
Viewer (ACEScg → sRGB Display) → Preview
EXR sequence workflow
EXR Loader → ColorSpace (scene-linear → ACEScg) → Viewer → Video Saver
The EXR Loader outputs a [B, H, W, C] float32 batch tensor — one item per frame.
Set frame_mode = all to load everything on disk automatically (no manual range needed).
Colorspace picker
Every colorspace, display, and view input has a Browse button that opens a Nuke-style dialog:
- Top tabs — family groups (ACES, Display, Input, Utility, All)
- Sub-tabs — camera manufacturers (ARRI, Sony, RED, Canon …)
- Live search — type anywhere to filter across all colorspaces
Display Transform Node (OCIODisplay)
ACES IO — Display Transform bakes a Display View Transform into the image data — unlike the Viewer node which is for preview only.
| Input | Description |
|---|---|
| input_colorspace | Source colorspace (e.g. ACEScg) |
| display | Target display device (e.g. sRGB - Display) |
| view | View transform (e.g. ACES 2.0 - SDR 100 nits (Rec.709)) |
| invert | Reverses the transform — display-referred → input colorspace (scene-linear roundtrip) |
The invert toggle maps directly to Nuke's OCIODisplay invert knob, running the full display pipeline in reverse via TRANSFORM_DIR_INVERSE.
EXR Loader — Color Transforms
Connect an ocio_config to apply a color transform on load:
| Input | Description |
|---|---|
| colorspace | Color space the EXR file is stored as (file/camera space) |
| output_transform | Color space to deliver downstream (working/pipe space) |
When ocio_config is disconnected both fields are ignored and pixels pass through unchanged — mirrors Nuke's Read node behaviour.
EXR Saver — Color Transforms
Connect an ocio_config to apply a color transform before writing:
| Input | Description |
|---|---|
| input_transform | Color space of the incoming image (working/pipe space) |
| colorspace | Color space to store in the EXR file |
When ocio_config is disconnected both fields are ignored — mirrors Nuke's Write node behaviour.
EXR Loader — Frame Modes
| frame_mode | Behaviour |
|---|---|
| all (default) | Auto-detects every frame on disk from any single file or pattern |
| range | Loads first_frame … last_frame inclusive |
| single | Loads exactly the frame number specified by first_frame |
Supported naming conventions
| Pattern | Example |
|---|---|
| Dot-separated | render.0001.exr |
| Underscore-separated | render_0001.exr |
| Hyphen-separated | render-0001.exr |
| Frame-only | 0001.exr |
| With version token | shot_v01_beauty_0042.exr → uses 0042 as frame |
| Nuke hash | render.####.exr |
| Printf | render.%04d.exr |
Missing frames policy
| Option | Behaviour |
|---|---|
| error (default) | Raises an exception — matches Nuke default |
| black | Substitutes a black frame |
| hold | Repeats the last successfully loaded frame |
Video Saver
Export any IMAGE batch to a video file directly from your graph:
| Format | Notes | |---|---| | MP4 (H.264) | Standard video via OpenCV — plays in any media player | | MOV ProRes 422 | Apple ProRes 422 — 10-bit YUV 4:2:2 via PyAV | | MOV ProRes 422 HQ | Apple ProRes 422 HQ — higher bitrate 10-bit via PyAV | | MOV ProRes 4444 | Apple ProRes 4444 — 10-bit 4:4:4, alpha channel preserved via PyAV | | MOV ProRes 4444 XQ | Apple ProRes 4444 XQ — highest quality + alpha via PyAV | | Animated WebP | High-quality, plays in browsers and most modern viewers | | Animated GIF | Universal compatibility; 256-colour limit |
The node passes the IMAGE tensor through unchanged so it can sit anywhere in a graph without interrupting the flow.
Supported ACES Configs
| Preset | OCIO version | Notes |
|--------|-------------|-------|
| ACES 2.0 CG | 2.5 | Recommended for CG work |
| ACES 2.0 Studio | 2.5 | Recommended for live-action / studio |
| ACES 1.3 CG | 2.1 / 2.3 / 2.4 | Legacy, three OCIO versions |
| ACES 1.3 Studio | 2.1 / 2.3 / 2.4 | Legacy, three OCIO versions |
| ACES 1.2 | v1 (colour-science) | Auto-downloads on first use (~130 MB) |
| Custom path | any | Point to your own .ocio / .ocioz file |
ACES 1.2 config can also be downloaded manually from colour-science/OpenColorIO-Configs.
License
MIT — see LICENSE
The ACES configs bundled within PyOpenColorIO are released under the Academy Software Foundation (ASWF) open-source license. The ACES 1.2 config is released by colour-science under the BSD license.