Nodes/OmniNodes/ControlNet Apply (Advanced) πŸ•ΉοΈ
ComfyUI Node

ControlNet Apply (Advanced) πŸ•ΉοΈ

ControlNet Apply, the step everyone forgets to wire

By TensorVizionΒ·Created 3 months agoΒ·Updated 7 days agoΒ· 0
ControlNet Apply (Advanced) πŸ•ΉοΈ
  • positive
  • negative
  • control_net
  • image
  • vae
  • positive
  • negative
  • summary
β—„strength1.00β–Ί
β—„start_percent0.000β–Ί
β—„end_percent1.000β–Ί

You've loaded a ControlNet and you've built a control image - edges, depth, pose, whatever. Now what? For the longest time, OmniNodes had both of those steps and nothing to connect them to your sampler. This node is that missing bridge. It's the "Apply ControlNet" step, and it takes a loaded CONTROL_NET plus a control image and pushes them onto your positive and negative conditioning so the sampler actually obeys them.

What it does, mechanically

It's a thin wrapper around ComfyUI core's ControlNetApplyAdvanced, so its behavior matches the stock "Apply ControlNet (Advanced)" node exactly - it just adds a summary string so you can see what happened. The control image gets injected into the UNet's conditioning through the ControlNet's copy of the encoder, steering where things go spatially while your text prompt keeps deciding what goes there. ControlNet conditioning isn't a filter applied to the final image; it's part of the sampling itself.

The inputs you'll actually touch

  • positive and negative - your conditionings from CLIP Text Encode. Both get the ControlNet applied.
  • control_net - from a ControlNet Loader.
  • image - the hint image, e.g. a canny edge map or depth map.
  • strength - default 1.0. This is the "how hard does it pull" dial. Modern union ControlNets publish lower numbers than the old SD-era 1.0 default - 0.65–0.9 is the current recommended range for Flux and Qwen unions, and overcooking a modern model at 1.0 is a real thing.
  • start_percent / end_percent - the window of the denoise schedule the ControlNet applies to, 0.0 to 1.0. Defaults are 0 to 1 (the whole run). The pro move is to release the condition once composition has formed, e.g. end it at 0.5, so later steps add detail without fighting the structure.
  • vae - optional, and only needed for ControlNets that expect a latent-space hint image rather than a pixel-space one. Leave it unconnected and 99% of workflows don't care.

Outputs are positive and negative (wire both into your KSampler) plus the summary string.

Getting it installed and running

Same pack install as the rest of OmniNodes:

cd ComfyUI/custom_nodes/
git clone https://github.com/TensorVizion/OmniNodes

Restart ComfyUI, or grab it via ComfyUI Manager by searching "OmniNodes". No extra pip packages, no model downloads for the node itself - you supply the ControlNet model file and the hint image.

Where people get burned

The classic mistake is forgetting the start/end window entirely and running the ControlNet at full strength for all steps, which produces that stiff, over-structured look. Start with strength around 0.7 and let end_percent trail off before the final steps. Also: if you built your hint image with this pack's ControlNet Preprocessor, note its depth_lite mode is a luminance-based heuristic, not a real depth model - fine for quick iteration, but switch to a real depth preprocessor for anything where depth accuracy actually matters. And remember the pair: this node applies a ControlNet, it doesn't load one, so keep a loader upstream and this node between the loader and your KSampler.

CategoryTensorVizion/Model Utilities

Inputs (8)

NameTypeDefaultDescription
positiveCONDITIONINGβ€”
negativeCONDITIONINGβ€”
control_netCONTROL_NETβ€”
imageIMAGEβ€”
strengthFLOAT1.000–10β€”
start_percentFLOAT0.0000–1β€”
end_percentFLOAT1.0000–1β€”
vaeoptVAEβ€”

Outputs (3)

NameTypeDescription
positiveCONDITIONINGβ€”
negativeCONDITIONINGβ€”
summarySTRINGβ€”