Friendly Pipe In
Bundle a dozen wires into one
- slot_1
- slot_2
- slot_3
- slot_4
- slot_5
- slot_6
- slot_7
- slot_8
- slot_9
- slot_10
- slot_11
- slot_12
- slot_13
- slot_14
- slot_15
- slot_16
- slot_17
- slot_18
- slot_19
- slot_20
- slot_21
- slot_22
- slot_23
- slot_24
- slot_25
- slot_26
- slot_27
- slot_28
- slot_29
- slot_30
- slot_31
- slot_32
- slot_33
- slot_34
- slot_35
- slot_36
- slot_37
- slot_38
- slot_39
- slot_40
- slot_41
- slot_42
- slot_43
- slot_44
- slot_45
- slot_46
- slot_47
- slot_48
- slot_49
- slot_50
- slot_51
- slot_52
- slot_53
- slot_54
- slot_55
- slot_56
- slot_57
- slot_58
- slot_59
- slot_60
- slot_61
- slot_62
- slot_63
- slot_64
- slot_65
- slot_66
- slot_67
- slot_68
- slot_69
- slot_70
- slot_71
- slot_72
- slot_73
- slot_74
- slot_75
- slot_76
- slot_77
- slot_78
- slot_79
- slot_80
- pipe
Every big ComfyUI workflow reaches the point where the canvas is a rat's nest of wires and you'd pay money to shrink the messy middle down to one connection. That's exactly the itch Friendly Pipe In scratches. It's the "pack side" of a two-node pipe: you feed it up to 80 inputs of any type - text, image, model, CLIP, whatever - and it bundles them all into a single pipe output. Pair it with Friendly Pipe Out on the other side of your workflow section and the spaghetti disappears.
This is the same job rgthree's Context and Context Big do, and if you already run rgthree you may not need this. But Friendly Pipe's pitch is simpler: no groups, no dashboards, just a "+ Add Slot" button and a label box per slot. One-line-per-slot, zero configuration beyond naming.
How it works
Under the hood it's a dictionary, not magic. The node collects every connected input into {"slots": {...}, "names": {...}, "slot_count": N} and ships that down the wire. Every one of the 80 inputs is declared as the wildcard type * (the pack's own AnyType class), which is ComfyUI's "accept anything" type - that's what lets you bundle an IMAGE next to a STRING next to a MODEL in the same node without type errors.
The interesting part lives in the frontend. The Python defines all 80 slots up front, but the bundled JavaScript hides them and only shows the ones you add with the ➕ button. It also manages the per-slot label widgets, which set the slot_names metadata that travels with the pipe so the Out node can display your labels back to you.
Inputs and outputs
slot_1throughslot_80- all optional, all type*. Connect anything to any of them; unconnected slots simply don't travel.pipe(output, typeFRIENDLY_PIPE) - wire this into a Friendly Pipe Out, or into a Friendly Pipe Edit if you want to add more on the way.
That's the whole schema. You don't type-annotate or configure slots in Python-land; you click the ➕ button a few times and rename the label widgets to match what you're bundling. Names like prompt, latent, denoise make a world of difference when the pipe comes out the other end.
How to install
The pack has no dependencies, no requirements.txt, and downloads no models - it's pure standard-library Python plus one JavaScript file. Two ways in:
ComfyUI Manager (easiest): Manager → Install Custom Nodes → search "Friendly Pipe" → Install → restart ComfyUI.
Manual clone:
cd ComfyUI/custom_nodes
git clone https://github.com/logicalor/comfyui_friendly_pipe.git
Then restart ComfyUI. No pip install, no model downloads - it just works. It also installs the pack's other two nodes (Friendly Pipe Out and Friendly Pipe Edit) in the same stroke; they live together under utils/pipe in the node menu.
Where people get burned
Because the pack is new and small (one maintainer, essentially no community footprint as of this writing), there's no body of forum wisdom about it. The real failure modes are the ones any any-type pipe node inherits:
- The
*type is a promise you can break. ComfyUI won't stop you wiring a CLIP where the downstream node expects an IMAGE, because the pipe will accept anything. The error only shows up at execution time, often deep in the graph. Label your slots and double-check what's actually connected. - Unconnected slots silently vanish - which is usually what you want, but it means a slot you thought was wired just isn't there, and the Out node quietly shows one fewer output.
- Shared workflows need the pack installed. The
pipeoutput is a customFRIENDLY_PIPEtype, so a workflow using these nodes will show missing-node errors for anyone who hasn't installed it. - Dynamic frontends are the fragile ones. Heavy add/remove-slot JavaScript is exactly the class of custom node that misbehaved under ComfyUI's Nodes 2.0 beta rendering. If the ➕ button stops working after an update, switch back to the legacy canvas and file an issue - this is the known failure pattern for nodes like this, not something unique to Friendly Pipe.
The honest take: it's a utility, not a hero. Reach for it when a workflow section has more crossing wires than you can read, and your reward is a canvas you can actually trace a prompt through.
Inputs (80)
| Name | Type | Default | Description |
|---|---|---|---|
| slot_1opt | * | — | |
| slot_2opt | * | — | |
| slot_3opt | * | — | |
| slot_4opt | * | — | |
| slot_5opt | * | — | |
| slot_6opt | * | — | |
| slot_7opt | * | — | |
| slot_8opt | * | — | |
| slot_9opt | * | — | |
| slot_10opt | * | — | |
| slot_11opt | * | — | |
| slot_12opt | * | — | |
| slot_13opt | * | — | |
| slot_14opt | * | — | |
| slot_15opt | * | — | |
| slot_16opt | * | — | |
| slot_17opt | * | — | |
| slot_18opt | * | — | |
| slot_19opt | * | — | |
| slot_20opt | * | — | |
| slot_21opt | * | — | |
| slot_22opt | * | — | |
| slot_23opt | * | — | |
| slot_24opt | * | — | |
| slot_25opt | * | — | |
| slot_26opt | * | — | |
| slot_27opt | * | — | |
| slot_28opt | * | — | |
| slot_29opt | * | — | |
| slot_30opt | * | — | |
| slot_31opt | * | — | |
| slot_32opt | * | — | |
| slot_33opt | * | — | |
| slot_34opt | * | — | |
| slot_35opt | * | — | |
| slot_36opt | * | — | |
| slot_37opt | * | — | |
| slot_38opt | * | — | |
| slot_39opt | * | — | |
| slot_40opt | * | — | |
| slot_41opt | * | — | |
| slot_42opt | * | — | |
| slot_43opt | * | — | |
| slot_44opt | * | — | |
| slot_45opt | * | — | |
| slot_46opt | * | — | |
| slot_47opt | * | — | |
| slot_48opt | * | — | |
| slot_49opt | * | — | |
| slot_50opt | * | — | |
| slot_51opt | * | — | |
| slot_52opt | * | — | |
| slot_53opt | * | — | |
| slot_54opt | * | — | |
| slot_55opt | * | — | |
| slot_56opt | * | — | |
| slot_57opt | * | — | |
| slot_58opt | * | — | |
| slot_59opt | * | — | |
| slot_60opt | * | — | |
| slot_61opt | * | — | |
| slot_62opt | * | — | |
| slot_63opt | * | — | |
| slot_64opt | * | — | |
| slot_65opt | * | — | |
| slot_66opt | * | — | |
| slot_67opt | * | — | |
| slot_68opt | * | — | |
| slot_69opt | * | — | |
| slot_70opt | * | — | |
| slot_71opt | * | — | |
| slot_72opt | * | — | |
| slot_73opt | * | — | |
| slot_74opt | * | — | |
| slot_75opt | * | — | |
| slot_76opt | * | — | |
| slot_77opt | * | — | |
| slot_78opt | * | — | |
| slot_79opt | * | — | |
| slot_80opt | * | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pipe | FRIENDLY_PIPE | — |