KIE • Variation Board
Put your four takes side by side, permanently
- take_1_image
- take_2_image
- take_3_image
- take_4_image
- comparison_board
- comparison_json
- saved_files_json
Judging four variations by clicking through a preview queue is how you end up picking the third one because it was the last one you looked at. KIE • Variation Board renders them into one image, in a grid, each labelled with the exact change it represents - then saves that image so it's still there next week.
It never generates anything and it never scores anything. Explicitly: "Editor visual comparison... no automatic quality score." You make the call; the node makes the call easy.
What it renders
The upstream KIE • Variation Matrix produced a manifest. The board reads it, matches each connected image to its take number, and lays out a grid - two columns when you've connected more than one take, one when you haven't. Each card shows the image, TAKE 2, and the delta text that produced it, wrapped to two lines.
So the board isn't just a picture; it's a captioned argument. "TAKE 1 / wide framing" and "TAKE 3 / close-up framing" printed under the frames turns a vibe check into a review you can act on.
The comparison metadata comes back as comparison_json - the take number and delta for each compared image, plus a method note pointing out that matching base prompt and settings have to be verified from your generation recipes, because the board can't see them.
It's an output node, so the sheet is saved under output/KIE-Variations/Comparison when you queue, and its file reference is stored in the workflow so the preview survives a reload.
Inputs and outputs
- matrix_json - forced input from Variation Matrix. The board validates it: one to four takes, each a proper object.
- take_1_image - required
IMAGE. - take_2_image / take_3_image / take_4_image - optional
IMAGEsockets.
Outputs: comparison_board (the rendered IMAGE), comparison_json, and saved_files_json.
An important constraint baked into every take socket: each one takes a single image, not a batch. The same rule as the storyboard hero frames, and the same error if you forget - take_1 must be one RGB/RGBA IMAGE. If your generator returns a batch, index a frame out of it first.
Connecting take 3 when the matrix has no such take isn't a silent mistake either - Take 3 is not defined in this Variation Matrix. The node cross-checks numbers, so a mismatch between what you generated and what you planned gets caught here rather than in your notes.
The honest reading of a board
This is where I'd push back on the usual framing of these nodes. A contact sheet doesn't tell you which take is better; it lets you see the delta clearly enough to decide with your own eyes. If two cards look identical, either the change was too subtle for the model or your prompted change was ignored - both are useful findings, and neither is something an automated score would have told you honestly.
Worth doing: pair the board with KIE • Save Generation Recipe if you're running this seriously. The board records the deltas; the recipe records the model, the exact prompt and the task IDs. Together they're the thing you actually need when a take wins and you have to reproduce it.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
cd ComfyUI-KIE-Nodes-Next
pip install -r requirements.txt
Restart and look under KIE Next / Studio / Production. Local Pillow rendering, no credits, no key needed for this node. Pillow is a pack requirement, so nothing extra to install.
Gotchas
"Connect a Variation Matrix JSON output." You wired a prompt string into matrix_json instead of the manifest. It needs the matrix_json socket specifically.
"Connect at least one generated image to compare." take_1_image is required and has to be connected - an unconnected required input stops execution earlier than you'd expect.
Fonts look different per machine. Card captions use Arial when present and PIL's default bitmap font otherwise, so identical graphs can render slightly differently on Linux and Windows. Cosmetic only.
Don't reuse one board for two experiments. The manifest is per-experiment. If you change the matrix, the board's captions change with it, and last week's saved sheet is now the only record of the old one - which is exactly why it saves.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| matrix_json | STRING | — | |
| take_1_image | IMAGE | — | |
| take_2_imageopt | IMAGE | — | |
| take_3_imageopt | IMAGE | — | |
| take_4_imageopt | IMAGE | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| comparison_board | IMAGE | — |
| comparison_json | STRING | — |
| saved_files_json | STRING | — |