Forge ControlNet Stack
Twenty ControlNet slots, preprocessed on Forge's side — the adapter that keeps pose and edge control in your graph
- cn_1_image
- cn_2_image
- cn_3_image
- cn_4_image
- cn_5_image
- cn_6_image
- cn_7_image
- cn_8_image
- cn_9_image
- cn_10_image
- cn_11_image
- cn_12_image
- cn_13_image
- cn_14_image
- cn_15_image
- cn_16_image
- cn_17_image
- cn_18_image
- cn_19_image
- cn_20_image
- cn_stack
- cn_1_preview
- cn_2_preview
- cn_3_preview
- cn_4_preview
- cn_5_preview
- cn_6_preview
- cn_7_preview
- cn_8_preview
- cn_9_preview
- cn_10_preview
- cn_11_preview
- cn_12_preview
- cn_13_preview
- cn_14_preview
- cn_15_preview
- cn_16_preview
- cn_17_preview
- cn_18_preview
- cn_19_preview
- cn_20_preview
ControlNet is how you tell the model where things go - pose, edges, depth - while the prompt decides what they are. If you're building a ComfyUI graph that actually renders on SD WebUI Forge (through the ForgeSampler node in this same pack), you can't use ComfyUI's native ControlNet nodes; Forge never sees them. This node is the matching adapter: it turns your images and settings into a CN_STACK that ForgeSampler injects into Forge's ControlNet handler when it fires the generation call.
The headline feature is capacity. It exposes twenty units, cn_1 through cn_20, and every one carries the full A1111-era ControlNet toolkit: image, model, preprocessor, weight, start/end guidance, resolution, thresholds, control mode, and resize mode. You'll rarely use more than two or three at once, but the headroom is nice for stacked pose + depth + canny compositions - which is exactly the setup ControlNet was famous for enabling.
How it works. When the node loads, it asks Forge for its model list (/controlnet/model_list) and preprocessor list (/controlnet/module_list) to fill the dropdowns. For each slot that has both an image and a model, it runs the preprocessor on Forge's side: it POSTs your image to Forge's /controlnet/detect endpoint, which returns the processed map (line drawing, depth map, whatever the module produces). Then it packages a per-unit dict - model, weight, the base64 image, processor_res, thresholds, guidance_start/guidance_end, control mode, resize mode - into the stack. ForgeSampler drops that into alwayson_scripts.ControlNet.args on the API call, and Forge does all the ControlNet math. ComfyUI is the remote control, not the engine.
The inputs that matter per slot:
cn_N_imageandcn_N_model- the only two you must set for a unit to activate. No image plus model, no unit, no effect.cn_N_preprocessor- default "none". Set it when you're feeding a raw photo and need pose/canny/depth detected; leave it at "none" when you're feeding a ready-made map.cn_N_weight- 0 to 2, default 1.0. This is your main dial; if a condition is fighting the prompt, it's usually this.cn_N_start/cn_N_end- when during sampling the condition applies (0 to 1). Useful for letting the prompt take over in the final steps.
The rest you can ignore until they bite: resolution (512, the preprocessor's working resolution), threshold_a/threshold_b (100/200 - meaningful mainly for threshold-style modules like canny), control_mode (Balanced / prompt-more-important / ControlNet-more-important), and resize_mode ("Crop and Resize" is the sane default).
Outputs are cn_stack (into ForgeSampler's cn_stack input) plus cn_1_preview through cn_20_preview images of the processed maps. Wire a couple of those into a PreviewImage node. It's free, and it's the best debugging habit in ControlNet: the canny preview should look like an actual line drawing before you spend 30 steps hoping.
Install & gotchas. Same pack, same install - ComfyUI Manager ("ComfyUI-ForgeAPI") or git clone https://github.com/kreonxv/ComfyUI-ForgeAPI into custom_nodes, then restart. No model downloads: the ControlNet models are the ones already in Forge's folder.
Two gotchas worth flagging. First, the /controlnet/* endpoints only exist if Forge actually has ControlNet available (the sd-webui-controlnet extension, which Forge can run). Without it you get empty model lists, and detect fails - the code then silently passes your original image through instead of preprocessing it, so a "none" model with no map does nothing useful. Second, same rule as every node in this pack: Forge must be running and reachable when ComfyUI boots, or the dropdowns come up empty. Start Forge, restart ComfyUI, then build your stack.
Inputs (222)
| Name | Type | Default | Description |
|---|---|---|---|
| forge_url | STRING | http://127.0.0.1:7860 | — |
| enabled | BOOLEAN | true | — |
| cn_1_imageopt | IMAGE | — | |
| cn_1_modelopt | COMBO | 1 options: None | |
| cn_1_preprocessoropt | COMBO | 1 options: none | |
| cn_1_weightopt | FLOAT | 1.000–2 | — |
| cn_1_startopt | FLOAT | 0.000–1 | — |
| cn_1_endopt | FLOAT | 1.000–1 | — |
| cn_1_resolutionopt | INT | 51264–2048 | — |
| cn_1_threshold_aopt | FLOAT | 1000–255 | — |
| cn_1_threshold_bopt | FLOAT | 2000–255 | — |
| cn_1_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_1_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_2_imageopt | IMAGE | — | |
| cn_2_modelopt | COMBO | 1 options: None | |
| cn_2_preprocessoropt | COMBO | 1 options: none | |
| cn_2_weightopt | FLOAT | 1.000–2 | — |
| cn_2_startopt | FLOAT | 0.000–1 | — |
| cn_2_endopt | FLOAT | 1.000–1 | — |
| cn_2_resolutionopt | INT | 51264–2048 | — |
| cn_2_threshold_aopt | FLOAT | 1000–255 | — |
| cn_2_threshold_bopt | FLOAT | 2000–255 | — |
| cn_2_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_2_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_3_imageopt | IMAGE | — | |
| cn_3_modelopt | COMBO | 1 options: None | |
| cn_3_preprocessoropt | COMBO | 1 options: none | |
| cn_3_weightopt | FLOAT | 1.000–2 | — |
| cn_3_startopt | FLOAT | 0.000–1 | — |
| cn_3_endopt | FLOAT | 1.000–1 | — |
| cn_3_resolutionopt | INT | 51264–2048 | — |
| cn_3_threshold_aopt | FLOAT | 1000–255 | — |
| cn_3_threshold_bopt | FLOAT | 2000–255 | — |
| cn_3_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_3_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_4_imageopt | IMAGE | — | |
| cn_4_modelopt | COMBO | 1 options: None | |
| cn_4_preprocessoropt | COMBO | 1 options: none | |
| cn_4_weightopt | FLOAT | 1.000–2 | — |
| cn_4_startopt | FLOAT | 0.000–1 | — |
| cn_4_endopt | FLOAT | 1.000–1 | — |
| cn_4_resolutionopt | INT | 51264–2048 | — |
| cn_4_threshold_aopt | FLOAT | 1000–255 | — |
| cn_4_threshold_bopt | FLOAT | 2000–255 | — |
| cn_4_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_4_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_5_imageopt | IMAGE | — | |
| cn_5_modelopt | COMBO | 1 options: None | |
| cn_5_preprocessoropt | COMBO | 1 options: none | |
| cn_5_weightopt | FLOAT | 1.000–2 | — |
| cn_5_startopt | FLOAT | 0.000–1 | — |
| cn_5_endopt | FLOAT | 1.000–1 | — |
| cn_5_resolutionopt | INT | 51264–2048 | — |
| cn_5_threshold_aopt | FLOAT | 1000–255 | — |
| cn_5_threshold_bopt | FLOAT | 2000–255 | — |
| cn_5_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_5_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_6_imageopt | IMAGE | — | |
| cn_6_modelopt | COMBO | 1 options: None | |
| cn_6_preprocessoropt | COMBO | 1 options: none | |
| cn_6_weightopt | FLOAT | 1.000–2 | — |
| cn_6_startopt | FLOAT | 0.000–1 | — |
| cn_6_endopt | FLOAT | 1.000–1 | — |
| cn_6_resolutionopt | INT | 51264–2048 | — |
| cn_6_threshold_aopt | FLOAT | 1000–255 | — |
| cn_6_threshold_bopt | FLOAT | 2000–255 | — |
| cn_6_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_6_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_7_imageopt | IMAGE | — | |
| cn_7_modelopt | COMBO | 1 options: None | |
| cn_7_preprocessoropt | COMBO | 1 options: none | |
| cn_7_weightopt | FLOAT | 1.000–2 | — |
| cn_7_startopt | FLOAT | 0.000–1 | — |
| cn_7_endopt | FLOAT | 1.000–1 | — |
| cn_7_resolutionopt | INT | 51264–2048 | — |
| cn_7_threshold_aopt | FLOAT | 1000–255 | — |
| cn_7_threshold_bopt | FLOAT | 2000–255 | — |
| cn_7_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_7_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_8_imageopt | IMAGE | — | |
| cn_8_modelopt | COMBO | 1 options: None | |
| cn_8_preprocessoropt | COMBO | 1 options: none | |
| cn_8_weightopt | FLOAT | 1.000–2 | — |
| cn_8_startopt | FLOAT | 0.000–1 | — |
| cn_8_endopt | FLOAT | 1.000–1 | — |
| cn_8_resolutionopt | INT | 51264–2048 | — |
| cn_8_threshold_aopt | FLOAT | 1000–255 | — |
| cn_8_threshold_bopt | FLOAT | 2000–255 | — |
| cn_8_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_8_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_9_imageopt | IMAGE | — | |
| cn_9_modelopt | COMBO | 1 options: None | |
| cn_9_preprocessoropt | COMBO | 1 options: none | |
| cn_9_weightopt | FLOAT | 1.000–2 | — |
| cn_9_startopt | FLOAT | 0.000–1 | — |
| cn_9_endopt | FLOAT | 1.000–1 | — |
| cn_9_resolutionopt | INT | 51264–2048 | — |
| cn_9_threshold_aopt | FLOAT | 1000–255 | — |
| cn_9_threshold_bopt | FLOAT | 2000–255 | — |
| cn_9_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_9_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_10_imageopt | IMAGE | — | |
| cn_10_modelopt | COMBO | 1 options: None | |
| cn_10_preprocessoropt | COMBO | 1 options: none | |
| cn_10_weightopt | FLOAT | 1.000–2 | — |
| cn_10_startopt | FLOAT | 0.000–1 | — |
| cn_10_endopt | FLOAT | 1.000–1 | — |
| cn_10_resolutionopt | INT | 51264–2048 | — |
| cn_10_threshold_aopt | FLOAT | 1000–255 | — |
| cn_10_threshold_bopt | FLOAT | 2000–255 | — |
| cn_10_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_10_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_11_imageopt | IMAGE | — | |
| cn_11_modelopt | COMBO | 1 options: None | |
| cn_11_preprocessoropt | COMBO | 1 options: none | |
| cn_11_weightopt | FLOAT | 1.000–2 | — |
| cn_11_startopt | FLOAT | 0.000–1 | — |
| cn_11_endopt | FLOAT | 1.000–1 | — |
| cn_11_resolutionopt | INT | 51264–2048 | — |
| cn_11_threshold_aopt | FLOAT | 1000–255 | — |
| cn_11_threshold_bopt | FLOAT | 2000–255 | — |
| cn_11_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_11_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_12_imageopt | IMAGE | — | |
| cn_12_modelopt | COMBO | 1 options: None | |
| cn_12_preprocessoropt | COMBO | 1 options: none | |
| cn_12_weightopt | FLOAT | 1.000–2 | — |
| cn_12_startopt | FLOAT | 0.000–1 | — |
| cn_12_endopt | FLOAT | 1.000–1 | — |
| cn_12_resolutionopt | INT | 51264–2048 | — |
| cn_12_threshold_aopt | FLOAT | 1000–255 | — |
| cn_12_threshold_bopt | FLOAT | 2000–255 | — |
| cn_12_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_12_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_13_imageopt | IMAGE | — | |
| cn_13_modelopt | COMBO | 1 options: None | |
| cn_13_preprocessoropt | COMBO | 1 options: none | |
| cn_13_weightopt | FLOAT | 1.000–2 | — |
| cn_13_startopt | FLOAT | 0.000–1 | — |
| cn_13_endopt | FLOAT | 1.000–1 | — |
| cn_13_resolutionopt | INT | 51264–2048 | — |
| cn_13_threshold_aopt | FLOAT | 1000–255 | — |
| cn_13_threshold_bopt | FLOAT | 2000–255 | — |
| cn_13_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_13_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_14_imageopt | IMAGE | — | |
| cn_14_modelopt | COMBO | 1 options: None | |
| cn_14_preprocessoropt | COMBO | 1 options: none | |
| cn_14_weightopt | FLOAT | 1.000–2 | — |
| cn_14_startopt | FLOAT | 0.000–1 | — |
| cn_14_endopt | FLOAT | 1.000–1 | — |
| cn_14_resolutionopt | INT | 51264–2048 | — |
| cn_14_threshold_aopt | FLOAT | 1000–255 | — |
| cn_14_threshold_bopt | FLOAT | 2000–255 | — |
| cn_14_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_14_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_15_imageopt | IMAGE | — | |
| cn_15_modelopt | COMBO | 1 options: None | |
| cn_15_preprocessoropt | COMBO | 1 options: none | |
| cn_15_weightopt | FLOAT | 1.000–2 | — |
| cn_15_startopt | FLOAT | 0.000–1 | — |
| cn_15_endopt | FLOAT | 1.000–1 | — |
| cn_15_resolutionopt | INT | 51264–2048 | — |
| cn_15_threshold_aopt | FLOAT | 1000–255 | — |
| cn_15_threshold_bopt | FLOAT | 2000–255 | — |
| cn_15_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_15_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_16_imageopt | IMAGE | — | |
| cn_16_modelopt | COMBO | 1 options: None | |
| cn_16_preprocessoropt | COMBO | 1 options: none | |
| cn_16_weightopt | FLOAT | 1.000–2 | — |
| cn_16_startopt | FLOAT | 0.000–1 | — |
| cn_16_endopt | FLOAT | 1.000–1 | — |
| cn_16_resolutionopt | INT | 51264–2048 | — |
| cn_16_threshold_aopt | FLOAT | 1000–255 | — |
| cn_16_threshold_bopt | FLOAT | 2000–255 | — |
| cn_16_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_16_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_17_imageopt | IMAGE | — | |
| cn_17_modelopt | COMBO | 1 options: None | |
| cn_17_preprocessoropt | COMBO | 1 options: none | |
| cn_17_weightopt | FLOAT | 1.000–2 | — |
| cn_17_startopt | FLOAT | 0.000–1 | — |
| cn_17_endopt | FLOAT | 1.000–1 | — |
| cn_17_resolutionopt | INT | 51264–2048 | — |
| cn_17_threshold_aopt | FLOAT | 1000–255 | — |
| cn_17_threshold_bopt | FLOAT | 2000–255 | — |
| cn_17_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_17_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_18_imageopt | IMAGE | — | |
| cn_18_modelopt | COMBO | 1 options: None | |
| cn_18_preprocessoropt | COMBO | 1 options: none | |
| cn_18_weightopt | FLOAT | 1.000–2 | — |
| cn_18_startopt | FLOAT | 0.000–1 | — |
| cn_18_endopt | FLOAT | 1.000–1 | — |
| cn_18_resolutionopt | INT | 51264–2048 | — |
| cn_18_threshold_aopt | FLOAT | 1000–255 | — |
| cn_18_threshold_bopt | FLOAT | 2000–255 | — |
| cn_18_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_18_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_19_imageopt | IMAGE | — | |
| cn_19_modelopt | COMBO | 1 options: None | |
| cn_19_preprocessoropt | COMBO | 1 options: none | |
| cn_19_weightopt | FLOAT | 1.000–2 | — |
| cn_19_startopt | FLOAT | 0.000–1 | — |
| cn_19_endopt | FLOAT | 1.000–1 | — |
| cn_19_resolutionopt | INT | 51264–2048 | — |
| cn_19_threshold_aopt | FLOAT | 1000–255 | — |
| cn_19_threshold_bopt | FLOAT | 2000–255 | — |
| cn_19_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_19_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
| cn_20_imageopt | IMAGE | — | |
| cn_20_modelopt | COMBO | 1 options: None | |
| cn_20_preprocessoropt | COMBO | 1 options: none | |
| cn_20_weightopt | FLOAT | 1.000–2 | — |
| cn_20_startopt | FLOAT | 0.000–1 | — |
| cn_20_endopt | FLOAT | 1.000–1 | — |
| cn_20_resolutionopt | INT | 51264–2048 | — |
| cn_20_threshold_aopt | FLOAT | 1000–255 | — |
| cn_20_threshold_bopt | FLOAT | 2000–255 | — |
| cn_20_control_modeopt | COMBO | Balanced | 3 options: Balanced, My prompt is more important, ControlNet is more important |
| cn_20_resize_modeopt | COMBO | Crop and Resize | 3 options: Just Resize, Crop and Resize, Resize and Fill |
Outputs (21)
| Name | Type | Description |
|---|---|---|
| cn_stack | CN_STACK | — |
| cn_1_preview | IMAGE | — |
| cn_2_preview | IMAGE | — |
| cn_3_preview | IMAGE | — |
| cn_4_preview | IMAGE | — |
| cn_5_preview | IMAGE | — |
| cn_6_preview | IMAGE | — |
| cn_7_preview | IMAGE | — |
| cn_8_preview | IMAGE | — |
| cn_9_preview | IMAGE | — |
| cn_10_preview | IMAGE | — |
| cn_11_preview | IMAGE | — |
| cn_12_preview | IMAGE | — |
| cn_13_preview | IMAGE | — |
| cn_14_preview | IMAGE | — |
| cn_15_preview | IMAGE | — |
| cn_16_preview | IMAGE | — |
| cn_17_preview | IMAGE | — |
| cn_18_preview | IMAGE | — |
| cn_19_preview | IMAGE | — |
| cn_20_preview | IMAGE | — |