Dynamic Pipe Pack
Bundle a pile of wires into one pipe
- input_1
- input_2
- input_3
- input_4
- input_5
- input_6
- input_7
- input_8
- input_9
- input_10
- input_11
- input_12
- input_13
- input_14
- input_15
- input_16
- input_17
- input_18
- input_19
- input_20
- input_21
- input_22
- input_23
- input_24
- input_25
- input_26
- input_27
- input_28
- input_29
- input_30
- input_31
- input_32
- input_33
- input_34
- input_35
- input_36
- input_37
- input_38
- input_39
- input_40
- input_41
- input_42
- input_43
- input_44
- input_45
- input_46
- input_47
- input_48
- input_49
- input_50
- input_51
- input_52
- input_53
- input_54
- input_55
- input_56
- input_57
- input_58
- input_59
- input_60
- input_61
- input_62
- input_63
- input_64
- pipe
Every big ComfyUI workflow hits the same wall: you have an image, a mask, a prompt, a negative prompt, a latent and a model that all need to travel across the graph together, and dragging six colored lines over everything you've built makes it unreadable. Dynamic Pipe Pack is the fix. It grabs a handful of any-typed values, bundles them into one pipe output, and lets you unpack them somewhere far away. Same job as the rgthree Context nodes you already know - just more blunt and more generic.
The "generic" part is the whole point. Impact Pack's pipes are designed around SD workflow objects: model, CLIP, VAE, conditioning. This one doesn't care what you stuff in it. Images, masks, latents, strings, numbers, tensors - anything. If it can pass through a wire, it can ride in the pipe.
How it works
The backend is a tiny dict. pack() clamps your slot_count to 1–64, grabs whatever is connected to input_1 through input_slot_count, and returns {"slot_count": n, "values": [...]} as a single pipe output of type DYNAMIC_PIPE_BUNDLE. Nothing clever, no serialization, just a reference to values already in the graph. That's also why it doesn't save VRAM or make anything faster - it's purely organizational.
The clever bit is on the frontend. ComfyUI needs to know a node's full I/O shape before it runs, so the backend declares all 64 input_N slots even though you'll never see most of them. JavaScript then shows or hides them based on the slot_count widget, and adds a Refresh slots button in case the UI gets lazy. It's a fixed-maximum approach to a "dynamic" node, and it's a reasonable trade.
The inputs that matter
- slot_count - how many inputs the node shows, 1 to 64, default 8. This is the one you set.
- input_1 … input_N - the values to bundle. All
*type (wildcard), all optional, positional.
The output is one pipe, which you wire into a Dynamic Pipe Unpack. That's the only thing that speaks DYNAMIC_PIPE_BUNDLE.
Install
It's a ComfyUI Manager job: search comfyui_custom_pipe and hit install, then restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/julienpmorand/comfyui_custom_pipe
Restart ComfyUI. That's it - there are no Python dependencies, no model downloads, no requirements.txt. The whole pack is one __init__.py and a JS file. Worth knowing this is a new, small project with no community track record yet; the README even ships with YOUR_USERNAME placeholders in it.
Common gotchas
Slot order is everything. The node is positional and doesn't name anything: whatever you plug into input_1 comes out of output_1. Pick a convention (1 = image, 2 = mask, 3 = positive, 4 = negative…) and stick to it, ideally with a note node next to it. Future-you will not remember slot 6.
Wildcards mean no type checking. Because every socket is *, ComfyUI will happily let you connect a string where an IMAGE belongs. You won't find out until execution blows up. That's on you, not the node.
Lowering slot_count deletes sockets - and the links attached to them. Raise it again and reconnect. And if the inputs don't appear after changing the count, hit Refresh slots, then hard-refresh your browser (Ctrl+Shift+R) if it's still stuck.
Worth it? If your graph has a value group crossing half the canvas, yes. If you're only bundling two wires, a reroute is overkill and so is this - reach for the pipe when the bundle is real.
Inputs (65)
| Name | Type | Default | Description |
|---|---|---|---|
| slot_count | INT | 81–64 | — |
| input_1opt | * | — | |
| input_2opt | * | — | |
| input_3opt | * | — | |
| input_4opt | * | — | |
| input_5opt | * | — | |
| input_6opt | * | — | |
| input_7opt | * | — | |
| input_8opt | * | — | |
| input_9opt | * | — | |
| input_10opt | * | — | |
| input_11opt | * | — | |
| input_12opt | * | — | |
| input_13opt | * | — | |
| input_14opt | * | — | |
| input_15opt | * | — | |
| input_16opt | * | — | |
| input_17opt | * | — | |
| input_18opt | * | — | |
| input_19opt | * | — | |
| input_20opt | * | — | |
| input_21opt | * | — | |
| input_22opt | * | — | |
| input_23opt | * | — | |
| input_24opt | * | — | |
| input_25opt | * | — | |
| input_26opt | * | — | |
| input_27opt | * | — | |
| input_28opt | * | — | |
| input_29opt | * | — | |
| input_30opt | * | — | |
| input_31opt | * | — | |
| input_32opt | * | — | |
| input_33opt | * | — | |
| input_34opt | * | — | |
| input_35opt | * | — | |
| input_36opt | * | — | |
| input_37opt | * | — | |
| input_38opt | * | — | |
| input_39opt | * | — | |
| input_40opt | * | — | |
| input_41opt | * | — | |
| input_42opt | * | — | |
| input_43opt | * | — | |
| input_44opt | * | — | |
| input_45opt | * | — | |
| input_46opt | * | — | |
| input_47opt | * | — | |
| input_48opt | * | — | |
| input_49opt | * | — | |
| input_50opt | * | — | |
| input_51opt | * | — | |
| input_52opt | * | — | |
| input_53opt | * | — | |
| input_54opt | * | — | |
| input_55opt | * | — | |
| input_56opt | * | — | |
| input_57opt | * | — | |
| input_58opt | * | — | |
| input_59opt | * | — | |
| input_60opt | * | — | |
| input_61opt | * | — | |
| input_62opt | * | — | |
| input_63opt | * | — | |
| input_64opt | * | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pipe | DYNAMIC_PIPE_BUNDLE | — |