ComfyUI Node

RedNode Grabber

Pull values out of a subgraph by name, with no wires through the boundary

By RedNodeAI·Created 26 days ago·Updated 15 days ago· 0
RedNode Grabber
    • value_1
    • value_2
    • value_3
    • value_4
    • value_5
    • value_6
    • value_7
    • value_8
    • value_9
    • value_10
    • value_11
    • value_12
    • value_13
    • value_14
    • value_15
    • value_16
    • value_17
    • value_18
    • value_19
    • value_20
    • value_21
    • value_22
    • value_23
    • value_24
    • value_25
    • value_26
    • value_27
    • value_28
    • value_29
    • value_30
    • value_31
    • value_32
    • value_33
    • value_34
    • value_35
    • value_36
    • value_37
    • value_38
    • value_39
    • value_40
    • value_41
    • value_42
    • value_43
    • value_44
    • value_45
    • value_46
    • value_47
    • value_48
    • value_49
    • value_50
    • value_51
    • value_52
    • value_53
    • value_54
    • value_55
    • value_56
    • value_57
    • value_58
    • value_59
    • value_60
    • value_61
    • value_62
    • value_63
    • value_64
    channel
    config{}

    Subgraphs are ComfyUI's way of keeping a big graph readable - but the moment you put nodes inside one, you face the boundary problem: how do values get out? RedNode Subgraph Receive is the reading end of the pack's answer. Name it a channel and it lists every value any RedNode Sender has put on that channel - with its type and where it came from - and gives each a socket you can wire out. Nothing is wired through the subgraph boundary by hand.

    The important thing about this pair is what the description says next: both ends are gone by the time the graph runs. They're replaced with ordinary links. There's no channel system running at execution time, no race, no ordering to get wrong - the Sender/Grabber pair is spliced into real wires just before the run, and ComfyUI's normal execution order takes over. That's the design that makes this different from every "wireless node" that stashes a value somewhere and hopes the ordering works out. Here there is no stashing at all.

    How it works

    You add a Grabber and set channel to a name. Everything any Sender has put on that channel is listed in the panel, and each listed value gets a value_1value_64 socket. Wire whichever you need out into the subgraph's logic. Since a channel is a group, several Senders can feed one channel and a single Grabber picks up all of them - that's the "one reader lists everything on a channel" pattern.

    A channel name is just a string (up to 64 chars, trimmed). The Sender's publish flag controls scope: off means the values stay within the subgraph they sit in, on means the channel is offered further out too. Off is the safe default - with it, two instances of one subgraph won't both claim the same name.

    The inputs and outputs

    • channel - the channel to read.
    • config - panel state; edited on the node.

    Outputs: value_1 through value_64 - one socket per value on the channel, any type, wired out as needed. The panel lists each with its type and origin so you know which socket is which.

    Installing it

    git clone https://github.com/RedNodeAI/ComfyUI-RedNodeStudio.git ComfyUI/custom_nodes/ComfyUI-RedNodeStudio
    

    Restart ComfyUI, or search RedNode Studio in ComfyUI Manager. No pip deps, no models. Python 3.10+.

    The honest notes

    The pack flags Sender/Grabber as a prototype, so treat it accordingly - the splice is plain data work and the concept is sound, but it's not battle-tested the way the Studio's core nodes are. Two practical rules: keep the channel name identical on both ends (it's exact-string matching, and a trailing space is a silent "why is this empty" bug), and remember a Grabber only sees what a Sender has put there - no sender, no sockets. If you're wiring something complex out of a subgraph, this is genuinely cleaner than a wall of Get/Set nodes; just keep the prototype status in mind for production workflows.

    CategoryRedNode/Channels

    Inputs (2)

    NameTypeDefaultDescription
    channelSTRINGthe channel to read. Everything any RedNode Sender puts on it is listed in the panel.
    configSTRING{}

    Outputs (64)

    NameTypeDescription
    value_1*
    value_2*
    value_3*
    value_4*
    value_5*
    value_6*
    value_7*
    value_8*
    value_9*
    value_10*
    value_11*
    value_12*
    value_13*
    value_14*
    value_15*
    value_16*
    value_17*
    value_18*
    value_19*
    value_20*
    value_21*
    value_22*
    value_23*
    value_24*
    value_25*
    value_26*
    value_27*
    value_28*
    value_29*
    value_30*
    value_31*
    value_32*
    value_33*
    value_34*
    value_35*
    value_36*
    value_37*
    value_38*
    value_39*
    value_40*
    value_41*
    value_42*
    value_43*
    value_44*
    value_45*
    value_46*
    value_47*
    value_48*
    value_49*
    value_50*
    value_51*
    value_52*
    value_53*
    value_54*
    value_55*
    value_56*
    value_57*
    value_58*
    value_59*
    value_60*
    value_61*
    value_62*
    value_63*
    value_64*