Axis Pack
Change three things at once per grid cell — that's what packing is for
- input_a
- input_b
- input_c
- input_d
- input_e
- input_f
- input_g
- PACK
Axis Pack is how you cheat the XY grid's one-value-per-axis limit. The grid can sweep a row value against a column value - but what if you want a single row to swap the checkpoint and the LoRA and the prompt all at once? That's packing: bundle up to seven values into one PACK, drop that pack into a list, and the grid sweeps the whole bundle as if it were a single value.
It comes from kenjiqq/qq-nodes-comfyui, and the README's own "Axis Packing Grid" workflow example uses it to pass a unet, clip, and vae through one axis. The neat part: the pack carries its own label, so you can also use it with just one input purely to control what the final grid image calls that row.
How it works
- input_a (required) - the first value, any type.
- input_b through input_g (optional) - six more, any types, seven values total.
- label - a STRING. Type it directly (it's a widget, not a forced input). This becomes the grid annotation for that row/column, replacing the default
str(value)label. - PACK - the output.
Internally it builds a PackedAxisItem(label, [values]). When XY Grid Helper encounters a packed item in a list, it uses the item's label for the grid text and hands the values out as one AXIS_VALUE. On the output side you split it back apart with Axis Unpack - which sits in the same pack but wasn't in your search results - to get the individual values for your sampler.
The flow, end to end
- Build two or three Axis Pack nodes for the combinations you care about (checkpoint A + prompt 1, checkpoint A + prompt 2, …).
- Feed their PACK outputs into Any List to make the row or column list.
- Feed that list to XY Grid Helper.
- On the other side, route the helper's row/column output through Axis Unpack → get your values back → wire them to the model loader, text encoder, etc.
Gotchas
- The truthiness trap, again. Like Any List, this node only appends optional inputs that are truthy. A
0, empty string, orFalsein slots b–g silently vanishes. If your bundle feels one value short, that's the culprit. - Label only, one input, is a legit use.
input_ais required, but you can pack a single real value with a descriptive label - you get grid labels that say "Flux schnell" instead of the raw string. This is the cheapest way to make a grid readable, and people forget the pack offers it. - Keep types consistent per slot. Axis Unpack gives you back a fixed set of outputs; if slot b is a string in one pack and a model in another, the unpacked wire type is whatever ComfyUI resolves to - usually a headache.
Installing it
Part of qq-nodes-comfyui, no pip requirements:
cd ComfyUI/custom_nodes
git clone https://github.com/kenjiqq/qq-nodes-comfyui
Restart, or install qq-nodes-comfyui via ComfyUI Manager. It lives under QQNodes/XYGrid Axis, alongside the Axis To X converters.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| input_a | * | — | |
| input_bopt | * | — | |
| input_copt | * | — | |
| input_dopt | * | — | |
| input_eopt | * | — | |
| input_fopt | * | — | |
| input_gopt | * | — | |
| labelopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| PACK | PACK | — |