arkennemasis Catalogue Fan-Out (one chain, N rows, concurrent)
One chain, N rows, rendered concurrently — the catalogue loop
- model_image
- cloth_image
- prompt
- filename
- sku
- index
- count
ArkCatalogueFanOut is the loop of the catalogue path. You build one generation chain - image edit node, save node, whatever the run needs - and this node makes that single chain render every row of the catalogue, concurrently. No copying the chain N times, no for loop in your head, no 200-node canvas. Wire it between ArkCatalogueLoad and your generator and the fan-out is the plumbing.
The mechanism is ComfyUI's OUTPUT_IS_LIST: everything this node emits except count is a list, and ComfyUI responds by running the downstream chain once per item. That's what turns one graph into N executions. Because the rows run through the same chain, the image generator's own concurrency gate overlaps the calls - which is the polite way of saying you get parallelism without blasting a rate limit.
How it works
The only required input is rows_json, straight from ArkCatalogueLoad's rows_json output. The node reads the rows, loads each row's model and cloth reference images from disk, and fans everything out:
model_image→ wire into the generator'simage_1cloth_image→image_2prompt→promptfilename→ the save node (the CSV's own filename, so files land where the spreadsheet says)sku,index- per-row identifiers for naming and recordscount- not a list; the total, for nodes that need to know how many there are
If there's nothing to generate - every row already delivered, or the filter on Load matched no rows - it raises and tells you so, rather than silently doing nothing.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install replicate httpx
Restart ComfyUI. It's pure list plumbing - no models, no keys.
Troubleshooting
- "nothing to generate" - all rows delivered, or the filter matched nothing. Check the Load node's
only/skip_existingsettings rather than assuming a broken graph. - One row per chain run means one failure can be per-row. The generator's retry logic (in the pack's API nodes) handles transient 429s and 5xx; a hard failure on one row aborts that run. That's why
skip_existingon Load matters - a failed run resumes without re-billing what already succeeded. - Concurrency caution: the pack's API nodes default to running one call at a time with an option for
all at once(capped at 2 by default). If you're paying per call, keep an eye on which mode your generator is in before you fan out 60 rows.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| rows_json | STRING | [] | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| model_image | IMAGE | — |
| cloth_image | IMAGE | — |
| prompt | STRING | — |
| filename | STRING | — |
| sku | STRING | — |
| index | INT | — |
| count | INT | — |