Nodes/EasyUI/Mirror node [Do not add manually!]
ComfyUI Node

Mirror node [Do not add manually!]

The mirror node that copies any node's controls — and why you can't add it manually

By GroxicTinch·Created about a year ago·Updated about a year ago· 5
Mirror node [Do not add manually!]

      You don't add this node. It adds itself.

      UINode (display name "Mirror node [Do not add manually!]") is the one node in the EasyUI pack, and it does something no other node in the ecosystem really does: right-click any node that has widgets - a KSampler, a checkpoint loader, a LoRA stack - pick 🖼️ EasyUI – Create Mirror Copy, and ComfyUI drops a second, cleaner copy of just those controls onto the canvas. Twist a slider on the copy and the original moves in lockstep. Change the original and the mirror follows. It's a remote control for a node, parked wherever you want it.

      The author's pitch is aimed squarely at the Get/Set workflow. Get and Set nodes (the WAS Node Suite-style pattern, and the thing rgthree popularized for keeping big graphs tidy) work, but they cut the path between the input and the thing that consumes it, and they force you to bury the Get node in a group to hide it. EasyUI's answer: don't move the data, move the controls. The real node stays exactly where its wires need it; the mirror is just a face for it.

      How it works

      Here's the part worth knowing: the Python class is a shell. Its INPUT_TYPES are empty, RETURN_TYPES is empty, and return_empty() returns nothing - there are no inputs, no outputs, no data flow at all. All the magic lives in web/comfyui/easyui.js, a frontend extension. When you create a mirror, it:

      • records the original node's ID in the mirror's properties (original_node_id),
      • clones each widget's type, value, and options into the mirror,
      • rewires the original widget's callback so every change broadcasts to the mirror (and vice versa), with an isSyncing flag so the two sides don't ping-pong into an infinite loop.

      Widget order, hidden state, and the link back to the original are all stored in node properties, so they serialize into your workflow JSON and survive a save/reload.

      Because it's a mirror of a widget set and not a data node, it only appears through the right-click menu - the code marks it skip_list, which hides it from the node picker. Force-add one manually and it renders as a warning "Orphan UINode" box telling you not to do that.

      What you actually get

      No ports to wire, so the whole feature set is in the 🖼️ EasyUI right-click submenu on the mirror:

      • Move widget up / down - put the settings you tweak every run at the top, bury the ones you never touch.
      • Toggle widget visibility - collapse the noise (batch size, seed, whatever) into the original node and keep the mirror down to the three sliders you care about.
      • Jump to original node - pans the canvas over to the real node. Handy once your graph is big enough to need mirrors at all.

      Install

      No dependencies, no models, no requirements.txt - this is pure frontend. Via ComfyUI Manager, search EasyUI, or:

      cd ComfyUI/custom_nodes
      git clone https://github.com/GroxicTinch/EasyUI-ComfyUI
      

      then restart ComfyUI. One real trap: the name "EasyUI" is not unique. Manager will also surface kigy1/EasyUI, a completely unrelated, far more popular project (a whole web frontend for running workflows). Install the one by GroxicTinch - the repo URL is the safe way to tell them apart.

      The honest gotchas

      The author's own README lists the bugs, and they're real. This is an early, hobby-scale project (v1.0.x), so treat it as "nice when it works" rather than something to build a workflow around:

      • Widget order doesn't survive a page refresh - only a saved+reloaded workflow keeps your arrangement. It's the first bug listed, and the JS has the same FIXME.
      • Multi-line text can't be hidden, and other custom widgets aren't supported at all.
      • Preview-image and custom DOM widgets are shaky - there's partial customtext support in the code, but the author flags elements as not working.
      • Copy-pasting a mirror node gives you a semifunctioning mirror, per a code FIXME.
      • Delete the original node and the mirror orphans, flipping to a warning box.

      Honest verdict: if you live in monster workflows and hate how Get/Set breaks the visual path, this is a clever idea worth ten minutes of your time - just don't hinge your workflow on it until the author clears the refresh-order bug.

      CategoryEasyUI

      Inputs (0)

      No inputs

      Outputs (0)

      No outputs