Repeat (Open)
Real counted loops with state, inside an acyclic graph
- value_0
- value_1
- value_2
- value_3
- value_4
- value_5
- value_6
- value_7
- value_8
- value_9
- value_10
- value_11
- value_12
- value_13
- value_14
- value_15
- value_16
- value_17
- value_18
- value_19
- flow
- index
- value_0
- value_1
- value_2
- value_3
- value_4
- value_5
- value_6
- value_7
- value_8
- value_9
- value_10
- value_11
- value_12
- value_13
- value_14
- value_15
- value_16
- value_17
- value_18
- value_19
ComfyUI's execution graph is acyclic, which is normally a feature - but it means "run this block of nodes N times and feed each iteration's output into the next" isn't something you can just draw. Repeat (Open) is the top of a real counted loop, and it works by expanding the graph at queue time: each pass, the matching Repeat (Close) clones the whole loop body, wires it back into the next iteration, and runs it all inside one queue run. You get a genuine for i in range(count) with carried state, in a tool that wasn't built for loops at all.
How it's used
The pattern is: wire starting values into Repeat (Open)'s wildcard value_* inputs, read index inside the loop body, do your work, and feed the updated values back into Repeat (Close)'s value_* inputs. After count iterations, Close outputs the final state.
The smart move is the 🔗 Add / link Close button on the Open node - it spawns the matching Close and wires the flow and index links for you, so you never hand-draw the feedback loop. flow is the internal KINBURG_LOOP_FLOW token the Close node reads to find its Open, and index is the current iteration number (wire it to the Close's index input - the Auto-pair button does this too).
Two details from the source worth knowing:
countmust stay a widget value, not an input - it's read at expansion time, before the run, so converting it to an input will break the loop. Keep it typed on the node.- The
value_*slots are wildcard (*) and auto-growing: the node shows only connected slots plus a spare, and any type - IMAGE, LATENT, STRING, a list - works. They're also how state carries: whatever you feed into Close comes back out of the next iteration's Open.
When you'd reach for it
For each / collection loops where you need the previous iteration's result - a chain of img2img passes, an accumulator building up over N steps, a progressive upscale loop where each pass refines the last output. That's the "carried state" distinction: a plain map-over-a-list is For Each's job; Repeat is for feedback, where iteration N's output feeds iteration N+1's input. If the body doesn't depend on the previous pass, use For Each and keep things simple.
Installing it
It ships in Kinburg/Kinburg-Nodes - ComfyUI Manager search "Kinburg-Nodes", or cd ComfyUI/custom_nodes && git clone https://github.com/Kinburg/Kinburg-Nodes, restart. No dependencies, no models, pure graph machinery. Same pack also has While (Open)/While (Close) for condition-driven loops on the same engine, and Delay if you want to slow iterations down and watch them run. Start with a small count - a runaway loop is a polite way to burn an afternoon.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| count | INT | 41–100000 | How many times the loop body runs. Keep this a value (not an input) — it's read at expansion time. |
| value_0opt | * | — | |
| value_1opt | * | — | |
| value_2opt | * | — | |
| value_3opt | * | — | |
| value_4opt | * | — | |
| value_5opt | * | — | |
| value_6opt | * | — | |
| value_7opt | * | — | |
| value_8opt | * | — | |
| value_9opt | * | — | |
| value_10opt | * | — | |
| value_11opt | * | — | |
| value_12opt | * | — | |
| value_13opt | * | — | |
| value_14opt | * | — | |
| value_15opt | * | — | |
| value_16opt | * | — | |
| value_17opt | * | — | |
| value_18opt | * | — | |
| value_19opt | * | — |
Outputs (22)
| Name | Type | Description |
|---|---|---|
| flow | KINBURG_LOOP_FLOW | — |
| index | INT | — |
| value_0 | * | — |
| value_1 | * | — |
| value_2 | * | — |
| value_3 | * | — |
| value_4 | * | — |
| value_5 | * | — |
| value_6 | * | — |
| value_7 | * | — |
| value_8 | * | — |
| value_9 | * | — |
| value_10 | * | — |
| value_11 | * | — |
| value_12 | * | — |
| value_13 | * | — |
| value_14 | * | — |
| value_15 | * | — |
| value_16 | * | — |
| value_17 | * | — |
| value_18 | * | — |
| value_19 | * | — |