Nodes/Visual Suite (Studio Leiel)/Visual Prompt Composer (Studio Leiel)
ComfyUI Node

Visual Prompt Composer (Studio Leiel)

Your prompt is a wall of text — this node gives it landmarks

By StudioLeiel·Created a day ago·Updated about 22 hours ago· 0
Visual Prompt Composer (Studio Leiel)
    • all prompt
    • labeled prompt
    • out_1
    • out_2
    • out_3
    • out_4
    • out_5
    • out_6
    • out_7
    • out_8
    layout_json
    prompt_separatorblank_line
    labeled_stylebanner
    skip_emptytrue
    ext_1
    ext_2
    ext_3
    ext_4
    ext_5
    ext_6
    ext_7
    ext_8
    find_text
    replace_text

    A long prompt is a record of decisions that all look alike once it's saved. Subject, lighting, film stock, that clause you added last month and never checked again - the moment it becomes one flat string, finding the part you meant to change means rereading all fourteen thousand characters. That rereading is where your time goes, and it's the whole problem this node exists to solve.

    Visual Prompt Composer holds your prompt as up to eight named sections, each in its own box, each with its own bypass toggle, colour, notes and character count. It replaces the classic chain of a text box per part, a concatenate node per join, and a preview node to see the result. Reorder a section and the wiring doesn't move with it; bypass one with a click instead of deleting and re-pasting. This matters more on 2026's LLM-encoded models than it did on SD 1.5 - block structure in a prompt is genuinely load-bearing there, and this is a way to keep that structure visible instead of hoping you remember it.

    The design trick that makes it free to annotate: none of the styling reaches the model. The marks are metadata kept beside the text, and what leaves the node is plain text. Bold, colour, highlight, notes to your future self - all cost nothing at generation time.

    How it works

    The whole layout - titles, text, on/off, box heights, slot numbers - lives in a single hidden STRING widget (layout_json) that travels with the workflow like any other widget value. The frontend owns the editing; the Python side only assembles the final strings. It's deliberately built to never throw, because a prompt node that errors out stops a render before it starts.

    The inputs a beginner actually touches are three: prompt_separator (how sections join - blank line, newline, space or comma), labeled_style (how the labelled output formats each section's name, from banner down to slash), and skip_empty (whether an empty section still contributes a separator). The rest are the wires: ext_1 through ext_8 let another node feed or override any section's text, and find_text / replace_text drive a search-and-replace from elsewhere in the graph - handy when you want one node swapping a character across every workflow.

    Outputs are all prompt (everything joined), labeled prompt (the same with each section named), and out_1 through out_8, one per section. The per-section outputs are bound to a section's stable slot number, not its position, so deleting or reordering a section can't silently rewire your links. That's also how the "two sections called Positive and Negative, each wired to its own encoder" trick works.

    Presets and snapshots are saved to ComfyUI's user/ directory, so updating the pack never eats them - a nicer answer than the packs that keep them in browser storage and lose them to a cache clear.

    Install

    This ships in Visual Suite (Studio Leiel). In ComfyUI Manager, search that name, or clone it in:

    cd ComfyUI/custom_nodes
    git clone https://github.com/StudioLeiel/comfyui-visual-suite
    

    Restart ComfyUI. No extra dependencies and no model downloads - it's pure graph plumbing.

    Common issues

    • My notes disappeared? They live in the workflow JSON and in the preset files under user/ - a new browser session should still see them, since nothing is in localStorage.
    • A section shows nothing in the output. Check its bypass (B) is off and that skip_empty isn't eating it - and remember a connected ext_n input overrides whatever you typed, by design.
    • Translation pane: it runs in the browser, is never saved and never touches the model. It's there to be read, not to change anything - don't expect it to survive a reload.

    For the one thing most prompt tools get wrong - keeping the part you're changing findable without forcing you to reread everything - this earns its place in the graph.

    CategoryStudio Leiel

    Inputs (14)

    NameTypeDefaultDescription
    layout_jsonSTRING
    prompt_separatorCOMBOblank_line4 options: blank_line, newline, space, comma
    labeled_styleCOMBObanner7 options: banner, rule, bracket, title_block, upper_block, title_inline, +1
    skip_emptyBOOLEANtrue
    ext_1optSTRING
    ext_2optSTRING
    ext_3optSTRING
    ext_4optSTRING
    ext_5optSTRING
    ext_6optSTRING
    ext_7optSTRING
    ext_8optSTRING
    find_textoptSTRING
    replace_textoptSTRING

    Outputs (10)

    NameTypeDescription
    all promptSTRING
    labeled promptSTRING
    out_1STRING
    out_2STRING
    out_3STRING
    out_4STRING
    out_5STRING
    out_6STRING
    out_7STRING
    out_8STRING