Universal Input Hub by Steve Lasmin
Universal Input Hub by Steve Lasmin
- model
- clip
- width
- height
- preview
- seed
- noise
- steps
- cfg
- sampler_name
- sampler
- scheduler_name
- sigmas
- flux_sigmas
- model
- prompt
- prompt_with_triggers
- negative_prompt
- trigger_words
- positive
- negative
- help
The whole sampler rig, collapsed into one box
You know the drill: every generation starts with the same ten-node chain - Empty Latent Image, CLIP Text Encode twice, a seed, a steps widget, a CFG widget, a sampler/scheduler picker, a noise source. It's fiddly, it sprawls, and when a shared workflow uses slightly different widget names, your graph turns into a nest of reroutes. Universal Input Hub is a bet that you can collapse most of that into a single node: it takes a model, a CLIP encoder, and a prompt, and hands back the noise, the sigmas, the sampler object, and both conditioning tensors.
The "hub" idea isn't new - rgthree's Context nodes already bundle a dozen connections down one wire. This is the single-node version of that impulse: everything a sampler wants in one place, with tooltips on every input. Whether it beats rgthree for you comes down to taste. It is not a latent generator, which is the first thing to know before you wire anything up.
How it works
The mechanism is honestly pretty clean. You give it a max_size (the longest side) and an aspect ratio - either a preset like 16:9 or a custom width_ratio/height_ratio. It solves for the other dimension, rounds both to your multiplier (64 for SD 1.5, 32 for SDXL, 16 for Flux - the tooltip says so), and hands back width and height as INTs.
From there it builds everything else: a NOISE object from your seed, a SAMPLER object from your sampler picker, standard sigmas computed from the model, scheduler, and steps, and the positive/negative CONDITIONING from your prompt and negative_prompt. The interesting output is flux_sigmas: a dimension-aware schedule computed purely from the output size and step count, using the same time-SNR shift math and empirical constants ComfyUI's own Flux-2 sampler uses. No Flux model loaded? Doesn't matter - that path never touches the model.
The inputs that matter
You'll actually set six of them: max_size, aspect_ratio, seed, steps, cfg, and the two prompts. cfg's tooltip is worth trusting: Flux likes 1.0–4.0, SDXL wants 7.0–8.0. trigger_words is a small nicety - text that gets auto-prepended to your prompt with a ". " separator, handy for sticking a LoRA's trigger in without retyping it. sampler and scheduler are just the standard ComfyUI lists, so no new vocabulary to learn. The preview output is a human-readable summary string of every setting - genuinely handy when you've buried a workflow and need to know what it ran.
What wires where
For a normal KSampler you still need an Empty Latent Image node - the hub gives you width/height to feed it, but not a latent. The README glosses over that; don't let it trip you up. Wire positive and negative into the sampler, model through, and the seed/steps/cfg/sampler_name/scheduler_name outputs straight into the matching widgets. For SamplerCustomAdvanced, grab noise, sigmas, and sampler instead. And if you want to see everything the node computed, the help output is a full in-node manual.
Installing it
ComfyUI Manager → search "Universal Input Hub", or clone it directly:
cd ComfyUI/custom_nodes
git clone https://github.com/Eklipsis/universal_input_hub_by_steve_lasmin.git
Then restart ComfyUI. It shows up under utils. One real plus: pyproject.toml declares zero Python dependencies - no torch pinning, no pip-install dance, nothing to break your environment. It's also a pure backend node with no JavaScript, so it sidesteps the Nodes 2.0 frontend rewrite problems that took down JS-heavy packs.
The honest gotchas
flux_sigmasare timesteps for Flux-2-style models. Feed them to an SD/SDXL sampler and you'll get garbage. Use the plainsigmasoutput for normal models.- The node is marked
OUTPUT_NODE, so it always executes on every run, even if nothing downstream consumes it. Not a bug - just know it's there. - It's tiny and new, with effectively zero community footprint - search as I might, nobody's talking about it. The author is a Boosty (Russian-patreon-style) creator, and the license is CC BY-ND: you can use and share it, but no derivatives without permission. If you hit a wall, expect to debug it yourself.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| max_size | INT | 102432–4096 | Maximum dimension in pixels. The longest side of the image will match this value. |
| aspect_ratio | COMBO | custom | Select a preset aspect ratio, or choose 'custom' to define your own via width_ratio and height_ratio. |
| width_ratio | INT | 21–999999 | Custom width component of the aspect ratio. Only used when aspect_ratio is set to 'custom'. |
| height_ratio | INT | 31–999999 | Custom height component of the aspect ratio. Only used when aspect_ratio is set to 'custom'. |
| multiplier | COMBO | 32 | Round width and height to be divisible by this value. Use 64 for SD 1.5, 32 for SDXL, 16 for Flux. |
| seed | INT | 7770–18446744073709550000 | Random seed for noise generation. Use 'control after generate' to randomize, increment, or keep fixed. |
| steps | INT | 201–10000 | Number of sampling steps. Higher values = more detail but slower generation. |
| cfg | FLOAT | 4.00–100 | Classifier-Free Guidance scale. Higher = stronger prompt adherence. Flux works well at 1.0-4.0, SDXL at 7.0-8.0. |
| sampler | COMBO | euler | Sampling algorithm. 'euler' is fast and reliable. 'dpmpp_2m' is higher quality. |
| scheduler | COMBO | normal | Noise schedule. 'normal' is standard. 'simple' works well with Flux. 'karras' for SDXL. |
| model | MODEL | The diffusion model. Required for standard sigmas calculation and model passthrough. | |
| clip | CLIP | The CLIP text encoder. Required to convert text prompts into conditioning tensors. | |
| prompt | STRING | Main positive prompt describing what you want to generate. | |
| trigger_words | STRING | Trigger words prepended to the prompt with '. ' separator. Leave empty to use prompt only. | |
| negative_prompt | STRING | Negative prompt describing what you want to exclude from the image. |
Outputs (20)
| Name | Type | Description |
|---|---|---|
| width | INT | — |
| height | INT | — |
| preview | STRING | — |
| seed | INT | — |
| noise | NOISE | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler_name | STRING | — |
| sampler | SAMPLER | — |
| scheduler_name | STRING | — |
| sigmas | SIGMAS | — |
| flux_sigmas | SIGMAS | — |
| model | MODEL | — |
| prompt | STRING | — |
| prompt_with_triggers | STRING | — |
| negative_prompt | STRING | — |
| trigger_words | STRING | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| help | STRING | — |