ComfyUI Node

LC Image Pass

The One-Wire Kill Switch ComfyUI Never Shipped

By lonecatone23·Created 2 months ago·Updated 2 days ago· 18
LC Image Pass
  • image
  • image
enabletrue

An image goes in. The same image comes out. That's the whole node - and it's more useful than it sounds, because the interesting part is what happens when you turn it off.

LC Image Pass is a disconnect switch you leave soldered into a wire. Side-tap an image into an LC Color Match reference, or a compare node, or an LC Last Image Holder, flip enable off, and the node goes muted: everything downstream sees an optional socket with nothing on it, exactly as if you'd unplugged the wire. Then flip it back without rewiring anything.

Why this exists

The plumbing layer of ComfyUI is mostly about legibility - reroutes, context buses, group muters - and the LC123 pack is one author's answer to the friction he hit while publishing workflows. The stuff that gets written about is the model of the month; the stuff you actually fight is a graph too large to read. LC Image Pass is squarely in the second category: it costs nothing per run and it means you stop deleting wires you're going to want again in ten minutes.

Concretely: you keep a reference image wired into a colour-grade node so you can occasionally borrow its palette, but most of the time you want that node running full frame, no reference. Without a Pass you unwire and rewire, or mute the consumer - fine until three other things are also reading it.

How it works, honestly

Two layers, and they do different jobs.

Python-side, LCImagePass.run(image, enable=True) returns the image unchanged. Both branches return the same thing, so no, enable isn't doing anything subtle in the backend. It's not converting, clamping, colour-managing or validating - if your input is wrong, this passes wrong straight through.

The actual switching is in web/lc_pass.js. The enable widget writes the node's execution mode: on = live (mode 0), off = muted (mode 2). It syncs both ways - right-click → Mute on the node and the widget flips to false, so the two never disagree. And because node mode is part of the saved graph, a workflow opens with your taps in the same position you left them.

The consequence is the part to internalise: this is a mute, not a routing branch. Off means the node doesn't run and its output doesn't exist. Downstream nodes with an optional input read nothing and fall back gracefully - the documented behaviour for optional inputs, and the same mechanism behind first-non-null switches elsewhere in the ecosystem. Downstream nodes with a required input just fail to validate. Soft failure one side, hard failure the other.

Inputs and output

  • image (IMAGE, required) - the wire you want to gate. Keep it a side tap.
  • enable (BOOLEAN, default true) - the switch. Off = muted, so downstream optional sockets see no feed.
  • Out: image - identical to what came in.

Set enable and nothing else. There's no strength, no passthrough mode, no interpolation.

Install

ComfyUI Manager → ComfyUI LC123 Nodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes
# restart ComfyUI, then hard-refresh the browser

No extra pip packages - the repo has no requirements.txt and relies on ComfyUI's own torch/numpy environment. Depth Anything, SAM and remBG, which other nodes in this pack want, are separate installs and irrelevant here. The hard refresh is not optional: the switch is JavaScript, and a stale cached lc_pass.js means the widget toggles while the node keeps running.

If __init__.py isn't sitting directly inside ComfyUI/custom_nodes/ComfyUI_LC123_nodes/, nothing loads - the pack prints a warning about a nested folder, which is what happens when you unzip a zip into an existing clone.

Where people get burned

You put it inline on the main series. The README says it plainly - side wire only, don't put the main IMAGE series through it. Mute the Pass and you've muted everything downstream of it in one click, which usually looks like "my workflow stopped producing images" rather than "I flipped a switch". If the node genuinely needs to sit in the main line, use bypass (mode 4) via an LC Bypasser instead of turning this off.

You expected the enable field to be routable. It's a widget, and the JS reads the widget's value; converting it to an input socket and driving it from a boolean upstream doesn't reliably flip the mute. Treat the widget as the switch, and use LC Bypass Relay when you want one control for many nodes.

You forgot what "no feed" means. Off + optional downstream input = grey, full-frame fallback, silently. Off + required downstream input = a validation error listing a missing input. Both are correct behaviour; only one is obvious.

One cosmetic note: it paints itself dark olive on first drop, and your own node colours stick afterwards. Not a bug.

CategoryLC123/image

Inputs (2)

NameTypeDefaultDescription
imageIMAGE
enableoptBOOLEANtrue

Outputs (1)

NameTypeDescription
imageIMAGE