ControlNet Model Selector
A ControlNet dropdown that just hands you a filename — and that's the point
- control_net_name
- control_net_name_str
The name is a small lie, and it's the thing to understand first: ControlNet Model Selector doesn't load a ControlNet. It doesn't touch your GPU, it doesn't read a single weight, it moves zero bytes. It reads the list of ControlNet files ComfyUI already knows about, shows you a dropdown, and hands back the filename you picked - twice, in two shapes. That sounds useless until you've tried to make "which ControlNet" a dynamic choice instead of a fixed one.
In a normal workflow you'd never bother. The stock ControlNetLoader node has its own dropdown, you pick canny_v2.safetensors, you move on. This node exists for the workflows where that dropdown is the wrong tool: XYZ plots, string-based routing, logging, or anything where the model name needs to travel through a text port instead of a model port.
What it actually does
Read the code and it's almost embarrassingly simple. The node builds its choices with folder_paths.get_filename_list("controlnet") - the same registry ComfyUI uses for every ControlNet dropdown, backed by your models/controlnet folder plus any extra controlnet paths you've configured. Then its one function returns literally (control_net_name, control_net_name): the same string, wrapped two ways.
That's the whole trick, and it's why the two outputs exist:
control_net_name- the first output carries ComfyUI's combo type, meaning it plugs straight into thecontrol_net_nameport of a ControlNetLoader. It's the "I want to keep this a proper model selection" output.control_net_name_str- a plain STRING, the same text. This is the one for XYZ plot axes, for feeding a text field, for shoving through an Any/String adapter, or for sticking into a workflow's saved metadata.
So if you're wiring an XYZ plot, you'd use the string output as the varying axis and let your XYZ machinery swap it per row. If you just want a ControlNet picker that lives in one corner of your graph and feeds a loader elsewhere, use the combo output.
The one input that matters
control_net_name - a combo dropdown populated from your controlnet folder at load time. Pick one, done. There's nothing else to set, which is the appeal: this is a "set it and forget it" utility, not a tuning node.
Install
No heavy dependencies, no model downloads, nothing exotic. The pack is pure Python over ComfyUI's own folder_paths, and there's no requirements.txt to fight with.
- ComfyUI Manager: search for DemonAlone-nodes-ComfyUI and install, then restart.
- Manual:
cd ComfyUI/custom_nodes && git clone https://github.com/DemonAlone/DemonAlone-nodes-ComfyUI, then restart ComfyUI.
The pack ships a whole family of sibling selectors - checkpoints, LoRAs, VAEs, samplers, schedulers - all built around the same dropdown-plus-string pattern, originally to drive XYZ-plot pipelines. If you're using one, this node follows the same rhythm.
Where people get burned
- Your new ControlNet doesn't show up. The dropdown is built when the node loads, not live. Drop a fresh
.safetensorsinmodels/controlnetand reload the workflow (or restart) before you go hunting for it. - You expected a model, got a filename. If you plug this node's output straight into a KSampler expecting a ControlNet to materialize, nothing happens - you still need a ControlNetLoader. This node picks which file; the loader actually loads it.
- Empty dropdown. That just means your controlnet folder is empty (or the file's in a path ComfyUI isn't watching).
For a single ControlNet in a static workflow, skip it and use the loader's own dropdown. Reach for this when the selection has to be dynamic - that's the entire job, and it does that one job cleanly.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| control_net_name | COMBO | 0 options: |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| control_net_name | — | |
| control_net_name_str | STRING | — |