Skipper EmbeddingStack
Three embedding slots that write the syntax for you
- textOut
If you still run SD 1.5 or SDXL-lineage checkpoints, you've been there: you want easynegative, bad-hands-5 and one more in your negative prompt, and every time you retype (embedding:bad-hands-5:0.8) you drop a colon or misspell the filename. Skipper EmbeddingStack is the "stop typing it by hand" answer. It gives you three toggleable slots, each holding an embedding from your folder plus a weight, and it assembles the whole prompt fragment for you.
It's a text node, not a loader. There's no model inside - the pack is pure string manipulation with zero dependencies. The dropdowns are populated live from your ComfyUI/models/embeddings folder (folder_paths.get_filename_list("embeddings")), so anything you drop in there appears by filename without the extension.
The three slots, and what each field does
Each of the three rows is independent, and all three fields matter:
- embedding_1/2/3 - the on/off toggle. A slot contributes nothing while it's off.
- file_1/2/3 - the embedding to use, picked from the dropdown.
Nonemeans unused, even if the toggle is on. - weight_1/2/3 - a float from -10 to 10, default 1.0. This is the
:0.8part of the syntax.
There's also an optional STRING text input - wire your prompt (or the output of another text node) into it and the fragment gets appended onto it. The single output, textOut, is a plain string you feed into a CLIPTextEncode's text input, or into whatever text-concat chain your workflow already has.
For each enabled slot with a real file, the node emits , (embedding:<file>:<weight>), and joins them onto the input. So a typical build comes out looking like my prompt, (embedding:easynegative:1.0), (embedding:bad-hands-5:0.8), . The stray commas and double spaces are cosmetic - ComfyUI's prompt parser shrugs at them.
Installing it
The README is two lines and asks for nothing. No requirements.txt, no model downloads, nothing to pip install - just the code.
cd ComfyUI/custom_nodes
git clone https://github.com/Xkipper/ComfyUI_SkipperNodes
Then restart ComfyUI. Or, easier, use ComfyUI Manager → Custom Nodes → search "Skipper" and hit install. Your embeddings themselves still live in ComfyUI/models/embeddings; the dropdown reads them on startup.
Where people get burned
The (embedding:name:weight) syntax is AUTOMATIC1111 heritage. ComfyUI's sd1_clip.py does parse the embedding: prefix and the weight on CLIP text encoders, so this works fine on SD 1.5, SDXL, Illustrious, Pony - the CLIP-era models. It does not work on 2026's LLM-encoded models (Flux 2, Z-Image, Anima, anything on a Qwen3 or Mistral encoder): an embedding is a vector at one specific encoder's dimensionality, so there's nothing for it to bind to. Worse, the failure is silent - ComfyUI just ignores the embedding and the filename floats by as plain text, which is why people report it "works" on models where it does nothing.
The sanity test is quick: rename the file to gibberish and regenerate on a fixed seed. If the image doesn't change, the embedding was never being applied.
And keep weights sane. The node lets you dial to ±10, but the useful range is roughly 0.5–1.5 - past ~1.3 you oversaturate and get distortion. There's a reason the defaults sit at 1.0.
Honest verdict: for SD 1.5/SDXL users who juggle a small fixed set of embeddings, this is a genuinely handy quality-of-life node - toggleable, no retyping. If you've moved to modern LLM-encoder models, the entire concept is inert and you can skip it.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| embedding_1 | BOOLEAN | false | — |
| file_1 | COMBO | 1 options: None | |
| weight_1 | FLOAT | 1.00-10–10 | — |
| embedding_2 | BOOLEAN | false | — |
| file_2 | COMBO | 1 options: None | |
| weight_2 | FLOAT | 1.00-10–10 | — |
| embedding_3 | BOOLEAN | false | — |
| file_3 | COMBO | 1 options: None | |
| weight_3 | FLOAT | 1.00-10–10 | — |
| STRINGopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| textOut | STRING | — |