ComfyUI Node

Join Prompt

The two-string glue that actually keeps your graph tidy

By jupo-ai·Created about a year ago·Updated 4 months ago· 2
Join Prompt
    • STRING
    text
    prev
    options

    Join Prompt takes two pieces of text and gives you back one. That's the whole job, and honestly that's the appeal - the author's one-line README (this is a Japanese pack with a delightfully minimal readme) translates to "it just joins text, it tidies your workflow a little." There are no models, no API keys, no hidden sampling logic. It's a string node, full stop.

    Why you'd actually reach for it

    Prompts in ComfyUI tend to accumulate as blocks: a fixed set of quality/style tags you reuse on every generation, then a per-image subject section you swap out. The community calls this block structure - tag block first, subject, then artist/style - and it's the single most useful organizing habit you can adopt for tag-based models (see the prompting notes in our knowledge base). Join Prompt is the plumbing for that habit. You wire a "global quality tokens" node into prev, type or drag your subject into text, and send the joined result into a CLIPTextEncode. Change the subject, the quality block stays. That's the tidiness the README is talking about.

    It's also handy as a cheap alternative to primitive-widget juggling when you want a value that's built from parts rather than typed once. It does nothing a hand-edited string couldn't, but hand-editing strings is how graphs rot.

    How it works

    Nothing clever under the hood. The node collects prev and text, silently drops any empty ones, and joins what's left with a delimiter. If prev is "masterpiece, best quality" and text is "a red fox in snow", you get one string out - exactly the concatenation order you'd expect, prev first.

    The subtle part is the options input. It's a hidden JSON string the node uses to carry two settings - delimiter and cleanup - and the web extension hides it from the node body. You change those settings by right-clicking the node and choosing Open Config Dialog (there's also a toolbox command). Nothing about it is in plain sight, so if you're hunting for a delimiter box and don't see one, that's where it went.

    The inputs that matter

    • text - your main input, a multiline STRING field. Type or paste your subject/prompt block here.
    • prev - optional; the prefix that gets joined before text. This is where your reusable quality/style tokens live.
    • delimiter and cleanup - hidden behind the config dialog, not on the node face.

    The single output is a plain STRING. Wire it into CLIPTextEncode's text input, or into another join node if you're chaining blocks. It is not a conditioning output - don't expect to plug it straight into a KSampler.

    Where people get burned

    The default delimiter is an empty string. That means "red" and "blue" joined together come out as redblue - no space, no comma, nothing. If your prev block doesn't already end with a separator, open the config dialog and set the delimiter to ", " (or "\n" for a newline, which the pack parses into a real line break). Honestly, the empty default is the pack's one footgun.

    The other gotcha is version-related: this node is written against ComfyUI's newer node API (comfy_api), so it needs a recent ComfyUI - roughly the 2.x line. On an older install the node won't import and shows up red or missing. Update ComfyUI before you blame the pack.

    Installing it

    ComfyUI Manager is the easy path - search for comfy-join-prompt (this pack ships both nodes under it) and install. Or clone it manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/jupo-ai/comfy-join-prompt
    

    Then restart ComfyUI. There are no Python dependencies (the pyproject lists none) and no model files to fetch - it's a couple of short Python files plus some UI glue. If you want more than two inputs, the pack's other node, Join Strings, is the autogrow version of this same idea.

    Categoryjupo/JoinPrompt

    Inputs (3)

    NameTypeDefaultDescription
    textSTRING
    prevoptSTRING
    optionsoptSTRING

    Outputs (1)

    NameTypeDescription
    STRINGSTRING