WI Grid Compositor
Your A/B test, arranged as a labeled grid you can actually read
- images
- iteration_meta
- grid_image
WI Grid Compositor is the payoff node of the Workflow Iterator pack. The iterator queues your 30 renders; this node collects all 30 and stitches them into one labeled comparison grid so you don't have to flip through the output panel squinting. It's the closest ComfyUI has to A1111's old x/y plot - which, as anyone who's asked around the subreddit lately can tell you, is still a thing people miss (thread 1twjl1k, +96).
Mechanically it's cleverer than it looks. ComfyUI can't hold 30 images in one node, so the compositor writes each iteration's image to a temp PNG as it completes, registers it with the pack's batch state manager, and returns the current image as a pass-through. Only when the last iteration completes does it load everything back, build the grid, and emit it. If you're not in a batch, it just passes images through untouched - it degrades to a plain preview.
The inputs that matter
images- wire this to the image output of your generation pipeline (after VAE decode).iteration_meta- from theWI Workflow Iteratornode. This is what tells the compositor which batch it's collecting and which combination each image belongs to. Forget it and the node never knows a batch is running.cell_width/cell_height/padding/label_font_size- grid cosmetics, in pixels. Defaults (512/512/10/16) are fine for a first run; drop cell size if your batch is huge.x_param_name/y_param_name- overrides for which parameter labels each axis, when you don't want the default assignment.save_grid/output_dir- save the finished grid (default on) intooutput/workflow_iterator/as{batch_name}_grid_{timestamp}.png.
The output grid_image is the assembled grid as an IMAGE tensor; with save_grid on it's also written to disk.
What you actually get
The grid layout depends on what you ran. A two-parameter matrix sweep gets the full treatment: rows on one parameter, columns on the other, axis labels pulled straight from the tested values - that's the case where this node earns its keep. Everything else - linear mode, one parameter, or three-plus - falls back to a linear strip with per-cell labels. And when two parameters are in play, the compositor reorders cells into row-major order for you, so the grid matches the labels even though the iterations queued in a different order.
One caveat from the source: the two-parameter grid assumes a clean Cartesian product. If a combination is missing (say, a parameter failed to parse), that cell just doesn't render - you get a hole in the grid, not a crash.
Install and notes
Same pack install: ComfyUI Manager → search "Workflow Iterator", or git clone https://github.com/jason-n-tran/comfyui-workflow-iterator into custom_nodes, restart. Dependency is just Pillow>=9.0.0. Temp images live in a .wi_temp subfolder under your output dir while a batch runs; they're part of the machinery, not junk to delete mid-batch. It's a young pack (v1.0.0, MIT), so expect rough edges, but the grid itself is genuinely the nice part - I'd rather read one labeled grid than 40 orphaned output PNGs any day.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| cell_width | INT | 51264–2048 | — |
| cell_height | INT | 51264–2048 | — |
| padding | INT | 100–100 | — |
| label_font_size | INT | 168–48 | — |
| x_param_name | STRING | — | |
| y_param_name | STRING | — | |
| save_grid | BOOLEAN | true | — |
| output_dir | STRING | workflow_iterator | — |
| iteration_metaopt | WI_ITERATION_META | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| grid_image | IMAGE | — |