Loom In
The one wire that carries your whole workflow
- loom
- input
- LOOM
Every ComfyUI user eventually hits the wall where the workflow has forty nodes and a third of them exist just to carry one wire from here to there. Re-arranging anything snaps five connections, and making a "subgraph" of your prompt section means threading six inputs through it. Loom In is the node that starts fixing that: it bundles any value into a single LOOM wire that travels through your graph like a stream, ready to be pulled out, modified, and pushed back in downstream.
What a loom actually is
A loom is just a labeled bundle of wires - under the hood it's a Python dict, and it flows along one connection. Loom In inserts a value into that bundle and hands the updated bundle to whatever's next. Loom Out (or the type-specific outs like Loom Image Out) pulls values back out, and Loom Split is the hub you attach them to so wires can fan out in multiple directions. Together they're the c4f-wire-loom pack, and this is the generic core node.
This is the key difference from Set/Get nodes, which act like a global store you can read from anywhere. A loom is a stream: you take a value out, change it, put it back in, and anything downstream of that point sees the modified version. Nothing outside the loom's path sees it at all.
How it works
The mechanism is almost insultingly simple: it copies the incoming loom (or starts a fresh {} if none is connected), stores your value under the label you give it, and returns the new loom.
new_loom = loom.copy() if loom else {}
if label:
new_loom[label] = input
return (new_loom,)
One gotcha worth knowing: give it a value with no label and it raises Missing label for input. The generic node has no type to fall back on, so the label is the key. The pack's frontend helps here - when you drag an input or output slot onto a collapsed Loom Split node, it auto-creates a collapsed loom node and fills the label in for you.
The inputs that matter
- input (
*): any type at all. This is the generic node's whole point - use it for custom-node slot types that don't have a typed Loom In. - label (string): the key it's stored under. Pick something unique and consistent with your
Loom Out. - loom (LOOM, optional): the bundle to extend. Leave it unconnected to start a new loom.
The output is a single LOOM wire. Wire it into Loom Split, Loom Join, or a Loom Out further down.
Installing it
It ships in the c4f-wire-loom pack. Through ComfyUI Manager: Install Custom Nodes → search "c4f-wire-loom" → install → restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Codes4Fun/c4f-wire-loom
Then restart ComfyUI. There's no requirements.txt, no model downloads, no heavy deps - it's pure Python plus a small JS frontend for the drag-and-drop niceties.
Where it bites
The classic first-run mistake is treating the loom like a global store: if you don't route the LOOM output forward through the nodes that should see the update, they just won't. Also remember labels collide silently - store a second image under the same label and the first is overwritten. And on ComfyUI's Nodes 2.0 frontend there's a known quirk where dragging a node's arrow icon can toggle collapse; the pack ships a workaround, so if you see odd toggling, that's the upstream frontend, not your graph. Nobody's writing love letters to this pack yet (it's barely on the community radar), but for big editable workflows, it quietly does the job.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| loomopt | LOOM | — | |
| inputopt | * | — | |
| labelopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LOOM | LOOM | — |