Motorway 10x10
One fat bus that replaces fifty wires in your ComfyUI graph
- MOTORWAY ππ¨
- ANY_(A)
- ANY_(B)
- ANY_(C)
- ANY_(D)
- ANY_(E)
- ANY_(F)
- ANY_(G)
- ANY_(H)
- ANY_(I)
- ANY_(J)
- MOTORWAY ππ¨
- ANY (A)
- ANY (B)
- ANY (C)
- ANY (D)
- ANY (E)
- ANY (F)
- ANY (G)
- ANY (H)
- ANY (I)
- ANY (J)
You know the problem. A workflow that's been grown, not designed - eleven wires trailing across the canvas from every node, and one wrong drag reconnects something you'll never find again. People post these as "wire spaghetti" for a laugh. This node is a way out: instead of routing a dozen values as a dozen wires, you bundle them into one fat bus and pull individual values out anywhere along the route.
Motorway 10x10 is one of 120 procedurally generated nodes in agilly1989/ComfyUI_agilly1989_motorway, a beta pack that implements a "pipe" for ComfyUI. The name is the spec: 10 inputs, 10 outputs. The author's other take on pipes didn't fit how he wanted to work, so he built his own and gave it a gloriously on-the-nose name - the pipe type is literally MOTORWAY ππ¨, a bus that farts its way down your workflow. You must not take any of this too seriously, because the author doesn't: the README opens with "CURRENTLY IN ACTIVE DEVELOPMENT (BETA)! IF THINGS BREAK ITS BECAUSE I BROKE IT."
How it works
The Motorway is a custom class that rides from node to node through that single MOTORWAY ππ¨ wire. Every time a Motorway node runs, it clones the bus (only the keyed values get copied), stamps in the values you've handed it, and passes the updated bus along.
Here's where the 10x10 earns its keep. The inputs you actually touch:
- MOTORWAY ππ¨ - required, the bus itself. Always feed this from
MotorwayStart(or another Motorway node); this node can't start its own motorway, unlike the primitive utility nodes in the same pack. - ANY_(A) through ANY_(J) - 10 anything-goes inputs. Wire any value in: a model, a seed, a conditioning, whatever.
- ANY_(A)_key through ANY_(J)_key - the string that names each slot. Type a key, and the value in that slot gets stored in the bus under a sha256 hash of that key.
The node writes everything you've keyed into the bus, then its 10 outputs - the bus plus ANY (A) through ANY (J) - read back out by key. The letter pairs up its input slot with its output slot on the same node, and any downstream Motorway node can pull a value keyed way upstream, as long as it knows the name.
Where people get burned
Two traps, both grounded in how the bus actually stores things.
First, keys are exact and overwriting. "model" and "Model" are different keys. Reuse an existing key further down the motorway and the old value is silently replaced - that's a feature (you can rebind a slot), but it's also how you get values from a previous stage leaking into the next.
Second, blank keys shift your outputs. The outputs are only emitted for slots whose key field is filled, in order. Leave ANY_(C)_key empty and the C value slides into the D output. Fill a key for every slot you actually use, or you'll chase phantom values for an hour.
If you see 'MotorwayClass' object has no attribute 'hash_...' it's the author's own error for "that key doesn't exist in the bus." Double-check your spelling, case included.
Installing it
ComfyUI Manager: search ComfyUI_agilly1989_motorway and install. Or, old-school:
cd ComfyUI/custom_nodes
git clone https://github.com/agilly1989/ComfyUI_agilly1989_motorway
Then restart ComfyUI. No models, no torch extras, no requirements.txt - it's pure Python. The real cost is menu clutter: that one pack registers 120 Motorway variants plus utility nodes, so be ready for a wall of Motorway entries in your add-node search.
Should you reach for it?
If you're maintaining a big multi-stage workflow - a character-consistency chain where seeds, models, and conditioning have to travel together - the bus genuinely beats twenty parallel wires, and it's exactly how at least one community character-consistency workflow is actually built. If your graph is small, skip it; the bus adds indirection you don't need yet. And know what you're signing up for: it's beta, it's a personal tool made public, and the author has broken flows between versions before. Treat it as "it works on my system," back up your workflows, and if it breaks, an issue (or the Comfy Org Discord, @agilly1989) is the way in - he's said DMing gets you ignored.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| MOTORWAY ππ¨ | MOTORWAY ππ¨ | β | |
| ANY_(A)opt | * | β | |
| ANY_(B)opt | * | β | |
| ANY_(C)opt | * | β | |
| ANY_(D)opt | * | β | |
| ANY_(E)opt | * | β | |
| ANY_(F)opt | * | β | |
| ANY_(G)opt | * | β | |
| ANY_(H)opt | * | β | |
| ANY_(I)opt | * | β | |
| ANY_(J)opt | * | β | |
| ANY_(A)_keyopt | STRING | β | |
| ANY_(B)_keyopt | STRING | β | |
| ANY_(C)_keyopt | STRING | β | |
| ANY_(D)_keyopt | STRING | β | |
| ANY_(E)_keyopt | STRING | β | |
| ANY_(F)_keyopt | STRING | β | |
| ANY_(G)_keyopt | STRING | β | |
| ANY_(H)_keyopt | STRING | β | |
| ANY_(I)_keyopt | STRING | β | |
| ANY_(J)_keyopt | STRING | β |
Outputs (11)
| Name | Type | Description |
|---|---|---|
| MOTORWAY ππ¨ | MOTORWAY ππ¨ | β |
| ANY (A) | * | β |
| ANY (B) | * | β |
| ANY (C) | * | β |
| ANY (D) | * | β |
| ANY (E) | * | β |
| ANY (F) | * | β |
| ANY (G) | * | β |
| ANY (H) | * | β |
| ANY (I) | * | β |
| ANY (J) | * | β |