<!-- Generated by tools/build_node_reference.py from the node definitions. Do not edit by hand. -->

# Review nodes

Viewer, scopes, preview servers, contact sheets, and QC.

11 nodes. [All sections](README.md)

- [Burn-In](#burn-in)
- [Contact Sheet](#contact-sheet)
- [False Color Monitor](#false-color-monitor)
- [Flipbook GIF](#flipbook-gif)
- [Focus Peaking](#focus-peaking)
- [HDR Monitor](#hdr-monitor)
- [Policy Guard](#policy-guard)
- [Preview Server](#preview-server)
- [QC](#qc)
- [Split View](#split-view)
- [Viewer](#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/<stream_name>. |
| `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 |
