ComfyUI Node

SetNode Rack

One Node Instead of Twelve Setters

By SparknightLLC·Created 21 days ago·Updated 21 days ago· 0
SetNode Rack
  • value_0

    If you have ever copied a prompt, a seed, a width and a checkpoint name into fifteen separate Set nodes so that the other half of the graph could read them, this is the node that stops the bleeding. SetNode Rack publishes several named variables from a single node - one row per variable, up to 99 rows.

    Why racks exist at all

    Stock ComfyUI still has no first-party Set/Get. The convention comes from KJNodes, where a Set node names a value and any Get node in scope can pull it back without a wire - the standard answer to "this value feeds five places," which is one of the two problems ComfyUI's whole plumbing layer exists to fight (the other being a graph too large to read).

    The catch is that Set nodes are cheap to add and expensive to live with. The editor's work - drawing, hit-testing, change tracking, serialising, undo snapshots - scales with node count, and a column of twelve setters is twelve title bars and twelve bodies. SetNode Rack spends one title bar for the whole group and one line per variable, and resolves exactly like Set node names, so every existing Get node keeps working untouched.

    How it works

    Each row is a wildcard input socket (*, so it takes an IMAGE, a MODEL, an INT, whatever), and the row's variable name comes from the output feeding it. Wire the positive conditioning from a text encode in and the row names itself after that output; rename the output later and the variable follows. Where an output has no authored name - a plain node's IMAGE slot, say - the row falls back to its own editable field, which is exactly how you publish something like UPLOADED_IMAGE off a Load Image.

    The pair is frontend-only in the same way KJNodes' own Set/Get are. nodes.py ships real Python stubs - this pack is written against the newer comfy_api.latest schema API, so there's no NODE_CLASS_MAPPINGS dictionary to find - purely so the node type is a real node type for the node library and workflow validation. The behaviour lives in the bundled JS extension, which hooks KJNodes' GetNode lookup: rack rows resolve first, every other lookup delegates to KJNodes unchanged, and a failure logs a warning and falls through.

    The inputs and outputs that matter

    There is only one, and that's the point:

    • value_0 (type *, optional) - the author's own tooltip: "Row value. The row's variable name comes from this row's stream." That's the socket you wire your value into.
    • No outputs. It publishes, it doesn't return.

    Rows past the first aren't typed in a form - you make them on the canvas by dragging a value onto the node body, or right-click → Add row. Right-click → Remove unused rows tidies the spares. Every row renders as optional, so an unwired row never invalidates the graph, and the blank trailing row you always see is UI-only; it isn't saved into the workflow.

    Install

    Manager first: search ComfyUI-GetSetRacks. Or by hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/SparknightLLC/ComfyUI-GetSetRacks
    # restart ComfyUI, then hard-refresh the browser tab (Ctrl+Shift+R)
    

    No pip installs, no requirements.txt, no model downloads - pyproject.toml declares zero dependencies - but it does need ComfyUI-KJNodes for the Get side of the convention. Without KJNodes the racks still render and a getter rack still resolves its own rows; the extension just logs a warning on load.

    Where people get burned

    Two setters publishing one name in one scope is ambiguous. Racks resolve like Set names, which means migrating means replacing your old Set nodes, not layering racks on top of them.

    Typing a name over a row makes it yours. That's the escape hatch when you don't want a rename upstream to ripple through the graph - but it also means the row stops following the output it's fed by, so use it deliberately.

    A row fed by a subgraph output can't hold its own name, and two rows reading one output can't publish two different names. Both cases want the pack's sibling node, SetNode Rack (Editable), instead.

    Racks can't see up from a sibling subgraph. Scope is the current graph plus its ancestors, downwards only - the same rule KJNodes uses. This trips people who expect a subgraph to share with its neighbour.

    Frontend-only nodes live and die with the frontend. In January 2026 a ComfyUI frontend update knocked KJNodes' own Set/Get out of the search list, with loaded workflows throwing frontend_only errors, until both sides patched. If racks vanish after an update, update KJNodes first, then check the browser console - a [GetSetRacks] getInputLink lookup failed warning means resolution is falling through to KJNodes, not that your graph is corrupted.

    One honest word on the trade: this is still indirection, and hiding a wire that has exactly one consumer behind a rack is a worse deal than running the wire. Reach for racks where a panel reads many values that already exist in scope, and leave single-consumer values on explicit links.

    CategorySparknight/variables

    Inputs (1)

    NameTypeDefaultDescription
    value_0opt*Row value. The row's variable name comes from this row's stream.

    Outputs (0)

    No outputs