RedNode Text Combine
Assembling prompts from parts with RedNode Text Combine
- text
RedNode Text Combine is the pack's plain string joiner, and its headline feature is in the description: it can assemble your text with no wires at all. You type pieces into rows, wire strings in when you have them, or subscribe to a named channel and every string posted to it shows up as a row automatically. Drag to reorder, switch a row off to drop it from the result, and the joined text comes out one socket.
That reads like a minor quality-of-life node, and for filenames and workflow text it mostly is. But there's a real generation workflow hiding behind it. With the current crop of models - Krea 2 and the rest of the LLM-encoded generation - the community's prompt practice has shifted from one giant comma-tag soup to structuring the prompt in blocks: subject, surroundings, lighting, style, each as its own piece you can vary independently. That's exactly what a combine node is for. Build each block once (a lighting block, a subject block, a style block), then join them in one place instead of maintaining a sprawling text box you have to rewrite every time something changes.
How it works
The node gives you up to 32 part_* inputs (part_1 through part_32), all strings, all wired. Between the pieces goes the separator - default is ", " (comma-space), and if you type \n as literal backslash-n you get a newline instead. A config JSON widget holds the row list - which parts exist, in what order, which are toggled off - and the panel edits it for you, same as the rest of this pack.
The wireless half is the channel system, and it's the same one the pack's Sender/Grabber prototypes use. Set channel to a name and every string published to that channel becomes a row here, no wire. Set channel_out to a name and this node's joined result goes out onto that channel, so anything else subscribed picks it up. The one trap: don't set them to the same name - the node would wait on itself forever, so it deliberately leaves the value out and says so in the console. Output is a single text socket.
The inputs that matter
For a beginner, honestly, just two:
separator- how pieces join. Comma-space suits tag-style prompts; a space or empty suits natural sentences.part_1,part_2, … - your pieces, either typed into the row or wired from other nodes.
The channel / channel_out pair is the power feature - skip it until you're comfortable, then it's what lets you drive prompts from one place without a canvas full of wires.
For prompts specifically, use the other node
This is the pack's plain joiner. If you're assembling CLIP text, the sibling RedNode Prompt Combine adds a "final prompt" flag that marks the finished string as the real prompt for the rest of the workflow. Grab that one for prompt duty. Text Combine is the unglamorous version for everything else - filenames, JSON you're building, text you're handing to a node that isn't prompt-flavored.
Installing it
Same pack as everything else here - RedNode Studio, 52 nodes, zero pip dependencies. ComfyUI Manager → search "RedNode Studio", or:
cd ComfyUI/custom_nodes
git clone https://github.com/RedNodeAI/ComfyUI-RedNodeStudio.git
Restart, and it's under the RedNode category. Python 3.10+; no model downloads for this one (the Krea 2 nodes in the pack have their own requirements, but the prompt tools don't). License is PolyForm Noncommercial - free for personal/hobby use, commercial needs permission.
Common issues
The only real failure mode is the channel self-wait described above - if your text output mysteriously comes back empty and the console mentions a channel, you've wired channel and channel_out to the same name. Pick different names. Beyond that, remember the separator is literal: want a newline between blocks, type \n, don't paste an actual line break. And if a row isn't appearing in the output, check it isn't toggled off - off rows are deliberately left out, which is the feature you use when you want to A/B a block without deleting it.
Inputs (36)
| Name | Type | Default | Description |
|---|---|---|---|
| separator | STRING | , | placed between the pieces. Type \n for a newline. |
| channel | STRING | OPTIONAL. Name a channel and every string on it becomes a row here, with no wires. Leave it empty to use only the rows you add by hand. | |
| config | STRING | {} | — |
| channel_out | STRING | OPTIONAL. Put this node's joined text onto a channel, so anything subscribed to that name picks it up with no wire. Reading and sending the same channel would make this node wait on itself, so that value is left out and the console says so. | |
| part_1opt | STRING | — | |
| part_2opt | STRING | — | |
| part_3opt | STRING | — | |
| part_4opt | STRING | — | |
| part_5opt | STRING | — | |
| part_6opt | STRING | — | |
| part_7opt | STRING | — | |
| part_8opt | STRING | — | |
| part_9opt | STRING | — | |
| part_10opt | STRING | — | |
| part_11opt | STRING | — | |
| part_12opt | STRING | — | |
| part_13opt | STRING | — | |
| part_14opt | STRING | — | |
| part_15opt | STRING | — | |
| part_16opt | STRING | — | |
| part_17opt | STRING | — | |
| part_18opt | STRING | — | |
| part_19opt | STRING | — | |
| part_20opt | STRING | — | |
| part_21opt | STRING | — | |
| part_22opt | STRING | — | |
| part_23opt | STRING | — | |
| part_24opt | STRING | — | |
| part_25opt | STRING | — | |
| part_26opt | STRING | — | |
| part_27opt | STRING | — | |
| part_28opt | STRING | — | |
| part_29opt | STRING | — | |
| part_30opt | STRING | — | |
| part_31opt | STRING | — | |
| part_32opt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |