Slider Stacker
Fifty prompt sliders that stay in sync — no downloads, no dependencies
- SLIDER_WEIGHTS
You've hit the wall every multi-concept workflow eventually hits: you want to dial in the weight of five, ten, twenty things at once - character, clothing, lighting, style tags - and dragging ten separate number boxes is miserable, plus they don't stay proportional to each other. Dynamic Sliders Stack's Slider Stacker is the fix: up to 50 named sliders on one node, with a master maximum that scales the whole row, a sum display, and an optional "lock sum" mode that redistributes weight when you drag one slider so the total never drifts. It outputs a comma-separated string of weights you can feed into any node that eats those - the README's own suggestion is a prompt composer.
Two honest caveats before you fall in love. First, it doesn't apply weights to a prompt for you - it emits numbers as a text string, and something downstream has to actually use them (more on that below). Second, this is a small, fresh pack: single maintainer, near-zero community footprint, and no search traffic to speak of. The code is clean and it works, but it's hobbyist-grade, so treat it as a nice-to-have rather than a load-bearing dependency.
How the "dynamic" bit actually works
The Python side of this node is almost insultingly simple. In slider_stacker_node.py, it clamps each slider to its 0.0–2.0 range, clamps again to sliders_max, formats everything to two decimals, and joins with ", ". That's the whole backend. The real magic - the proportional scaling, the sum lock, the read-only sum when locked - lives in the frontend JavaScript (js/Dynamic.js), which intercepts each widget's value setter and recomputes the rest of the row in the browser.
That split is worth understanding, because it explains the feel: everything updates instantly while you drag, no re-queue, because nothing touches the server until you hit Queue. It also means all the cleverness is pure UI state. The output string is just a snapshot of whatever the widgets currently hold.
The inputs that matter
You'll touch four of these; the rest are the sliders themselves.
sliders_max(FLOAT, 0–2.0) - the master maximum. Every slider's output value is clamped to this, and dragging it scales the whole row proportionally. This is the one you reach for most.sliders_count(INT, 1–50) - how many sliders are visible and included in the output.lock_sum(BOOLEAN) - when on, the total stays constant; dragging one slider takes the difference out of the others proportionally.sliders_sum(FLOAT) - displays the current total. With lock off, adjusting it shifts every slider up or down while preserving their offsets. With lock on, it goes read-only.slider_name_{i}(STRING) - an optional label per slider.({i})(FLOAT, 0–2.0) - the actual weight widgets. All 50 exist in the schema;sliders_countjust decides which are shown and emitted.
Right-click the node for four batch utilities: average all, reset all to 1.0, set all to the current max, or set all to the current min. Handy when you've spent ten minutes fiddling and want to start over without touching each one.
Wiring it up
The single output, SLIDER_WEIGHTS (STRING), looks like 1.00, 0.50, 0.75. From here you have two routes. The clean one for a prompt-based workflow: run it into a dynamic prompt composer that interleaves the values into your prompt template. The surgical route: wire it into the pack's companion Slider Receiver, pick a 1-based index, and pull out one slider's weight as a FLOAT to drive a single conditioning or sampler input. The receiver is the bridge that turns "the whole row" into "just the one value I care about here."
Installing it
This is the nicest part: there are zero Python dependencies and no model files to download. pyproject.toml declares an empty dependency list and there's no requirements.txt at all.
Via ComfyUI Manager, search for Dynamic Sliders Stack (or paste https://github.com/FunnyFinger/Dynamic_Sliders_stack.git into the install field), then restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/FunnyFinger/Dynamic_Sliders_stack.git
Restart ComfyUI and the nodes appear under Dynamic Sliders Stack.
Where people get burned
The big one: sliders_max is a ceiling, not just a label. Set it to 1.0 and drag a slider to 2.0, and the output will read 1.00 - the node clamps it. If a slider ever seems stuck below where you dragged it, sliders_max is why. Set it to 2.0 if you want the full range, or use it deliberately to keep an entire row gentle.
Second: the receiver returns 0.0 for an out-of-range index, with only a console warning. A mis-wired receiver won't error loudly - it'll just quietly zero your weight. Double-check that 1-based index if something suddenly stops mattering in your render.
And worth repeating: dragging sliders changes nothing in your image until something downstream consumes that string. If your output isn't changing, trace the wire past this node first.
Inputs (104)
| Name | Type | Default | Description |
|---|---|---|---|
| sliders_max | FLOAT | 1.000–2 | — |
| sliders_count | INT | 11–50 | — |
| sliders_sum | FLOAT | 0.000–9999 | — |
| lock_sum | BOOLEAN | false | — |
| slider_name_1 | STRING | None | — |
| (1) | FLOAT | 1.000–2 | — |
| slider_name_2 | STRING | None | — |
| (2) | FLOAT | 1.000–2 | — |
| slider_name_3 | STRING | None | — |
| (3) | FLOAT | 1.000–2 | — |
| slider_name_4 | STRING | None | — |
| (4) | FLOAT | 1.000–2 | — |
| slider_name_5 | STRING | None | — |
| (5) | FLOAT | 1.000–2 | — |
| slider_name_6 | STRING | None | — |
| (6) | FLOAT | 1.000–2 | — |
| slider_name_7 | STRING | None | — |
| (7) | FLOAT | 1.000–2 | — |
| slider_name_8 | STRING | None | — |
| (8) | FLOAT | 1.000–2 | — |
| slider_name_9 | STRING | None | — |
| (9) | FLOAT | 1.000–2 | — |
| slider_name_10 | STRING | None | — |
| (10) | FLOAT | 1.000–2 | — |
| slider_name_11 | STRING | None | — |
| (11) | FLOAT | 1.000–2 | — |
| slider_name_12 | STRING | None | — |
| (12) | FLOAT | 1.000–2 | — |
| slider_name_13 | STRING | None | — |
| (13) | FLOAT | 1.000–2 | — |
| slider_name_14 | STRING | None | — |
| (14) | FLOAT | 1.000–2 | — |
| slider_name_15 | STRING | None | — |
| (15) | FLOAT | 1.000–2 | — |
| slider_name_16 | STRING | None | — |
| (16) | FLOAT | 1.000–2 | — |
| slider_name_17 | STRING | None | — |
| (17) | FLOAT | 1.000–2 | — |
| slider_name_18 | STRING | None | — |
| (18) | FLOAT | 1.000–2 | — |
| slider_name_19 | STRING | None | — |
| (19) | FLOAT | 1.000–2 | — |
| slider_name_20 | STRING | None | — |
| (20) | FLOAT | 1.000–2 | — |
| slider_name_21 | STRING | None | — |
| (21) | FLOAT | 1.000–2 | — |
| slider_name_22 | STRING | None | — |
| (22) | FLOAT | 1.000–2 | — |
| slider_name_23 | STRING | None | — |
| (23) | FLOAT | 1.000–2 | — |
| slider_name_24 | STRING | None | — |
| (24) | FLOAT | 1.000–2 | — |
| slider_name_25 | STRING | None | — |
| (25) | FLOAT | 1.000–2 | — |
| slider_name_26 | STRING | None | — |
| (26) | FLOAT | 1.000–2 | — |
| slider_name_27 | STRING | None | — |
| (27) | FLOAT | 1.000–2 | — |
| slider_name_28 | STRING | None | — |
| (28) | FLOAT | 1.000–2 | — |
| slider_name_29 | STRING | None | — |
| (29) | FLOAT | 1.000–2 | — |
| slider_name_30 | STRING | None | — |
| (30) | FLOAT | 1.000–2 | — |
| slider_name_31 | STRING | None | — |
| (31) | FLOAT | 1.000–2 | — |
| slider_name_32 | STRING | None | — |
| (32) | FLOAT | 1.000–2 | — |
| slider_name_33 | STRING | None | — |
| (33) | FLOAT | 1.000–2 | — |
| slider_name_34 | STRING | None | — |
| (34) | FLOAT | 1.000–2 | — |
| slider_name_35 | STRING | None | — |
| (35) | FLOAT | 1.000–2 | — |
| slider_name_36 | STRING | None | — |
| (36) | FLOAT | 1.000–2 | — |
| slider_name_37 | STRING | None | — |
| (37) | FLOAT | 1.000–2 | — |
| slider_name_38 | STRING | None | — |
| (38) | FLOAT | 1.000–2 | — |
| slider_name_39 | STRING | None | — |
| (39) | FLOAT | 1.000–2 | — |
| slider_name_40 | STRING | None | — |
| (40) | FLOAT | 1.000–2 | — |
| slider_name_41 | STRING | None | — |
| (41) | FLOAT | 1.000–2 | — |
| slider_name_42 | STRING | None | — |
| (42) | FLOAT | 1.000–2 | — |
| slider_name_43 | STRING | None | — |
| (43) | FLOAT | 1.000–2 | — |
| slider_name_44 | STRING | None | — |
| (44) | FLOAT | 1.000–2 | — |
| slider_name_45 | STRING | None | — |
| (45) | FLOAT | 1.000–2 | — |
| slider_name_46 | STRING | None | — |
| (46) | FLOAT | 1.000–2 | — |
| slider_name_47 | STRING | None | — |
| (47) | FLOAT | 1.000–2 | — |
| slider_name_48 | STRING | None | — |
| (48) | FLOAT | 1.000–2 | — |
| slider_name_49 | STRING | None | — |
| (49) | FLOAT | 1.000–2 | — |
| slider_name_50 | STRING | None | — |
| (50) | FLOAT | 1.000–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SLIDER_WEIGHTS | STRING | — |