CMK Visual Forward -Pipe-
The node that keeps the visual chain alive through a module that shows nothing
- VISUAL
- VISUAL
This node does nothing, and that's the specification. It takes a VISUAL pipe in and hands the same pipe back out, unchanged. It exists so a module that contributes nothing to the visual chain can still sit in the middle of one without breaking it.
If you're wondering why that needs a node at all: CMK's VISUAL chain is order-sensitive. Provider order in the panel is the order of the chain, not the sequence numbers, and the Visualizer walks it. Insert a module with no visual output into the middle of a chain and you either leave the chain unconnected through that span or you rewire around it. Visual Forward is the third option - a no-op that carries the wire across.
How it works
The entire class is a two-line passthrough:
def forward(VISUAL=None):
return (empty_visual() if VISUAL is None else VISUAL,)
If you wire nothing in, you get an empty visual pipe out - a valid CMK_VISUAL_PIPE dictionary with an empty provider list, so anything downstream can still be connected without a type error. If you wire a chain in, you get the identical object back. No copy, no re-registration, no reordering, no status change.
That null case is more useful than it looks. An empty pipe is a legitimate starting point for a chain in a subgraph, which is why you'll find this node in packaged CMK subgraphs as the entry point of a visual section rather than as decoration between two modules.
Category is CMK/Developer/Visual: infrastructure for the pack, not a tool you're meant to shop for. CMK's product split puts Developer nodes below the Toolbox - visible in the menu so graphs can be inspected and edited, but not the intended audience. Its sibling in the same category is CMK Visual Provider -Pipe-, which does add something to the chain.
Inputs and outputs
VISUAL(CMK_VISUAL_PIPE, optional) - the incoming chain. Optional, because an empty chain is legal.VISUAL(CMK_VISUAL_PIPE) - the same chain, out.
One input, one output, same name, same type. If a graph is behaving as though a visual stage vanished, check whether the module in question genuinely publishes providers - a module that ran fine but produced no image channels registers nothing, by design. CMK treats a provider as evidence that an image signal actually existed.
That rule is why you can't use this node as a bypass substitute. If a module is disabled, the pack's own boundaries handle the passthrough and don't run the expensive path at all. Visual Forward doesn't disable anything; it just carries a wire.
Install
Developer nodes ship inside the pack, so installing is installing CMK Flow. Manager → search CMK Flow → install → restart, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/CMKFlow/cmk_nodes
python3 custom_nodes/cmk_nodes/scripts/install_cmk_requirements.py
No model files, no optional dependencies, nothing to download. The one environment requirement is the ComfyUI setting Vue Nodes / Nodes 2.0 - CMK warns at startup if it's off, and without it the dynamic node presentation falls back to legacy LiteGraph rendering.
Common issues
- "I added it and nothing changed." Correct. It's a passthrough. If you wanted something to appear in the Visualizer panel, you want
CMK Visual Provider -Pipe-. - Type error on connect. You're feeding it something that isn't a
CMK_VISUAL_PIPE- commonly anIMAGE, or a visual payload that's been through JSON serialisation and lost its type tag out the other side. - Order looks wrong in the panel. Panel order follows the order of the
VISUALchain, and thesequencenumber only sorts the registers roughly. Adding a forward node can't fix that - re-route the chain. - Don't confuse it with
CMK Image Forward -Pipe-. That one passes anIMAGEthrough; it is not a visual-chain node and putting it in aVISUALwire won't work.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| VISUALopt | CMK_VISUAL_PIPE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| VISUAL | CMK_VISUAL_PIPE | — |