Loom Join
Merge two wire bundles without fighting over keys
- loom1
- loom2
- LOOM
The whole point of the c4f-wire-loom pack is that a loom is a stream, not a global store - and streams need to merge. Loom Join takes two looms and fuses them into one bundle, which is exactly what you want when one part of your graph builds a "settings" loom and another part builds a "model" loom and you want to feed both into a sampler subgraph without re-wiring everything.
How it works
Under the hood it's a dict merge, and the order matters:
loom = {**loom1, **loom2}
return (loom,)
The second loom wins on conflicts. So if loom1 holds a base image and loom2 also carries an IMAGE (the default key for an unlabeled image), the merged loom keeps loom2's version. That makes Loom Join your default-override tool: build the shared defaults first, join in the local overrides second, and the local ones win. If you pass only one loom it just copies it through, and with none it returns an empty loom - so it's safe to drop into a workflow that's still half-built.
Why you'd actually reach for it
Two patterns show up constantly in the pack's own demos:
- Merging scopes. Keep a global "prompt + resolution + batch" loom that every workflow variant shares, then join a per-branch loom carrying just the model or sampler that run needs. The branch overrides only what it touches; everything else passes through untouched.
- Looms inside looms. The README's favorite trick: put a separate loom for your upscaling model inside the main loom so its
MODELkey doesn't collide with the primary model's, then join/pull it out when the sampler wants to upscale.
Since a loom is just a dict, composition is trivial - and Loom Join is the composition operator.
The inputs
- loom1 (LOOM, optional)
- loom2 (LOOM, optional)
Both are optional and either can be empty. Output is a single LOOM. There's no label to set, no other knobs - this is a two-in, one-out junction box.
Installing
Same pack, same steps as the other loom nodes. ComfyUI Manager → search "c4f-wire-loom" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Codes4Fun/c4f-wire-loom
No models, no extra Python deps, no requirements file - restart ComfyUI and it's there.
Where it bites
Because the merge is silent, you can lose data without an error: if two looms carry the same key and you didn't intend the override, the first value just vanishes. The fix is discipline - give typed values explicit labels (MODEL_upscale instead of bare MODEL) so keys stop colliding. Also remember the merged loom only flows where you route it; the join doesn't broadcast anywhere on its own. And the Nodes 2.0 arrow-drag collapse quirk applies here too, though the pack's workaround usually keeps it from being a real problem.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| loom1opt | LOOM | — | |
| loom2opt | LOOM | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LOOM | LOOM | — |