ComfyUI Node

GetNode Rack

Read Twelve Variables Without Twelve Get Nodes

By SparknightLLC·Created 21 days ago·Updated 21 days ago· 0
GetNode Rack
    • get_0

    GetNode Rack is the read side of the pair: one node, several rows, each row picking a variable by name and outputting its value. If your workflow grew one Get node per variable - the column of lookups you inherit every time you download someone else's graph - this is the node that collapses it.

    Why you'd reach for it

    ComfyUI's Set/Get convention (from KJNodes; stock ComfyUI still has no first-party version) trades a visible wire for a name. That's the right trade when a value feeds many places, but the bookkeeping grows the wrong way: one consumer per node, each its own title bar, each another thing the editor has to draw, track and serialise. Editor cost scales with node count, not wire count, so a rack of getters buys back more than it looks like.

    It's also the fix for graphs you didn't write. Where a downloaded workflow has one Get per variable, a rack turns eight nodes into one without changing what the graph does.

    How it works

    A getter row's dropdown offers exactly what a Get node would offer from that spot: every Set node name and every setter-rack row visible in the current graph and its ancestors, sorted, with (parent) appended to names that live up in an ancestor graph. Each row is filtered by the type of the input its output feeds, the same filter KJNodes applies to its own chooser - a row wired into a MODEL input won't offer you INT variables. Turn off KJNodes → Filter Get node options and every name in scope shows up instead.

    Under the hood, the extension wraps KJNodes' GetNode.getInputLink and resolveVirtualOutput so rack rows resolve first and everything else falls through to KJNodes unchanged. Both hooks fail soft, with a console warning, which is why a resolution miss shows as a warning rather than a broken graph. nodes.py holds real stubs rather than the classic NODE_CLASS_MAPPINGS dictionary - the pack is written against the newer comfy_api.latest schema API - and the lookup itself lives in the bundled frontend JS.

    Inputs and outputs that matter

    There are no inputs to configure beyond the rows themselves.

    get_0 (type *) - "Row value. Pick the variable to read in the field beside it." This is what you wire into the node that needs the value. Rows continue as get_0 … get_98.

    Rows are added on the canvas by dragging onto the node body or right-click → Add row, and the rack always keeps one blank trailing row available. That spare is UI-only and is not written into the saved workflow; loading recreates it. Retiring a row (picking (unused), which is offered alongside real names) drops whatever that row fed and closes the rows below up, so every other consumer keeps reading its own variable.

    The conversion command worth knowing

    Select two or more Get nodes, then right-click one of the selected nodes → Convert N Get nodes to GetNode Rack - or right-click empty canvas space with that selection active. Both entries run the same command. The rack replaces the nodes in place: each Get's links move onto its row before the Get is removed, rows follow reading order, and the prompt the frontend builds is unchanged. Only the node count is.

    Use it on the panels that grew one Get per variable. A single Get is clearer left alone.

    Install

    Search ComfyUI-GetSetRacks in ComfyUI Manager, or:

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

    No Python dependencies and no model files - this pack declares none. Do install ComfyUI-KJNodes alongside it: a getter rack resolves rack-published names without KJNodes, but the whole point of the convention is Get nodes interoperating with it, and the extension logs a warning when KJNodes is absent.

    Where people get burned

    An empty-looking dropdown. Two usual causes. The variable lives in a sibling subgraph and racks can't see sideways - scope is the current graph plus its ancestors, downwards only, matching KJNodes. Or the type filter is hiding it: a row feeding an IMAGE input won't list a string variable. Turn off the KJNodes filter setting to check.

    Frontend-only nodes follow the frontend. These are real node types with frontend behaviour, exactly like KJNodes' Set/Get - and in January 2026 a ComfyUI frontend update knocked KJNodes' own Set/Get out of the search list, with saved workflows erroring out as frontend_only until things were patched. If racks disappear after an update, update KJNodes first and watch the browser console for [GetSetRacks] warnings.

    Don't feed a rack to the API by hand. The Python side is a stub that raises RuntimeError on execution by design, because a rack must never be executed - it's stripped from the prompt the frontend builds. If you hand-assemble an API-format prompt containing a rack and POST it, that error is what you'll get, and it isn't a real bug.

    Naming is the identity. A rack cannot publish two names from one output, and two setters publishing one name in one scope are ambiguous - so migrate by replacing old Set nodes rather than layering racks over them.

    CategorySparknight/variables

    Inputs (0)

    No inputs

    Outputs (1)

    NameTypeDescription
    get_0*Row value. Pick the variable to read in the field beside it.