Review nodes
Viewer, scopes, preview servers, contact sheets, and QC.
11 nodes. All sections
- Burn-In
- Contact Sheet
- False Color Monitor
- Flipbook GIF
- Focus Peaking
- HDR Monitor
- Policy Guard
- Preview Server
- QC
- Split View
- Viewer
Burn-In
RadianceFrameStamp

Burn frame number, timecode, and metadata into an image for dailies.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
images |
IMAGE | Float frames to stamp. Values outside the overlay and the source alpha are preserved, including negative and HDR values. Text RGB is 230/255 in the input encoding; no colour transform is applied. | ||
start_frame |
int | 1001 | 0 to 999999 | Frame number of the first frame in the batch. |
fps |
float | 24 | 1 to 120, step 0.001 | Frames per second (used for timecode calculation). |
drop_frame (optional) |
boolean | off | Use SMPTE drop-frame timecode (DF). Only meaningful at 29.97 or 59.94 fps. Uses ';' separator instead of ':' for the frame field. | |
show_frame_number (optional) |
boolean | on | Burn the frame number as '# 001001' (6 digits). | |
show_timecode (optional) |
boolean | on | Burn the SMPTE timecode of the frame number at fps. Frame 0 is 00:00:00:00. | |
custom_text (optional) |
string | Additional text burned into each frame (e.g. shot name, version). | ||
position (optional) |
choice | bottom_left |
bottom_left, bottom_right, top_left, top_right, center |
Where the text block sits in the frame. |
font_scale (optional) |
float | 1 | 0.5 to 4, step 0.1 | Text size: 14 px x scale (minimum 12 px) with DejaVu Sans Mono. Without that font, Pillow's fixed default font is used and only the margins scale. |
opacity (optional) |
float | 0.85 | 0.1 to 1, step 0.05 | Text opacity; the dark backing box uses 0.6 x this. |
Outputs
| Output | Type |
|---|---|
stamped |
IMAGE |
Contact Sheet
RadianceContactSheet

Render a contact sheet grid of multiple images for review.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
images |
IMAGE | Frame batch to lay out, left to right then top to bottom. Clamped to [0, 1] and resized through 8-bit, so display-encoded input is expected. | ||
thumb_width |
int | 160 | 32 to 512, step 8 | Width of each thumbnail in pixels. |
max_cols |
int | 8 | 1 to 32 | Maximum number of columns. Rows are computed automatically. |
label_frames (optional) |
boolean | on | Print the frame index below each thumbnail. | |
background (optional) |
choice | Black |
Black, Grey, White |
Fill colour for empty cells and label strips (Grey is 64/255). |
Outputs
| Output | Type |
|---|---|
contact_sheet |
IMAGE |
grid_cols |
INT |
grid_rows |
INT |
False Color Monitor
RadianceFalseColorMonitor

Display a false-colour exposure monitor for on-set or grading use.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
image |
IMAGE | Rec.709-primary image to check, returned unchanged on passthrough. Choose its input encoding below; zones measure linear luminance. Convert other primaries into Rec.709 before connecting. | ||
strength |
float | 1 | 0 to 1, step 0.05 | Blend factor. 0 = off, 1 = full false color. |
hdr_peak (optional) |
float | 1 | 0.1 to 100, step 0.1 | Luma is divided by this before the zone lookup (1.0 for SDR). For scene-linear HDR at 1.0 = 203 nits, a 1000-nit peak is about 4.93. |
input_encoding (optional) |
choice | Linear Rec.709 |
Linear Rec.709, sRGB, Rec.709 |
Transfer encoding of the input. sRGB and Rec.709 are decoded before measuring luminance; Linear Rec.709 preserves legacy behaviour. The false-colour output is an SDR diagnostic image, not HDR mastering. |
Outputs
| Output | Type |
|---|---|
passthrough |
IMAGE |
false_color |
IMAGE |
Flipbook GIF
RadianceFlipbookGIF

Export a sequence as an animated GIF flipbook for quick review.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
images |
IMAGE | Frames to animate, returned unchanged on passthrough. Clamped to [0, 1] and quantised to a 256-colour palette, so display-encoded input is expected. | ||
save_path |
string | preview/flipbook.gif |
Output .gif path. A relative path is written under ComfyUI's output/ folder; absolute paths are used as given. The directory is created automatically. | |
fps |
float | 12 | 1 to 60, step 0.5 | Playback speed. GIF frame delay = 1000/fps ms. |
max_width |
int | 480 | 64 to 1920, step 8 | Resize frames to this width (preserves aspect ratio). Smaller = smaller file. |
loop (optional) |
boolean | on | Loop the animation indefinitely. | |
dither (optional) |
boolean | on | Enable Floyd-Steinberg dithering for smoother gradients. |
Outputs
| Output | Type |
|---|---|
passthrough |
IMAGE |
status |
STRING |
Focus Peaking
RadianceFocusPeaking

Overlay focus-peaking highlights on edges for sharpness assessment.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
image |
IMAGE | Image to check, returned unchanged on passthrough. Edges are measured on BT.709 luma, normalised to the strongest edge in each frame. | ||
threshold |
float | 0.2 | 0.01 to 1, step 0.01 | Normalised Sobel magnitude above which a pixel is considered in-focus. |
peak_color |
choice | Red |
Red, Green, White, Yellow, Cyan |
Overlay colour painted on pixels above threshold. |
strength |
float | 0.85 | 0 to 1, step 0.05 | Blend factor for the peaking overlay. |
Outputs
| Output | Type |
|---|---|
passthrough |
IMAGE |
focus_peak |
IMAGE |
HDR Monitor
RadianceHDRMonitor

HDR monitor / preview node. SDR tone-map or direct PQ/HLG display encoding. Wire in parallel — does not affect your HDR pipeline.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
image |
IMAGE | Scene-linear HDR, 1.0 = reference white (203 nits for the PQ and HLG modes). Negatives are clipped. | ||
mode |
choice | Preview (SDR) |
Preview (SDR), Rec.2100 PQ, Rec.2100 HLG |
Preview (SDR): tone-map to 0 to 1 for a normal monitor. Rec.2100 PQ / HLG: encode the signal for an HDR display (no gamut conversion). |
operator (optional) |
choice | ACES (Narkowicz) |
ACES (Narkowicz), Filmic (Hejl-Burgess), Reinhard Extended, Exposure + Gamma |
[Preview (SDR)] Tone-mapping operator. |
exposure (optional) |
float | 0 | -6 to 6, step 0.1 | [Preview (SDR)] EV offset applied before tone mapping. |
saturation (optional) |
float | 1 | 0 to 2, step 0.05 | [Preview (SDR)] Post-tonemap saturation scale. |
gamma (optional) |
float | 2.2 | 1 to 3, step 0.05 | [Preview (SDR)] Display gamma, applied as a pure 1/gamma power. 2.2 approximates sRGB, 2.4 matches BT.1886. |
reinhard_white (optional) |
float | 4 | 0.5 to 100, step 0.5 | [Preview (SDR) / Reinhard Extended] White point. |
peak_nits (optional) |
float | 1000 | 100 to 10000, step 100 | [Rec.2100 PQ] Mastering display peak luminance in nits. |
gamma_correct_sdr (optional) |
boolean | on | [Preview (SDR)] Apply the 1/gamma display encoding after tone mapping. Applies to every preview operator, including Exposure + Gamma. |
Outputs
| Output | Type |
|---|---|
preview |
IMAGE |
Policy Guard
RadiancePolicyGuard

Check every frame against a delivery policy (peak nits, clipping, black crush, luma, saturation, P3 gamut, required metadata). Reports the worst frame. Picture only: there is no audio input, so no loudness check.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
mode |
choice | Guard |
Preset, Guard |
Preset: output a policy JSON (data1) and its description (data2); the image is not checked. Guard: check the image against a policy. |
image |
IMAGE | Frames to check. Peak nits are read as set by signal; clipping, black crush and luma are measured on the values as they are. Ignored in Preset mode. | ||
preset (optional) |
choice | Broadcast SDR |
Broadcast SDR, Cinema HDR (P3-PQ), OTT HDR10, Social Media, Custom |
Delivery policy to output in Preset mode. Custom uses the custom_* values. |
policy_file (optional) |
string | Optional path to a policy JSON file; when it loads, it replaces the preset. A failed load logs a warning and falls back to the preset. Preset mode only. | ||
custom_max_peak_nits (optional) |
float | 1000 | 0 to 10000, step 10 | Custom preset: highest allowed peak, in nits (read as set by signal in Guard mode). Preset mode only. |
custom_max_clipping (optional) |
float | 0.01 | 0 to 1, step 0.001 | Custom preset: highest allowed fraction of pixels with luma above 0.99 (0.01 = 1%). Preset mode only. |
custom_max_black_crush (optional) |
float | 0.05 | 0 to 1, step 0.001 | Custom preset: highest allowed fraction of pixels with luma below 0.01 (0.05 = 5%). Preset mode only. |
custom_max_saturation (optional) |
float | 1 | 0 to 2, step 0.01 | Custom preset: highest allowed mean HSV-style saturation, (max - min) / max per pixel. 1.0 only fails on negative pixel values. Preset mode only. |
policy (optional) |
string | Policy JSON, usually data1 of a Preset-mode Policy Guard. When connected it replaces all max_* and require_metadata values. Guard mode only. | ||
max_clipping (optional) |
float | 0.01 | 0 to 1, step 0.001 | Highest allowed fraction of pixels with luma above 0.99, worst frame. Guard mode, used only when policy is empty. |
max_black_crush (optional) |
float | 0.05 | 0 to 1, step 0.001 | Highest allowed fraction of pixels with luma below 0.01, worst frame. Guard mode, used only when policy is empty. |
max_saturation (optional) |
float | 1 | 0 to 2, step 0.01 | Highest allowed mean saturation, (max - min) / max per pixel, worst frame. 1.0 only fails on negative pixel values. Guard mode, used only when policy is empty. |
max_peak_nits (optional) |
float | 1000 | 0 to 10000, step 10 | Highest allowed peak in nits, the brightest channel read as set by signal. Guard mode, used only when policy is empty. |
require_metadata (optional) |
string | Comma-separated metadata keys that must appear in metadata_present, for example colorspace, eotf. Guard mode, used only when policy is empty. | ||
metadata_present (optional) |
string | Comma-separated metadata the deliverable carries, as keys or key=value pairs. Only the keys are checked. Guard mode only. | ||
signal (optional) |
choice | Display SDR (1.0 = 100 nits) |
Display SDR (1.0 = 100 nits), Scene-linear (1.0 = 203 nits), PQ (ST 2084), HLG (BT.2100, 1000-nit display) |
How pixel values are read as light for the peak check. Display SDR: 1.0 = 100 nits (BT.1886 white). Scene-linear: Radiance's convention, 1.0 = 203 nits (BT.2408). PQ: ST 2084 code values, absolute. HLG: BT.2100 code values on the 1000-nit reference display. Guard mode only. |
Outputs
| Output | Type |
|---|---|
image |
IMAGE |
passed |
BOOLEAN |
data1 |
STRING |
data2 |
STRING |
score |
INT |
Preview Server
RadiancePreviewServer

Run a local HTTP preview server for browser-based image review.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
images |
IMAGE | Frames to publish, returned unchanged on passthrough. Only the last frame is served, clamped to [0, 1] as an 8-bit JPEG. | ||
port |
int | 8765 | 1024 to 65535 | TCP port for the preview HTTP server. |
stream_name |
string | radiance |
Stream identifier. Access at /frame/ |
|
jpeg_quality (optional) |
int | 85 | 20 to 99 | JPEG compression quality (20=small, 99=lossless-ish). |
resize_width (optional) |
int | 0 | 0 to 3840 | Resize frame before serving (0 = original size). Smaller = faster over network. |
enabled (optional) |
boolean | on | Off: skip publishing this frame. A server already started keeps running and serves the previous frame. |
Outputs
| Output | Type |
|---|---|
passthrough |
IMAGE |
server_url |
STRING |
QC
RadianceQC

Run technical QC on an image or sequence (crushed blacks, clipped whites, out-of-range values, banding, optional noise, compression and focus scores) with a paint overlay, or export a report.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
mode |
choice | Analyze |
Analyze, Export |
Analyze: run the checks on image. Export: write qc_report_json to disk (the image and check settings are ignored). |
image (optional) |
IMAGE | Image or sequence to check, as delivered (usually display-encoded 0..1). Required in Analyze mode. | ||
black_threshold (optional) |
float | 0 | -0.1 to 0.1, step 0.001 | Channel values below this count as crushed, and any crushed value fails the frame. The default 0 flags only negative values. |
white_threshold (optional) |
float | 1 | 0.8 to 2, step 0.01 | Channel values above this count as clipped, and any clipped value fails the frame. The default 1.0 flags only values over display white. |
overlay_opacity (optional) |
float | 0.5 | 0 to 1, step 0.1 | Opacity of the red (clipped) and blue (crushed) paint on the output image. 0 passes the image through. |
banding_threshold (optional) |
float | 5 | 0 to 20, step 0.5 | Banding risk, in percent of the frame, at or above which a banding warning is reported. Warning only, it never fails a frame. |
enable_focus_check (optional) |
boolean | off | Add a Laplacian-variance sharpness score; below 20/100 is reported as a low-sharpness warning. | |
enable_artifacts_check (optional) |
boolean | on | Add an 8x8 block-edge score for JPEG/DCT compression artifacts; 10/100 or more is a warning. | |
enable_noise_check (optional) |
boolean | on | Add a high-frequency noise score; below 5/100 warns of over-denoising, above 30/100 of high noise. | |
fail_on_errors (optional) |
boolean | off | Stop the workflow with an error, carrying the report, when QC fails. Off: the failure is only reported. | |
qc_report_json (optional) |
string | json_report output of an Analyze run. Export mode only. | ||
output_path (optional) |
string | Export folder. Empty = ComfyUI output folder; relative = subfolder of it; absolute paths are used as is. Export mode only. | ||
filename_prefix (optional) |
string | qc_report |
Report file name stem; a date-time stamp and the extension are appended. Export mode only. | |
export_format (optional) |
choice | json |
json, csv, html, all |
Report file format to write; all writes JSON, CSV and HTML. Export mode only. |
Outputs
| Output | Type |
|---|---|
image |
IMAGE |
text_report |
STRING |
json_report |
STRING |
status |
STRING |
Split View
RadianceSplitView

Side-by-side or wipe comparison between two images or versions.
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
image_a |
IMAGE | Original / reference image. | ||
image_b |
IMAGE | Processed / graded image. | ||
mode |
choice | wipe_h |
wipe_h, wipe_v, side_by_side, diff |
wipe_h: A left, B right of a vertical line. wipe_v: A above, B below. side_by_side: left half of A beside right half of B (fixed 50% split). diff: |A - B| x 4, clipped to [0, 1]. |
position |
float | 0.5 | 0 to 1, step 0.01 | Wipe line position as a fraction of width (wipe_h) or height (wipe_v): 0 = all B, 1 = all A. Unused in side_by_side and diff. |
Outputs
| Output | Type |
|---|---|
comparison |
IMAGE |
Viewer
RadianceViewer

Radiance Viewer, VFX review for scene-linear and HDR images: • Simple mode (picture, compare, playback) or Advanced (every panel), switched in its title bar • Compare against compare_image or a pinned frame: B, wipe, difference, blink • GPU Waveform / RGB Parade / Vectorscope / Histogram scopes • Power Windows masking (Radial + Box, feather, rotation) • Comparison Bridge — mouse-draggable wipe + reference shelf (8 stills) • Anamorphic lens streaks + Brown-Conrady k1/k2 distortion • Edge-preserving Bilateral Filter denoising (7×7 GPU kernel) • Channel viewing (RGB/R/G/B/Alpha/Luma), False Color, Zebra • 16-bit PNG + .rhdr HDR sidecar + .exr export • IMAGE passthrough — no longer a dead-end node
Inputs
| Input | Type | Default | Range or choices | What it does |
|---|---|---|---|---|
image |
IMAGE,VIDEO | IMAGE batch or VIDEO to review. Returned unchanged as an IMAGE; input_space decides how it is displayed. | ||
compare_image (optional) |
IMAGE,VIDEO | Optional B side (IMAGE or VIDEO) for the viewer's wipe and compare modes. Every frame is sent; its display space is resolved like image's. | ||
zdepth (optional) |
IMAGE,VIDEO | Z-Depth map to display when pressing Z button | ||
exposure_bracketing (optional) |
boolean | off | Write -2 EV / +2 EV preview thumbnails for the analysis shelf. One extra PNG per frame per bracket; off by default because a long shot pays for it on disk. | |
input_space (optional) |
choice | Auto |
Auto, sRGB (ComfyUI IMAGE), Linear Rec.709 (sRGB), ACEScg, Linear Rec.2020, Linear P3-D65, ACES2065-1 |
What the incoming pixels are. A ComfyUI IMAGE is sRGB-encoded and is shown untouched, exactly as ComfyUI previews it. Linear sources (HDR Decode, SDR -> HDR, Read in a linear working space) are shown through OpenColorIO's ACES 2.0 SDR view. Auto: linear when any value is above 1.0 or below 0, otherwise sRGB. Set it explicitly for linear material that stays inside 0-1. |
float_precision (optional) |
choice | Half (16-bit) |
Half (16-bit), Full (32-bit) |
Precision of the float frames sent to the browser. Half is what OpenEXR, RV and Nuke's viewer cache use: exact for display and grading, half the size (about 60 MB less per 4K frame). Full keeps every fp32 bit for values above 65504 or bit-exact probing. |
fps (optional) |
float | 0 | 0 to 240, step 0.001 | Playback rate. 0 = the source's rate (a VIDEO input carries it), 24 for an image batch. 23.976 / 29.97 / 59.94 are handled as the NTSC rates. |
Outputs
| Output | Type |
|---|---|
image |
IMAGE |