Prompto Snippet
The boring node that saves your best negative prompt
- text
The most valuable text in your ComfyUI install is probably a negative prompt you tuned over an evening and then lost. Not because it was clever - because it was local to a model, a LoRA stack and an aspect ratio, and you'll never reproduce it from memory.
Prompto Snippet is a one-job node: it hands you one saved piece of prompt text from your library, as a string.
What it is
ComfyUI-Prompto's smallest node, and the one I'd argue earns its place first. Snippets in the Prompto Chrome extension are organised by category - Lighting · Golden hour, Camera · Heroic low angle, Style · Analog film, Negative · Hands fix, Wildcards · Hair color - and each one can carry both tags and a prose version. The pack ships seven as samples so the thing works out of the box.
The pattern it's built for: stop keeping your lighting vocabulary inside a single 900-character positive prompt. Keep it in named blocks you can recombine.
How it works
snippet is the dropdown, labelled Category · Name. format picks which half of the snippet you get:
- tags - the tags, comma-joined.
- prose - the prose version, falling back to the joined tags if that snippet has no prose written.
roll then expands any {a|b} choices and __snippet__ references inside whatever came out, using the rest of your snippet library as the vocabulary. Same roll, same text; randomize the widget and you get a new phrasing every queue. Like the other roll widgets in this pack it starts on fixed, so a saved workflow keeps the version that made the image you liked.
Output is a single text STRING. That wires into a CLIP Text Encode's text input, any string primitive, or a Concatenate Text node if you're assembling a prompt from three snippets and a character.
That last pattern is the one worth adopting: Snippet → Concatenate Text → CLIP Text Encode. Stack a lighting snippet, a camera snippet and a style snippet on one line, and now your "look" is four dropdowns instead of a paragraph you're afraid to edit.
Why bother for one string
Because the negative side is where it pays off. The negative prompt is not a filter - it replaces the empty string in the CFG pass, so the sampler pushes away from your text instead of away from nothing. It's free above CFG 1 and does nothing at CFG 1, which is why distilled models don't want one. Everything about that argues for a small, specific, tested negative rather than forty inherited keywords: name the defect you can actually see.
A Negative · Hands fix snippet is exactly that shape, and it's the kind of thing you want identical across four workflows rather than retyped four times with a typo.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/EY4O/ComfyUI-Prompto.git
Restart ComfyUI. No Python dependencies beyond ComfyUI itself, no models, no config - the pack's pyproject.toml lists an empty dependency set. ComfyUI Manager → search Prompto works too.
The nodes appear under Prompto in the node menu. Your own snippets require the Prompto Chrome extension (currently unpublished - load it unpacked via chrome://extensions → Developer mode → Load unpacked), and after it syncs, press R in the ComfyUI tab so the dropdown rebuilds.
Where people get burned
Rename in Chrome, don't delete and recreate. A renamed snippet still resolves in workflows you saved under the old name, because the synced snapshot carries earlier labels. A deleted one doesn't - the node runs and then tells you Prompto has no snippet by that name, rather than refusing at validation time.
format: prose isn't a rewrite. It's the prose field if the snippet has one and the tags if it doesn't. If your snippets are tag-only, prose and tags give you the same string and that's not a bug.
It doesn't concatenate anything. One snippet, one output. Beginners reasonably expect the node to join several; it doesn't, and once you see the output is just a string you'll see why a Concatenate Text node is the better place for that.
The wildcards run here, not upstream. Braces coming out of a Prompto Character node pass through that node untouched. If a snippet's text contains {a|b}, this node's roll is what resolves it.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| snippet | COMBO | 7 options: Lighting · Golden hour, Lighting · Moody rim, Camera · Heroic low angle, Style · Painterly, Style · Analog film, Negative · Hands fix, +1 | |
| format | COMBO | 2 options: tags, prose | |
| roll | INT | 10–4294967295 | Seed for {a|b} and __snippet__ wildcards in the snippet |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |