Nodes/noEmbryo nodes/Embellishment /noEmbryo
ComfyUI Node

Embellishment /noEmbryo

A divider line for the one place you can't draw groups

By noembryo·Created 3 years ago·Updated a day ago· 46
Embellishment /noEmbryo
  • decorator

    You know the problem this solves the moment you look at a collapsed subgraph. Your whole sampler line - model, latent, steps, cfg, sampler, scheduler, seed - gets promoted up into one node body as a flat list of widgets, in whatever order you clicked them, and there is no way to section them. On the canvas you'd draw a Group or a note. Inside a node body you get nothing. So noEmbryo shipped a node that draws a horizontal line, or blank vertical space, and that's it.

    What it actually is

    Two pieces of furniture in one node. Set height_px to 0 and it draws a 1px divider line across the node body. Set it higher and it draws nothing but reserves that many pixels of empty space - a spacer, with a faint dashed bracket on the left so you can see where it starts and ends.

    That's the whole feature. It carries no data, has no outputs at all, and its Python function literally returns an empty tuple. OUTPUT_NODE = True just means ComfyUI runs it each queue and never complains; there's nothing in it to fail.

    This is the same family as reroutes, bookmarks and group muters: nodes that exist purely so a big graph stays readable. The usual complaint in these threads isn't about outputs, it's about not being able to see how information flows. A divider is the bluntest instrument in that toolbox, and here it's aimed at the one surface where the usual tools don't reach.

    How it works under the hood

    The class declares nothing required and exactly one optional input, decorator, of a made-up type called UI_SUB_DIVIDER. The pack ships a small JS extension that registers a custom widget for that type; the widget's draw() does the line or the spacer, and its computeSize() returns height 5 when height_px is 0 or your exact pixel height when it isn't.

    The two controls you see - color (a hex field plus a pick button that opens a colour wheel) and height_px (0–1000) - are injected by that same script, not declared in Python. They're marked serialize: false and their values are stashed in the node's properties instead, so they survive save and reload without ever being sent to the backend. Which means: if a divider comes back in the wrong colour after a reload, you're looking at a properties issue, and the values are sitting in the workflow JSON under __ui_divider_color and __ui_spacer_height.

    The input that matters

    Just one: decorator. Connect nothing to it. Instead, promote it - inside the subgraph editor, promote the decorator input up to the parent node - and the decoration is drawn inside the collapsed subgraph node, sitting between whichever promoted widgets you placed it near. If you skip the promotion step you'll see your divider fine while editing the subgraph and then wonder where it went when you collapse it.

    color only applies to dividers. Spacers ignore it; they're transparent by design.

    Installing it

    ComfyUI Manager, search the pack title "noEmbryo nodes", or do it by hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/noembryo/ComfyUI-noEmbryo.git
    

    Restart ComfyUI afterwards - the pack serves a JS file from WEB_DIRECTORY, so a server restart is what actually loads the widget. No requirements.txt, no model downloads, nothing pip-installed beyond what ComfyUI already has. It lands under Add Node → noEmbryo → Utils. noEmbryo's pack is a one-person grab bag (the author posts his own releases on r/comfyui as a hobbyist, and the README credits other people's nodes for the fancier ones), so expect pragmatic rather than polished.

    Where people get stuck

    The controls are attached by a script that only fires for the exact class name Embellishment -noEmbryo. If the node appears with no color and no height_px, the extension didn't load - hard-refresh the browser tab first, restart ComfyUI second.

    It is not a group. It doesn't collapse, mute, or contain anything, and clicking it does nothing. If what you actually want is "turn this whole chunk off", that's Groups on the canvas or rgthree's Fast Groups Muter.

    And if you send the workflow to someone who doesn't have the pack, the node arrives missing and the divider is simply gone. Nothing breaks, because there was never anything to break - which is also the fair criticism of this node. It's the reason to install a 15-node pack only if you were going to install it anyway.

    TL;DR

    A cosmetic line. Set height 0 for a divider, promote decorator into your subgraph and your collapsed node stops looking like an undifferentiated wall of widgets. No deps, no cost, no risk - just don't expect it to organise anything for you.

    CategorynoEmbryo/Utils

    Inputs (1)

    NameTypeDefaultDescription
    decoratoroptUI_SUB_DIVIDERSingle connection — acts as divider when height_px=0, as spacer when height_px>0

    Outputs (0)

    No outputs