Nodes/ComfyUI-TextJoinZveroboy/Text Join (Zveroboy)
ComfyUI Node

Text Join (Zveroboy)

The ComfyUI Node That Glues Your Prompt Pieces Together (and Grows Ports as You Work)

By thezveroboy·Created 7 months ago·Updated 6 months ago· 0
Text Join (Zveroboy)
    • text
    separator
    text_1
    text_2

    Text Join (Zveroboy) is a glue node, not a generator. You drag it into a workflow when you have two or more strings - prompt segments, quality tags, LoRA trigger words, a negative-prompt block you reuse across models - and you want them mashed into one string before they hit a CLIP Text Encode. ComfyUI is a data-flow graph, which means prompts are assembled from parts, and someone has to do the joining. Vanilla ComfyUI mostly punts on that; this little node does it without drama.

    The author (thezveroboy) is an active r/comfyui node maker whose bigger packs get real traction; this one is a quiet utility, and it's fine. It has exactly one job and does it cleanly.

    How it works

    Two halves. On the backend, the node takes separator plus a grab-bag of optional text_1, text_2, and any dynamically-created text_n inputs, filters out every value that's None, empty, or whitespace, and returns them joined by the separator. Order is by the number after text_, so text_3 always lands after text_2 no matter where you parked the wire on the canvas.

    The clever bit is in the frontend. A tiny JS extension watches the node: the moment every existing text port is connected, it silently adds the next one (text_3, then text_4, and so on). So you never have to hunt through node settings for "how many inputs" - you just keep connecting and the node keeps growing. To make that work, the backend uses a dict that claims every key exists, so ComfyUI's validator never throws an "unknown input" error at you. Slick.

    One detail that bites people: text_1 and text_2 are forceInput STRING ports, meaning they're connect-only - you can't type into them. Feed them from a text node or any STRING output. The separator widget, though, is where you type. Put a comma-space, a newline, or nothing at all there.

    The inputs and outputs that matter

    • separator - the string inserted between parts (default: empty). If you want tag1, tag2, tag3, this is your , .
    • text_1, text_2, text_n… - the parts. Empty or unconnected slots are silently skipped.
    • Output text - one STRING, the joined result. Wire it into CLIP Text Encode, a Show Text node, or anywhere else that eats a string.

    There are no hidden dependencies, no model files, no API keys. The whole thing is standard Python plus that one JS file.

    How to install

    Easiest is ComfyUI Manager: search for TextJoinZveroboy (or the pack title, ComfyUI-TextJoinZveroboy) and hit install, then restart. The old-school way works too:

    cd ComfyUI/custom_nodes
    git clone https://github.com/thezveroboy/ComfyUI-TextJoinZveroboy
    

    Restart ComfyUI and the node appears under Zveroboy → Text in the node menu. There's no requirements.txt in the repo, so nothing extra to pip-install and nothing to download - it's about as frictionless as a custom node gets.

    Common issues

    • The dynamic ports don't appear. That auto-add behavior lives in the browser-side JS, not the Python. If you've updated the pack, hard-refresh the ComfyUI tab (Ctrl/Cmd+Shift+R) so the new JS actually loads - a stale cache is the usual culprit.
    • "Where did my text_5 go?" If you load a workflow that saved extra ports but the JS isn't running, you may only see text_1/text_2. Reconnect and the ports grow back; the values are computed fresh on every run anyway.
    • Empty slots change your output silently. Since blank inputs are skipped, disconnecting one text source just drops it from the result with no error - great for toggling prompt parts, confusing if you expected a blank line. If you want an explicit separator between segments, type it in separator; it only appears between non-empty parts, so you never get stray leading commas.

    That's the whole thing. It won't win awards and it doesn't need to - it's the node you reach for when your prompt is spread across five text boxes and you're tired of retyping the join by hand.

    Categoryzveroboy/Text

    Inputs (3)

    NameTypeDefaultDescription
    separatorSTRING
    text_1optSTRING
    text_2optSTRING

    Outputs (1)

    NameTypeDescription
    textSTRING