Stack_CN_union3
Three Control Images, Two Condition Slots Each, One Node
- image1
- image2
- image3
- union_stack3
Stack_CN_union3 is the bigger sibling of Stack_CN_union - same union-ControlNet idea, but instead of one image with two condition slots, it gives you three separate images, each with its own two condition slots and its own strength/timing controls. That's up to six conditions across three reference images in a single node, useful when a composition genuinely needs several distinct control sources at once - say, a canny map for the foreground subject, a depth map for the background, and a pose skeleton for a character, rather than daisy-chaining three single-image nodes.
Inputs
For each of the three slots (numbered 1, 2, 3), the pattern repeats:
- imageN - the control image for that slot.
- typeN_a / typeN_b - up to two condition types from the same nine-choice list Stack_CN_union uses:
None,openpose,depth,hed/pidi/scribble/ted,canny/lineart/anime_lineart/mlsd,normal,segment,tile,repaint. - strengthN (default 0.8, range 0–10).
- start_percentN / end_percentN (0–1, default 0 and 1).
There's also a shared controlNet dropdown, populated at runtime from your models/controlnet folder - same union checkpoint model applies across all three image slots.
Output: union_stack3, a UNION_STACK object - the same underlying type Stack_CN_union outputs, just under a different socket name, meant for the same downstream consumer.
The trade-off against Stack_CN_union
Stack_CN_union is chainable - it has an optional union_stack input, so you can link several of them together for as many conditions as you need, one image at a time. Stack_CN_union3 isn't chainable that way; there's no stack input on it. What you get instead is three image slots fixed into one node, which is less wiring when you know up front you need exactly three (or fewer - leave the ones you don't need at None), and more rigid if you ever need a fourth.
Grounding the condition menu
The nine type choices map onto how modern union ControlNet checkpoints package their conditions - one dropdown entry can cover several interchangeable preprocessors (hed/pidi/scribble/ted grouped as one softedge-family slot, canny/lineart/anime_lineart/mlsd grouped as one edge-family slot) because the underlying model was trained to accept any of them as the same kind of input. This is the same condition menu you'd see on a current SDXL, Flux, or Z-Image union checkpoint - a single file trained to fuse whichever conditions you throw at it, without needing separate hyperparameter tuning per combination.
Installing it
ComfyUI Manager: search "ComfyUI-Apt_Preset," install, restart. Or by hand: cd ComfyUI/custom_nodes && git clone https://github.com/cardenluo/ComfyUI-Apt_Preset.git, then restart. The bundled install.bat only runs on Windows - on Linux or a cloud box, check what packages it lists and pip-install them, or let ComfyUI Manager catch the missing dependencies on first load.
You'll also need an actual union ControlNet checkpoint downloaded into models/controlnet - Apt_Preset supplies the node code, not the model weights. Pick one that matches your base model: xinsir's SDXL union, Shakker's Flux Union Pro 2.0, InstantX's Qwen-Image union, or Alibaba PAI's Z-Image and Flux 2 Fun unions are the current standard picks.
Troubleshooting
Six condition slots means six chances to leave something set wrong - if a slot isn't doing anything, check that its imageN is actually connected and its typeN_a/typeN_b isn't still on None.
Import failures with this pack are a documented real thing, not a hypothetical: a comfyui subreddit thread shows a console error reading (IMPORT FAILED): ...ComfyUI-Apt_Preset. The fix that worked there was ComfyUI Manager's "install missing custom nodes," or manually deleting and re-cloning the folder and restarting ComfyUI.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| controlNetopt | COMBO | 1 options: None | |
| image1opt | IMAGE | — | |
| type1_aopt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| type1_bopt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| strength1opt | FLOAT | 0.8000–10 | — |
| start_percent1opt | FLOAT | 0.000–1 | — |
| end_percent1opt | FLOAT | 1.000–1 | — |
| image2opt | IMAGE | — | |
| type2_aopt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| type2_bopt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| strength2opt | FLOAT | 0.8000–10 | — |
| start_percent2opt | FLOAT | 0.000–1 | — |
| end_percent2opt | FLOAT | 1.000–1 | — |
| image3opt | IMAGE | — | |
| type3_aopt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| type3_bopt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| strength3opt | FLOAT | 0.8000–10 | — |
| start_percent3opt | FLOAT | 0.000–1 | — |
| end_percent3opt | FLOAT | 1.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| union_stack3 | UNION_STACK | — |