CNCC Apply ControlNet
Three nodes' worth of ControlNet, driven by one saved preset
- positive
- negative
- image
- positive
- negative
- controlnet_image
- pose_keypoint
The normal ControlNet path in ComfyUI is three nodes and a chore. You wire a Load ControlNet Model, then a preprocessor from comfyui_controlnet_aux with its own pile of widgets - thresholds, resolution, detect_hand, the works - then Apply ControlNet (Advanced), where you set strength and the start/end steps. Nothing's wrong with it - except the middle node: you re-dial the same Canny thresholds in every workflow, and you keep them nowhere.
CNCC (ControlNet Control Center) is a preset library for those preprocessor settings. This node, CNCC Apply ControlNet, is the half that also loads and applies the ControlNet, so preprocess → load model → condition your prompt becomes one node.
What you're actually installing
Be clear-eyed about the scale. The pack is one author's convenience wrapper: a single commit, version 0.1.0, and no Reddit footprint I could find. It reimplements nothing - it grabs preprocessor classes out of your existing comfyui_controlnet_aux install via ComfyUI's own NODE_CLASS_MAPPINGS, and uses comfy.controlnet.load_controlnet for the model. So the output is whatever the native path would produce; the value is purely ergonomic. One node, one preset dropdown, your thresholds saved between sessions.
If your graphs are already tidy, you don't need this. If you have five workflows that all want the same DWPose setup, it earns its place fast.
How it works
A preset is a JSON file in the pack's presets/ folder: a preprocessor type (say CannyEdgePreprocessor) plus its parameter values. Everything else is plumbing around that lookup.
At execution it takes the source image - from image if wired, otherwise the node's drop area - runs the preprocessor, converts the result to a ControlNet hint, and copies the applied network onto your conditioning. Two details worth knowing:
- Stacking works. When a conditioning entry already carries a previous ControlNet, the new one is attached in front of it rather than replacing it. Chain two and you get canny + depth, not canny-then-ignored.
strength0 is a no-op shortcut. The conditioning comes back untouched, but the preprocessed image still comes out the other side. Handy for "show me the map without affecting the image."
The inputs that matter
cn_name(labelled Preset) - a combo of your saved presets. With none saved, the single entry is<プリセット未作成>, the author's Japanese placeholder that never got localized. That string is your error message: go make a preset.positive/negative- standard CONDITIONING. Wire these from your CLIP Text Encode, same as always.control_net_name- combo built frommodels/controlnet. It's required, so an empty dropdown means no checkpoints in place and the node can't run.strength(default 1.0, 0–10),start_percent(0),end_percent(1). Start/end is the dial that actually matters - releasing the condition at 0.5 instead of 1.0 is the difference between "model paints inside my edges" and "model fights my edges." And note the 1.0 default is an SD-era habit: modern unions publish lower scales (0.65–0.8 for Flux 2's Fun union, 0.8–1.0 for Qwen's), so starting at 1.0 on a 2025-26 model overcooks it.imageanduploaded_image- the second is the drop area, and only a fallback: the zone greys out onceimageis connected, and dropping on it does nothing.
Outputs are positive, negative (both CONDITIONING - straight into your sampler) and controlnet_image, the map as an IMAGE. Wire that last one into a Preview Image; a bad pose or depth extraction is otherwise invisible until you're squinting at a broken render.
Install
Install comfyui_controlnet_aux first - the one prerequisite. Then either search ComfyUI-CNCC in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/ketle-man/ComfyUI-CNCC
# restart ComfyUI
No extra Python dependencies (dependencies = [] in pyproject.toml). Put your ControlNet files in ComfyUI/models/controlnet/ and the dropdown fills itself in.
Then hit the node's Settings button (CN Settings tab), pick a preprocessor, tune its parameters, name it and optionally save a thumbnail. The Preset Selector tab previews presets against a dropped image, and deletes them.
Where people get burned
The preset dropdown won't show a preset you just saved. The list is read when ComfyUI builds the node's inputs, so reload the page after saving your first one.
controlnet_aux preprocessor 'X' not found. The aux pack is missing, or old enough that it doesn't ship that preprocessor. Update it through Manager.
DWPose dies with cv2.error: ... cv::dnn::gather. This one is real and the README names it. Without a GPU build of onnxruntime, the aux pack falls back to running its bbox detector through OpenCV's DNN backend, which chokes on yolo_nas_*_fp16.onnx. You'll usually see the warning "Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device" just before it. Two fixes: install onnxruntime-gpu, or change the preset's bbox_detector to yolox_l.torchscript.pt, which routes through torch.jit and never touches OpenCV DNN.
Your presets don't travel. They live in the custom node folder and are gitignored, so they aren't in your workflow PNG - back up custom_nodes/ComfyUI-CNCC/presets/.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| cn_name | COMBO | <プリセット未作成> | 1 options: <プリセット未作成> |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| control_net_name | COMBO | 0 options: | |
| strength | FLOAT | 1.000–10 | — |
| start_percent | FLOAT | 0.0000–1 | — |
| end_percent | FLOAT | 1.0000–1 | — |
| imageopt | IMAGE | — | |
| uploaded_imageopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| controlnet_image | IMAGE | — |
| pose_keypoint | POSE_KEYPOINT | — |