Prompt Composer
The Prompt Composer turns a messy chain of prompt nodes into one organized panel
- STRING
If your workflow looks like four Prompt nodes in a row - one for character, one for outfit, one for background, one for quality tags - the Prompt Composer is the node that collapses all of that into a single panel. It's part of the EreNodes pack, and it does exactly what its name promises: several tag clouds live in one node as reorderable, collapsible categories, and the whole thing outputs one clean prompt string. Same tags, same output, a third of the canvas clutter.
This is more than tidiness. Keeping your prompt organized in blocks - character, scene, style, quality - is a genuinely good prompting habit, and it matters differently depending on your checkpoint. On SDXL-lineage models (Illustrious, NoobAI, Pony) tag order and grouping change what gets emphasized; on newer LLM-encoded models your prompt is read like a message where the first block sets the scene. Either way, having the blocks sitting next to each other in one node makes it trivially easy to swap a category in or out and see what changes.
How it works
Each category is a row, and each row is basically a mini tag-cloud node wearing a trench coat. Rows store their tags as JSON in the node's properties, the frontend renders them as draggable tag pills, and when the graph runs, the Python side collects every active row, sorts them by position, and joins them with your separator. Empty rows are dropped, so a blank category costs you nothing. The result comes out of the single STRING output, which you wire straight into a CLIP Text Encode (positive) - or into a wildcard/lora-tag loader if you're fancy.
The one quirk worth knowing: the Composer's inputs are almost all transport plumbing. text is a mirror of the frontend's join and only stands in if no category rows arrive at all; prefix prepends something to the whole prompt; and separator (default ,\n\n) is how categories get joined. The separator isn't meant to be edited on the widget - the frontend hides it and the real control lives in the node's Properties panel. So if you want your categories joined with a blank line instead of a comma, that's where you look.
What a beginner actually sets
Forget the inputs for a minute and just use the UI:
- Add a category with the
+button; click the header to rename it, and the switch on the right to bypass the whole row without deleting a single tag. - Drag rows by their header to reorder categories. Drag pills between categories, or even into other EreNodes prompt nodes.
- Click a header to collapse a category you're not editing - the layout saves with the workflow.
The layout, the toggle states, everything persists in the workflow file, which is the whole point: switch off the outfit row, generate, switch it back on, and exactly what was there comes back.
Installing it
It's in ComfyUI Manager - search "EreNodes" and install. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/Erehr/ComfyUI-EreNodes.git
Restart ComfyUI and the nodes appear under the EreNodes category. One thing in this pack's favor: it has effectively zero dependencies. There's no requirements.txt at all - the one dependency declared (safetensors) already ships with ComfyUI. Given how much of the custom-node ecosystem's pain is dependency conflicts (the KB's ecosystem essay calls it out at length), a prompt pack that installs cleanly and is already Nodes 2.0-ready is a nice change of pace.
Common gotchas
- You're editing the separator in the wrong place. It's not a normal input widget - find it in the node's Properties panel.
- Text you type into the
textinput can get overridden if rows are present, since the rows are the real content. Type into categories, not the bare text field. - After installing, restart ComfyUI - like most custom node packs, the nodes won't show up until you do.
The Prompt Composer is the node I'd reach for when a workflow's prompt chain is getting long enough that I can't tell which box does what at a glance. It won't write better tags for you, but it makes organizing the ones you have almost fun.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | — | |
| prefixopt | STRING | — | |
| separatoropt | STRING | ,\n\n | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |