Load Optional ControlNet Model
A ControlNet loader with an actual off switch
- CONTROL_NET
The core ControlNet loader in ComfyUI has a simple limitation: it always loads something. If you want to run the same workflow with ControlNet switched off, you either build a second graph with the nodes bypassed, or you get comfortable with muting and unmuting. "Load Optional ControlNet Model" exists to end that dance - it's the stock loader with one extra entry at the top of the dropdown: "None".
Pick "None" and the node returns an empty CONTROL_NET socket. Everything downstream keeps running - the Apply ControlNet node gets a None instead of a model and simply does nothing. Your prompt, sampler and rest of the graph are untouched. Flip the dropdown back to a real file and the control condition comes back. No duplicate graphs, no bypass juggling, one widget toggles the whole condition.
ControlNet, if you're new to it, conditions generation on spatial structure - edges, depth, pose, scribbles - pulled from a reference image (our KB's controlnet essay is the good deep dive). It's powerful, and that power is exactly why you'll want to A/B test with it on and off: "does a canny map actually help this prompt?" is a question you'll ask constantly, and this node is the cleanest way to answer it.
How it works
The source is a thin fork of the core loader. It takes the list of files in your models/controlnet folder and prepends "None":
"control_net_name": (["None"] + folder_paths.get_filename_list("controlnet"),)
When you select "None", load_controlnet short-circuits and returns (None,). Otherwise it calls comfy.controlnet.load_controlnet on the chosen file exactly like the stock node does. That's the whole trick - and it's a good one.
Inputs and output
control_net_name- dropdown with "None" plus every.safetensorsfile inmodels/controlnet.- Output: a single CONTROL_NET socket, wired into a ControlNet Apply node (where you set strength and start/end steps).
ComfyUI's built-in ControlNet apply nodes tolerate a None model gracefully - that's the standard pattern this community uses for optional conditions, and it's why this node works in practice rather than just in theory.
Install
Via ComfyUI Manager, search "uber_comfy_nodes" ("Suplex Misc ComfyUI Nodes") → install → restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/saftle/uber_comfy_nodes
Restart ComfyUI afterwards. Dependencies are Pillow, numpy, psutil and pynvml - nothing exotic, no model downloads. The node appears under Uber Comfy.
Where people get confused
If the dropdown shows only "None" with no files, you have an empty models/controlnet folder - the schema genuinely records the choice list, so an empty folder means an empty list. Drop a ControlNet file in and refresh. One more thing worth knowing: selecting "None" isn't the same as bypassing the loader - downstream apply nodes still run, they just receive nothing. If a custom apply node doesn't tolerate None, that's a bug in that node, not here.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| control_net_name | COMBO | 1 options: None |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONTROL_NET | CONTROL_NET | — |