ComfyUI Node

Loom Out

The generic node that pulls anything out of the loom

By Codes4Fun·Created 3 months ago·Updated about a month ago· 0
Loom Out
  • loom
  • LOOM
  • ANY
  • exists
label

Every wire-loom setup needs the plain one. Loom Out is the generic extraction node in the c4f-wire-loom pack - the one you reach for when the thing you want out of the loom doesn't have a type-specific Out node, or you just can't remember which of the ten typed ones you're supposed to use. It will happily hand you back an image, a float, a string, a model, whatever's stored under the label you give it.

Quick context if you're new to the pack: a loom is just a named bundle of wires, stored as a label→value dictionary that flows down the graph like any other wire. Loom In stuffs values in, Loom Out pulls them out, and anything downstream of the Out sees whatever was most recently put in. That's the whole pitch, and it's why the author frames it against Set/Get nodes: looms behave like a stream, not like global variables. Take something out, modify it, put it back, and everything downstream gets the modified version. The tradeoff, as a much-upvoted r/comfyui thread once put it about anything-routing utilities, is that invisible wiring makes a workflow harder to debug - the tradeoff is real, but looms are a lot more legible than type-blind any-to-any routing because every wire has a name.

What the node actually does

Under the hood it's a dictionary lookup. You feed it the loom, and it checks whether label exists in it. If it does, you get the value back; if it doesn't, you get None and the exists output goes False. The loom itself is passed straight through on the LOOM output, so you can keep chaining Out nodes along the same stream.

  • loom (required) - the loom you're pulling from.
  • label (optional, default "") - the name of the wire you want. This is the one you actually set.
  • Outputs: LOOM (the passthrough), ANY (the pulled value), exists (a boolean that's true when the wire was found and isn't None).

That exists output is genuinely handy - wire it into a switch or an if-node and you get conditional behavior without any python. Missing wire → False, so you can have a default path that kicks in when the label doesn't exist yet.

The label trap

This is where people get burned. The generic Loom Out indexes the loom by the raw label, but the typed loom nodes (Loom Image In/Out, Loom VAE In/Out, and so on) automatically prepend the type: an image stored as image2 on a Loom Image In lives in the loom as IMAGE_image2. So if you pull it out with the generic node, you have to type IMAGE_image2 - including the prefix - or you'll get None and wonder what you did wrong. The generic nodes are really designed for primitive values (Int, Float, String) and anything else that has no typed node of its own; for typed wires, use the matching typed Out and you only have to remember the short label.

Also note: the label is read when the wire is first attached to the loom, and it does not update afterwards. If you rename a primitive widget and expect the loom to follow, it won't - recreate the attachment.

Install

The pack is pure Python plus a frontend extension - no model downloads, no API keys, no requirements.txt to fight. Install it once and every Loom node is available:

cd ComfyUI/custom_nodes
git clone https://github.com/Codes4Fun/c4f-wire-loom

then restart ComfyUI. Or skip the terminal and use ComfyUI Manager - search for c4f-wire-loom.

Troubleshooting

  • None on the ANY output - either the label doesn't match what the In node stored (remember the TYPE_ prefix on typed nodes) or you never connected a matching Loom In. Check exists; if it's False, that's the problem.
  • Nodes 2.0 drag quirk - the README warns that on ComfyUI's Nodes 2.0 frontend, dragging a collapsed loom node by its arrow can also toggle collapse. The author shipped a workaround in the pack's frontend code, so keep the pack updated.
Categoryutils/route

Inputs (2)

NameTypeDefaultDescription
loomLOOM
labeloptSTRING

Outputs (3)

NameTypeDescription
LOOMLOOM
ANY*
existsBOOLEAN