ComfyUI Node

Bundle Grid List

Every combination of your settings, from one click

By Stibo·Created 7 months ago·Updated 7 days ago· 11
Bundle Grid List
  • bundle
  • list
◄values1►

A1111 had XYZ plot, and people have been quietly annoyed about its absence ever since. The honest ComfyUI answer for a long time was "install three different nodes and a custom sampler." The actual answer is that ComfyUI supports output lists - one wire can carry many values and run everything downstream once per value - and almost nobody uses them because the syntax was never explained.

Bundle Grid List is the pack's grid test: you list the values you want to sweep, it produces the cartesian product as a list of Bundles, and each Bundle runs your workflow once.

What it's for

The "which of these is better" problem, solved in one queue. CFG 3, 4, 5 × steps 15, 20 × two prompts = twelve renders, twelve files, and - if you route the values into the filename - twelve files you can actually tell apart without opening them.

This is the node in the pack that leans hardest on the Bundle system. Values are packed as named keys, so the same list can feed a sampler parameter, a prompt fragment, and a filename pattern without any of those three knowing about the others.

The input format is the whole node

Each auto-growing values field is a single line with three parts: a name, an =, and a comma-separated list of values.

cfg=3,4,5
steps=15,20
sampler=euler,dpmpp_2m

Three fields like that is 3 × 2 × 2 = twelve bundles out. The name becomes the bundle key, so downstream you read it back with Bundle Get or drop it into a string with Bundle To String.

Values are typed on the way in: anything that parses as an int becomes an INT, then a float, otherwise it stays a string. So cfg=3,4.5,high gives you an int, a float and a string - which is convenient until a typo silently turns a number into text. Empty fields and lines with no = are ignored rather than fatal.

Names support dot notation, and the node builds real nesting for them. settings.width=512,768 produces {"settings": {"width": 512}}, readable downstream as settings.width. The base bundle you optionally connect is merged underneath every combination, and the node writes into copies, so your original bundle isn't mutated - though only along the path it writes, so don't expect deep-freeze semantics.

Inputs and outputs

  • bundle (optional) - a base bundle merged into every generated combination. This is how you keep the constants (model name, seed, target folder) in one place and sweep only the variables.
  • values1 … valuesN - auto-growing fields in the name=v1,v2,v3 format.

One output: list, a list of BUNDLE - one per combination. Wire it into Bundle Get / Bundle To String nodes, or into the pack's save node for the metadata.

Keep the order of fields in mind: the product is generated field by field, so the last field changes fastest. That's the difference between a grid that reads sensibly and one that looks shuffled.

Installing it

ComfyUI Manager → search Nifty Nodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/Stibo/comfyui-nifty-nodes

Restart ComfyUI. The pack declares color-matcher and imageio-ffmpeg; Manager installs them for you. This node needs nothing beyond the pack itself. It's written against ComfyUI's V3 backend API, so no NODE_CLASS_MAPPINGS in the source is expected. Source marks it experimental, and the author's README flags the whole pack as untested with the Nodes 2.0 frontend.

Where people get burned

  • The grid multiplies everything. Twelve bundles is twelve sampler runs, twelve decodes, twelve VAE passes. Start with a small model or low step count to check the plumbing, then run it for real.
  • Filenames collide. Twelve combinations saved with the same prefix and no distinguishing value is a pile of PNGs you'll sort by hand. Read the swept fields back with Bundle To String and put them in the filename.
  • Keys that don't match. Bundle Get uses the exact dotted path you wrote here - settings.width, not width - and a typo returns nothing rather than complaining.
  • Bundles carry values, not types. Everything downstream is the same graph; if you want the sampler name swept, put the string in a bundle and feed it into a loader that accepts a string, don't expect the graph to rewire itself.
Categorynifty/outputlist

Inputs (2)

NameTypeDefaultDescription
bundleoptBUNDLEOptional base values merged into every generated combination.
values1optSTRINGFormat: "name=value1,value2,value3". Use dot notation for nested keys, e.g. "settings.width". Leave empty to ignore.

Outputs (1)

NameTypeDescription
listBUNDLE—