pre_controlnet
A 3-slot ControlNet stack for the pack's context chain
- context
- image1
- image2
- image3
- context
- positive
- negative
Stacking two or three ControlNets manually in ComfyUI means chaining that many ControlNetApplyAdvanced nodes, each wanting an image, a checkpoint, a strength, and a start/end range. pre_controlnet folds three of those slots into one node, and instead of passing conditioning tensors around directly, it plugs into Apt_Preset's RUN_CONTEXT chain - the thread that carries model, clip, and conditioning state through the pack's Loader → Controller → Sampler structure.
Part of the chx_tool/controlnet category. This is the node for standard, one-checkpoint-per-condition ControlNets - canny, depth, pose, whatever you've got individually. If you're working with a modern union checkpoint that handles several condition types from one file, look at pre_controlnet_union instead.
How it works
You get three independent slots, each with an image, a controlnet checkpoint dropdown, a strength, and a start/end percent. Fill in as many as you're using and leave the rest at their defaults (None checkpoint effectively skips that slot). The node applies each active ControlNet to whatever positive/negative conditioning is already flowing through the incoming context, and returns the updated context plus the resulting positive/negative conditioning directly, so you don't have to fish them back out of the context object yourself if your sampler node wants them as separate inputs.
Strength and the start/end percent behave exactly like ComfyUI's native ControlNet controls: strength (0–10 here, though most models never want more than 1–2) is how hard the condition pushes; start/end percent (0–1) is when during the denoise it applies. Starting at 0 and ending around 0.5, for instance, lets a ControlNet lock in composition early and then get out of the way so the model can add its own detail in later steps - that's standard practice, not something specific to this node.
Inputs and outputs
- context (required) - the running
RUN_CONTEXTfrom upstream in the pack's chain. - image1 / controlnet1 / strength1 / start_percent1 / end_percent1 - first slot, and the same pattern repeats for slot 2 and slot 3. All optional; leave a slot's checkpoint at
Noneto skip it. - Strength defaults to 0.5, start_percent to 0, end_percent to 1 for every slot.
Outputs: context (updated, continues the chain), positive and negative (CONDITIONING), ready to feed a sampler.
Installing it
ComfyUI Manager: search "ComfyUI-Apt_Preset", install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/cardenluo/ComfyUI-Apt_Preset.git
Restart afterward. install.bat handles Windows dependencies; Linux/Mac, install from the requirements file inside your ComfyUI venv. You'll need the actual ControlNet checkpoint files for whichever base model you're running - this node reads from the same ControlNet models folder as any native loader, it doesn't ship or fetch any. If you want scheduled/timed ControlNet control beyond this node's static start/end percent, the Apt_Preset README specifically calls out installing ComfyUI-Advanced-ControlNet first.
Common issues
A slot does nothing even with an image wired in. Check the checkpoint dropdown for that slot - if it's still on None, the image input is ignored regardless of what's connected, since there's no model to apply it with.
Structure is locked too rigidly and the model can't add its own detail. Classic over-strength or too-wide a start/end range. Bring strength down, or shorten the active window (end the condition around 0.5 instead of 1.0) so it only governs early composition.
Using a modern union ControlNet checkpoint and only one condition type seems to matter. You're in the wrong node - pre_controlnet expects one checkpoint per condition slot, the older per-condition pattern. A union checkpoint that switches condition type via a dropdown belongs in pre_controlnet_union.
Strength values that worked on an old SD1.5 workflow look wrong on a newer base. The 1.0 SD-era default doesn't carry over - 2025–26 union and per-condition ControlNets for Flux, Qwen-Image, and Z-Image generally publish recommended strengths in the 0.65–0.9 range. Starting at 1.0 on a modern base tends to overcook it.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| context | RUN_CONTEXT | — | |
| image1opt | IMAGE | — | |
| controlnet1opt | COMBO | 1 options: None | |
| strength1opt | FLOAT | 0.500–10 | — |
| start_percent1opt | FLOAT | 0.000–1 | — |
| end_percent1opt | FLOAT | 1.000–1 | — |
| image2opt | IMAGE | — | |
| controlnet2opt | COMBO | 1 options: None | |
| strength2opt | FLOAT | 0.500–10 | — |
| start_percent2opt | FLOAT | 0.000–1 | — |
| end_percent2opt | FLOAT | 1.000–1 | — |
| image3opt | IMAGE | — | |
| controlnet3opt | COMBO | 1 options: None | |
| strength3opt | FLOAT | 0.500–10 | — |
| start_percent3opt | FLOAT | 0.000–1 | — |
| end_percent3opt | FLOAT | 1.000–1 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| context | RUN_CONTEXT | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |