Motorway 3x9
The widest fan-out three inputs can buy
- MOTORWAY ππ¨
- ANY_(A)
- ANY_(B)
- ANY_(C)
- MOTORWAY ππ¨
- ANY (A)
- ANY (B)
- ANY (C)
- ANY (D)
- ANY (E)
- ANY (F)
- ANY (G)
- ANY (H)
- ANY (I)
Motorway 3x9 is the near-max fan-out ramp from the agilly1989 Motorway pack: three lanes in, nine lanes out. It's for the workflow where a handful of values have to be everywhere at once - the seed, the model, the prompt all feeding nine different consumers. Wire that by hand and you've got a canvas full of crossing lines; route it through one 3x9 and the same information gets to every destination with three wires instead of nine.
The pack is a "pipe" implementation, and this is one of its on/off ramps. A custom bus object (MotorwayClass) passes from node to node carrying values under string keys; ramp nodes file inputs onto the bus and pull outputs back off. You start with MotorwayStart (or a Motorway primitive like MotorwayFloat, which can act as a start). One honest warning before you build your masterpiece on it: the README opens "CURRENTLY IN ACTIVE DEVELOPMENT (BETA)! IF THINGS BREAK ITS BECAUSE I BROKE IT." The author means it. Save often.
The inputs and outputs
Required input is MOTORWAY ππ¨ - the bus, always coming from a Start node or an earlier ramp. Then three data inputs ANY_(A), ANY_(B), ANY_(C) typed * (they'll carry anything: MODEL, CONDITIONING, LATENT, INT, STRING). Key fields run ANY_(A)_key through ANY_(I)_key - nine of them, one per slot, since every input and every output gets a key.
The mental model: each letter's key is both the filing cabinet drawer for that letter's input and the drawer that letter's output reads from. Inputs AβC store under their keys; outputs AβC read those same keys back (write-through), and outputs DβI are pure exits with no input lane. The first output is always MOTORWAY ππ¨ - the bus keeps driving onward no matter how many exits you use.
So the pattern is: file a value in on one node, pull it out on another. Store your CLIP with ANY_(A)_key = clip, and any ramp anywhere downstream that types clip into a key field hands you that CLIP on its output. Same key later = newer value wins. And because the bus is cloned at every node, parallel branches stay isolated - writes in one branch can't corrupt a sibling.
Install
ComfyUI Manager search "ComfyUI_agilly1989_motorway", or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/agilly1989/ComfyUI_agilly1989_motorway
Restart ComfyUI. No model files, no extra pip installs - it's pure Python and the whole pack weighs almost nothing.
The usual failure mode
'MotorwayClass' object has no attribute 'hash_...' is the README's own documented error: you typed a key on an output that nothing upstream ever wrote. Keys are sha256-hashed internally, so an off-by-one typo just reads an empty slot - confusing, because there's no "key not found" until you get this exact error. Also: blank key = blank output. If you wire ANY (E) but leave ANY_(E)_key empty, there's nothing in that lane. Fill every key you actually pull.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| MOTORWAY ππ¨ | MOTORWAY ππ¨ | β | |
| ANY_(A)opt | * | β | |
| ANY_(B)opt | * | β | |
| ANY_(C)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 | β |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| MOTORWAY ππ¨ | MOTORWAY ππ¨ | β |
| ANY (A) | * | β |
| ANY (B) | * | β |
| ANY (C) | * | β |
| ANY (D) | * | β |
| ANY (E) | * | β |
| ANY (F) | * | β |
| ANY (G) | * | β |
| ANY (H) | * | β |
| ANY (I) | * | β |