M Group Inputs
The all-in-one control panel
- sampler_name
- scheduler
- ckpt_name
- lora1
- lora2
- lora3
- lora4
- lora5
- prompt
- negative
- seed
- width
- height
- batch_size
- steps
- cfg
- sampler_name
- scheduler
- denoise
- ckpt_name
- filename_prefix
- lora1
- lora1_strength
- lora2
- lora2_strength
- lora3
- lora3_strength
- lora4
- lora4_strength
- lora5
- lora5_strength
The knobs you retune on every generation - prompt, seed, size, steps, cfg, sampler, scheduler, denoise, checkpoint, filename, and the LoRAs you keep toggling - live scattered across ten different nodes. That's a big part of why shared workflows turn into spaghetti. M Group Inputs pulls the whole control panel into one node: 23 inputs in, 23 outputs out, and changing a value in one place updates everything wired to it.
Let's be clear about what it does and doesn't do, because the name overpromises. The mechanism is pure plumbing: the node's go() method just returns all of its inputs in order, untouched. Nothing is processed, nothing is bundled. What you type or pick is what comes out on the matching wire. Its whole value is the fan-out - one authoritative source for each value instead of five widgets you have to keep in sync, which is exactly the "one source, many consumers" pattern the plumbing layer exists to serve.
The inputs you'll actually set:
prompt/negative- multiline text, wired into CLIP Text Encode (via the checkpoint's CLIP).seed- a plain INT (0 to 2^63-1). Same seed-widget rules as everywhere else in ComfyUI, so the "control after generate" trap still applies: a randomizing seed gets overwritten after the run, so lock the ones you like.width/height- 64 to 4096 in steps of 8, so they always land on the multiples-of-8 that latent generation wants. Wire into Empty Latent.steps,cfg,sampler_name,scheduler,denoise- straight into KSampler.ckpt_name- into a Checkpoint Loader.filename_prefix- into Save Image, so your output naming lives at the top of the graph.lora1throughlora5, each with alora*_strength(-10 to 10) - and here's the trap: these only output a name and a number. This node does not load LoRAs, doesn't patch the model, nothing. You still need an actual LoRA loader downstream, wired with those values. It's a convenient place to park "which five am I using and at what strength" - not a LoRA stack.
The outputs mirror every input by name: prompt, negative, seed, width, height, batch_size, steps, cfg, sampler_name, scheduler, denoise, ckpt_name, filename_prefix, and the ten LoRA slots. Everything is one wire per value.
The honest take: this is a control panel, not a pipe. ComfyUI's plumbing layer has two philosophies - the context-bus nodes like rgthree's Context that bundle everything into one wire and unpack it downstream, and the explicit fan-out this node uses. This one is the debuggable kind: you can see exactly what feeds the sampler because every connection is a visible wire. The cost is that you don't get the spaghetti reduction a single pipe wire buys you, so it shines in medium-size workflows where you're iterating, not in 200-node monsters.
One more thing to know: the defaults are SD1.5-flavored - 512×512, cfg 8, 25 steps, denoise 1.0. If you run SDXL or Flux you'll be changing every default on first use. That's fine; the point is one place to change them.
It ships in the ComfyUiNodes pack (repo Madlumi/ComfyUiNodes, author "Madanie"). Install via ComfyUI Manager - search "ComfyUiNodes" - or:
cd ComfyUI/custom_nodes
git clone https://github.com/Madlumi/ComfyUiNodes
Then restart ComfyUI. No pip requirements or model downloads; it's plain Python on top of ComfyUI's own deps. Find it under Add Node → mnodes → util.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| negative | STRING | — | |
| seed | INT | 00–9223372036854776000 | — |
| width | INT | 51264–4096 | — |
| height | INT | 51264–4096 | — |
| batch_size | INT | 11–64 | — |
| steps | INT | 251–200 | — |
| cfg | FLOAT | 8.00–30 | — |
| sampler_name | SAMPLER_NAME | — | |
| scheduler | SCHEDULER_NAME | — | |
| denoise | FLOAT | 1.000–1 | — |
| ckpt_name | CKPT_NAME | — | |
| filename_prefix | STRING | ComfyUI | — |
| lora1 | LORA_NAME | — | |
| lora1_strength | FLOAT | 1.00-10–10 | — |
| lora2 | LORA_NAME | — | |
| lora2_strength | FLOAT | 1.00-10–10 | — |
| lora3 | LORA_NAME | — | |
| lora3_strength | FLOAT | 1.00-10–10 | — |
| lora4 | LORA_NAME | — | |
| lora4_strength | FLOAT | 1.00-10–10 | — |
| lora5 | LORA_NAME | — | |
| lora5_strength | FLOAT | 1.00-10–10 | — |
Outputs (23)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |
| negative | STRING | — |
| seed | INT | — |
| width | INT | — |
| height | INT | — |
| batch_size | INT | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler_name | SAMPLER_NAME | — |
| scheduler | SCHEDULER_NAME | — |
| denoise | FLOAT | — |
| ckpt_name | CKPT_NAME | — |
| filename_prefix | STRING | — |
| lora1 | LORA_NAME | — |
| lora1_strength | FLOAT | — |
| lora2 | LORA_NAME | — |
| lora2_strength | FLOAT | — |
| lora3 | LORA_NAME | — |
| lora3_strength | FLOAT | — |
| lora4 | LORA_NAME | — |
| lora4_strength | FLOAT | — |
| lora5 | LORA_NAME | — |
| lora5_strength | FLOAT | — |