DCC Bridge
EXR and video out to Nuke, Resolve or Fusion — and a TCP server you probably shouldn't open
- images
- status
- render_path
ComfyUI is great at making frames and mildly annoying at handing them to the rest of a pipeline. The usual workaround is saving PNGs and dragging them into Resolve like it's 2011. DCC Bridge is FXTD Studios' answer: one output node that writes EXR sequences (or EXR plus a video file) in a shape a compositor can pick up, and, in its second mode, a small TCP server so a DCC app can talk back to the graph.
Export mode is the boring, useful half. Bridge mode is the interesting half, with a caveat you should read before enabling it.
Export Frames
Five required widgets drive everything:
- mode -
Export FramesorBridge Server. - source -
Auto,Images,Video,Sequence. Auto tries the IMAGE input, then the video path, then the sequence path. The tooltip's advice is good: select explicitly to avoid ambiguity, because a node that silently prefers one input over another when you have two connected is a debugging nightmare. - target - Nuke, Resolve or Fusion. This is a metadata hint, not a launch command; the node isn't going to remote-control your compositor.
- output_path - the directory to write into (in bridge mode, where the log goes).
- format -
EXR (16-bit half),EXR (32-bit float),EXR + H.264 MP4,EXR + ProRes MOV. The two hybrid formats also render a video file alongside the sequence, which is exactly what you want when the client needs a review copy and production needs the masters.
Optional inputs cover the three sources: images (a frame batch), video_path (a file on disk to decode and export), sequence_path (a pattern like /frames/frame.%04d.exr). Then fps, frame_start (default 1001 - the compositing convention, and the node knows it), frame_end (0 means "all found frames", sequences only), and filename_prefix.
Outputs are status and render_path, both STRING. It's an output node, so it always fires when the graph runs - including when you'd rather it didn't. If you're iterating and don't want to write a 4K EXR sequence every test run, mute the node rather than trusting yourself to remember.
Bridge Server, and the security bit
Set mode = Bridge Server and the node starts a TCP server - bridge_port 1987 by default, bridge_host 127.0.0.1 by default. The tooltip spells out the choice: 127.0.0.1 is loopback only, 0.0.0.0 binds all interfaces.
Take that seriously. Custom node packs run arbitrary Python with your user privileges - the ecosystem has a real, prosecuted malware incident in its history for exactly this reason - and a service listening on all interfaces is a service reachable from anything on the same network. Use loopback. If you need a second machine, tunnel it rather than binding wide.
Installing Radiance
Manager → search Radiance → install → restart → refresh. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt
Windows portable: use python_embeded\python.exe. Radiance is GPL-3.0, ~147 visible nodes, and the install is heavy - OpenEXR, OpenImageIO, OpenColorIO, diffusers and accelerate go into ComfyUI's Python environment. For EXR output specifically, OpenEXR is the library doing the work; on Python 3.14 there's no wheel yet, and the pack falls back to OpenImageIO and then OpenCV rather than failing the whole install. Worth knowing if EXR writes look subtly different on an unusual Python version.
Troubleshooting
A black or empty EXR. Classic. The graph handed over SDR-clamped or pre-tonemap data, or the input was an IMAGE tensor that never had values above 1.0 to begin with. Check what's actually on the wire - Radiance's own diagnostics show it - and choose 32-bit float if you have extreme linear values like direct sun or fire.
Video export fails. Video paths go through imageio-ffmpeg, which the requirements pin. If ffmpeg can't be located, the EXR half still writes and the video half doesn't. Check the console.
Nothing is written. output_path empty or unwritable. The node doesn't create deep directories silently; give it a path that exists, and make sure the ComfyUI process has permission to write there - a container with an oddly-mapped volume is the usual culprit.
The frame numbers are off by 1000. frame_start defaults to 1001 on purpose. If your Nuke script expects frame 1, set it.
Larger structural point. Radiance also ships dedicated Send to Nuke and Send to DaVinci Resolve nodes, plus a Write EXR Passes node for multipass. If you're doing straightforward "get this sequence into my comp", the dedicated send nodes are less configurable and less confusing than this one. Bridge is for when you want the sequence and the control channel.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | Export Frames | Export Frames = save EXR/video for DCC. Bridge Server = start TCP control server. |
| source | COMBO | Auto | Auto = try Images, then Video, then Sequence. Select explicitly to avoid ambiguity. |
| target | COMBO | Nuke | Target DCC application (metadata hint). |
| output_path | STRING | Output directory for EXR frames (Export mode) or bridge log (Bridge mode). | |
| format | COMBO | EXR (16-bit half) | EXR bit depth. +H.264 or +ProRes also generates a video file. |
| imagesopt | IMAGE | Batch of frames to export (used when source is Images or Auto). | |
| video_pathopt | STRING | Path to a video file (.mp4, .mov, etc.) to decode and export (source=Video or Auto). | |
| sequence_pathopt | STRING | Path/pattern to an image sequence e.g. /frames/frame.%04d.exr (source=Sequence or Auto). | |
| fpsopt | FLOAT | 24.0001–240 | Frame rate for video export. |
| frame_startopt | INT | 10010–999999 | Starting frame number for EXR sequence export. |
| frame_endopt | INT | 00–999999 | Last frame index (0 = read all found frames, for sequences only). |
| filename_prefixopt | STRING | frame | Prefix for EXR filenames (e.g. frame_1001.exr). |
| bridge_portopt | INT | 19871024–65535 | TCP port for Bridge Server (default 1987). |
| bridge_hostopt | STRING | 127.0.0.1 | Bind address (127.0.0.1 = loopback only; 0.0.0.0 = all interfaces). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| render_path | STRING | — |