LC Control Panel 🎛️
What LC Control Panel 🎛️ actually saves you
- value_1
- value_2
- value_3
- value_4
- value_5
- value_6
- value_7
- value_8
- value_9
- value_10
- value_11
- value_12
- value_13
- value_14
- value_15
- value_16
The problem it solves
Most ComfyUI graphs are 70% plumbing. Not the fun nodes - the ones holding a number. You've got steps on the sampler, steps again on the refiner, a denoise on the img2img pass, a seed you also want in the filename, an upscale factor three nodes deep. Every one of those is a widget you have to find and edit in its own place, and the first time you forget one you get a silently mismatched run and no error to explain it.
The standard fix is a value node: convert the widget to an input, then fan one source out to every place that needs it. LC Control Panel is the version of that idea that scales - it's a bank of up to 16 sliders on one node, each on its own output, so a whole workflow's worth of numbers gets one face to live on.
How it works
The rows aren't real widgets. They're serialized into one hidden rows STRING (JSON), which the Python class reads on every run: it parses the list and returns sixteen values, and for each row it clamps the value into its own min/max, snaps it to its step, and returns an INT when the row's decimals is 0 or a FLOAT otherwise. The visible face - slider bars, gear, "+ Add slider" - is drawn by the pack's JS as HTML on the node. That split matters twice over: the numbers you see are exactly the numbers that run (no "apply" step, no phantom state), and because they live in a normal widget they save inside the workflow. Send someone a graph and they get your slider settings too.
The outputs are typed as *, ComfyUI's wildcard, so they plug into any number socket. The pack's own Connection FX paints each one INT or FLOAT based on its decimals, but other nodes' colour code won't.
Inputs and outputs that matter
There's exactly one input: rows, the hidden JSON. You never type in it. Everything you do happens on the face.
The outputs are value_1 through value_16, one per row. Two things to know:
- Only as many outputs as rows you've made. Values wire up fine, but an output with no row behind it quietly outputs
0. If a node downstream is behaving as if it got zero, check you actually added that row. - Sixteen is the ceiling. Past 16 you need a second panel, and that's fine - they're cheap.
Setup is the part worth reading. Hit the ⚙ at the end of a row to name it and set min, max, step and decimals. Or, faster: leave the row fresh and wire it into a number input - a converted widget on a KSampler, say. The panel copies that input's name, range, step and current value into the row, so it arrives already shaped like the thing it feeds. It also does you a favour there: if the target's range is absurd (Steps, 1 to 10000), it clamps the slider to a few times the current value instead of giving you a millimeter of travel that spans ten thousand steps.
Install
ComfyUI Manager → search for the pack (ComfyUI_LC123_nodes) and install. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes.git
Then restart ComfyUI. Worth knowing about this pack: it's 141 Python nodes plus 5 JS-only ones (v1.49.3), MIT, by one author (lonecatone23 - the CivitAI creator behind synth.studio.models), and it sits squarely in the rgthree tradition. It generates nothing; it makes a graph you can still work in.
The install is genuinely short. There is no requirements.txt - the pack needs only the torch and numpy your ComfyUI already ships, so nothing pip-installs and nothing can conflict with your other packs. After any update, restart and hit Ctrl+F5; half of this pack is browser-side JavaScript and a stale cache will show you the old face.
The one install failure that actually happens: __init__.py has to sit directly inside ComfyUI/custom_nodes/ComfyUI_LC123_nodes/. If a zip unpacked into a nested folder you'll get a node that never appears. The console prints an [LC123] + line per module as it loads - no lines, wrong folder, move the files up.
Where people get burned
The usual one is expecting the panel to fight ComfyUI's caching for them. It doesn't. Moving a slider changes the node's stored rows and the next run picks it up - queue it. And if you're comparing runs, keep in mind that the panel itself is a pure value node: it changes nothing about how the number is used, so if a run ignored your slider, the answer is downstream, in whether that node was bypassed.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| rows | STRING | [] | — |
Outputs (16)
| Name | Type | Description |
|---|---|---|
| value_1 | * | — |
| value_2 | * | — |
| value_3 | * | — |
| value_4 | * | — |
| value_5 | * | — |
| value_6 | * | — |
| value_7 | * | — |
| value_8 | * | — |
| value_9 | * | — |
| value_10 | * | — |
| value_11 | * | — |
| value_12 | * | — |
| value_13 | * | — |
| value_14 | * | — |
| value_15 | * | — |
| value_16 | * | — |