Dynamic Passthrough
The node that grows sockets as you wire it
- output
- output_2
- output_3
- output_4
- output_5
- output_6
- output_7
- output_8
- output_9
- output_10
- output_11
- output_12
- output_13
- output_14
- output_15
- output_16
- output_17
- output_18
- output_19
- output_20
- output_21
- output_22
- output_23
- output_24
- output_25
- output_26
- output_27
- output_28
- output_29
- output_30
- output_31
- output_32
This is the pack's flagship, and the node its author was most pleased to get right. Connect an image to it and an image socket appears on the other side. Connect a seed integer to a second input and a second, integer-typed output shows up. Each input gets its own output, the output type mirrors the input type, and the whole thing updates live as you add or remove connections. It's a bundle of typed passthroughs that only grows to the size you actually use.
The use case is subgraphs. ComfyUI's collapsing of a region into a reusable node hides internals behind an interface - and every value you want to cross that boundary has to come in on its own wire and go out on its own wire. The Dynamic Passthrough is the plumbing for that boundary: drop one at the edge of a group, wire the values you need through it, and the inputs/outputs mirror whatever those values are. No hunting for "which of these 32 sockets do I need" - you only ever see the ones with connections.
How it works
The backend declares up to 32 wildcard outputs (output plus output_2 through output_32) and a FlexibleOptionalInputType that accepts any input name. run reads the connected input_N slots in order and emits a tuple with None for anything unconnected - so an input with no connection simply doesn't appear on the wire. The live socket-growing, type-mirroring and slot pruning is all frontend JavaScript (in web/js/extension.js, prebuilt), which is why the node behaves differently from a static one: the canvas, not the server, decides what you see.
Two details worth having in your head:
- Muted or bypassed upstream nodes are treated as missing, so the corresponding output reads
None. That makes the node fallback-friendly - a muted branch silently drops out of the bundle. - Unused outputs are
None, not absent. Whatever you wire the output side into needs to tolerate that if you've left gaps.
Inputs and outputs
input_1,input_2, … (*) - as many as you connect, up to 32. Types mirror your connections.output,output_2, … (*) - one per input, same order, same type.
That's the whole thing. It lives under Tojioo Passthrough → Dynamic Nodes, and since v1.7.1 it appears in the drag-a-link slot menu for auto-insert.
Install
Manager → search "Tojioo Passthrough" → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Tojioo/tojioo_passthrough.git
No models, no pip deps. Small single-maintainer pack, GPL-3.0, actively developed - the author posts updates on r/comfyui and the Dec 2025 release thread specifically celebrated finally getting this node's dynamic behavior right.
Common issues
If the node shows up as a static 32-output monster instead of growing with your connections, the frontend extension didn't load - hard-refresh the browser, and make sure your ComfyUI is reasonably current, since the extension targets the modern frontend API. If an output is unexpectedly None, check whether the node feeding that input is muted or bypassed. And don't confuse it with Dynamic Any: that's the single-socket wildcard, this is the multi-lane one.
Inputs (0)
No inputs
Outputs (32)
| Name | Type | Description |
|---|---|---|
| output | * | — |
| output_2 | * | — |
| output_3 | * | — |
| output_4 | * | — |
| output_5 | * | — |
| output_6 | * | — |
| output_7 | * | — |
| output_8 | * | — |
| output_9 | * | — |
| output_10 | * | — |
| output_11 | * | — |
| output_12 | * | — |
| output_13 | * | — |
| output_14 | * | — |
| output_15 | * | — |
| output_16 | * | — |
| output_17 | * | — |
| output_18 | * | — |
| output_19 | * | — |
| output_20 | * | — |
| output_21 | * | — |
| output_22 | * | — |
| output_23 | * | — |
| output_24 | * | — |
| output_25 | * | — |
| output_26 | * | — |
| output_27 | * | — |
| output_28 | * | — |
| output_29 | * | — |
| output_30 | * | — |
| output_31 | * | — |
| output_32 | * | — |