CMK Visual Provider -Pipe-
How you get your own node's image into the Visualizer panel
- VISUAL
- IMAGE
- SOURCE
- BEFORE
- AFTER
- VISUAL
The Visualizer is the CMK panel that shows each processing stage as a tab, with a press-and-hold before/after. Something has to put those stages there. In the pack's own modules that's done internally; for anything you build yourself - a third-party upscaler, a colour pass, an experiment - CMK Visual Provider -Pipe- is the public way in.
This is the one node in the visual family that does something. It's categorised CMK/Developer/Visual, so it's aimed at people extending the pack rather than at beginners running it, but it's readable enough to use as a plain preview tool.
How it works
CMK's VISUAL pipe isn't a second image wire. It's an accumulating registry of small provider descriptions: a stable provider id, the module type and label, a sequence, capabilities, named channels, and a lifecycle status. The pipeline the pack describes is:
processing → VISUAL chain → provider registry → CMK Visualizer
Visual Provider is the registration step. Each time it runs, it appends - or replaces - one provider entry, keyed by the node instance's own identity. That identity is the important detail: the provider id names a concrete module instance, not a module type. Two instances of the same node, even with the same label, sequence and stage key, are two separate providers and show as two tabs. Repeated evaluation of one instance replaces its status and channels and leaves the rest of the accumulated chain alone, which is how a node that re-runs during a session doesn't leave duplicates behind.
Channels are result (from IMAGE), source, before and after - and channels hold references to images that already exist upstream rather than copies. Registration does no pixel work. If every channel is empty, the node registers nothing at all: the pack's rule is that a provider is evidence of an actual image signal, so a bypassed module must not create an empty tab.
The second mechanism is live preview. Set live_node_type to a class name and the node walks the live prompt graph upstream from its IMAGE link, within its own subgraph instance, looking for that class - a sampler, typically - and records the node ids as live sources. The Visualizer follows those ids, swaps in the decoded preview frame while sampling, and replaces it with the final channel when the run ends.
Inputs and outputs
Required:
label(STRING, defaultResult) - the tab name. If two providers end up with the same label, the Visualizer just appends numbers for display; it doesn't change identity or caching.sequence(INT, default 10, 0–999) - rough sort position in the panel. It is not a processing order, a counter, or a cache component. Wiring order wins when sequences tie.
Optional, and these are the ones you'll use:
IMAGE- what gets published asresult. Ifenableis on and this is empty, the node raises: publishing nothing while claiming to publish is an error, not a no-op.SOURCE/BEFORE/AFTER- the comparison channels. PublishBEFOREandAFTERand the Visualizer gives you the press-and-hold slider on that tab; publish onlySOURCEand you get a reference view.VISUAL- the incoming chain to extend. Leave it unconnected and you start a new chain.enable(BOOLEAN, wire-only) - off means the node passes the incoming chain through untouched and registers nothing, without forcing its image inputs to evaluate. That's the clean way to make a preview optional.
Output: VISUAL - the chain, with your provider in it. Wire it to the Visualizer, or to the next provider.
Install
Manager → search CMK Flow → install → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/CMKFlow/cmk_nodes
python3 custom_nodes/cmk_nodes/scripts/install_cmk_requirements.py
No models needed for this node. You do want the Vue Nodes / Nodes 2.0 setting on - the panel is a frontend surface and CMK warns at startup when the rendering mode is the legacy one. For live previews while sampling, set Comfy → Execution → Live preview method to auto; CMK rides ComfyUI's existing latent-preview channel for those, so there's no second decode.
Common issues
- No tab appears. Either
enableis off, or no channel received an image. Both are silent by design. - "CMK Visual Provider requires IMAGE while enabled." Exactly what it says. Wire the image or switch it off.
- The tab is in the wrong place. Reorder the
VISUALchain, or changesequence- a panel hint, not a routing control. - Live preview never shows. Check
live_node_typematches the sampling node's class name exactly, and that the sampler is upstream within the same subgraph instance. The lookup is scoped on purpose. - Two providers, same label. Intended; they're distinct instances. The display suffixes are cosmetic.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| label | STRING | Result | — |
| sequence | INT | 100–999 | — |
| VISUALopt | CMK_VISUAL_PIPE | — | |
| IMAGEopt | IMAGE | — | |
| SOURCEopt | IMAGE | — | |
| BEFOREopt | IMAGE | — | |
| AFTERopt | IMAGE | — | |
| enableopt | BOOLEAN | true | — |
| live_node_typeopt | STRING | — | |
| branchopt | STRING | — | |
| stage_keyopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| VISUAL | CMK_VISUAL_PIPE | — |