Nodes/Steaked-nodes/Combo Lora Loader
ComfyUI Node

Combo Lora Loader

A LoRA stack you can actually read, save, and reuse

By StealthNinja1O1·Created 11 months ago·Updated about 11 hours ago· 0
Combo Lora Loader
  • model
  • clip
  • MODEL
  • CLIP
  • ACTIVATION_WORDS
◄lora_stack{}►

Once you've been at this a while, a workflow stops being one LoRA and becomes five: the character, the style, the lighting fix, the "please draw hands" patch. Stock ComfyUI's answer is chaining LoraLoader nodes until the graph looks like a snake, then remembering which weights you used last time.

Combo Lora Loader holds the whole stack in one node, gives it a real UI, and lets you save it as a named combo you can reuse anywhere later. Same idea as rgthree's Power Lora Loader, the incumbent most people already have - so the honest question isn't whether this works, but whether it's worth a second pack.

What it is

It's a LoRA loader with a DOM widget bolted on top. Underneath, it does the boring thing correctly: loops your stack and hands each entry to ComfyUI's own LoraLoader.load_lora(), one after another. Because it goes through core ComfyUI instead of reimplementing patching, a LoRA applied here behaves exactly like one applied by the stock node.

The UI is the pitch. Drag rows to reorder, scrub strength with the mouse (200px of drag = 1.0, Ctrl for fine control), ctrl/shift to multi-select, drop .safetensors files straight onto the node. Reordering is the part I care about - LoRA order genuinely changes output, and this makes experimenting with it cheap.

Then there's the trick nobody advertises: activation words. For every enabled LoRA the node reads trigger words from the .civitai.info sidecar, falling back to the safetensors training header (ss_tag_frequency, ss_output_name), then joins them into one string and exposes it as an output. That's the fix for the most common "my LoRA does nothing" report in the book - the trigger word was never in the prompt.

The inputs and outputs that matter

  • lora_stack - a required multiline STRING that the UI writes JSON into. You'll never type in it; the widget owns it. State is {active, free: [...], combo: {...}}, each entry {lora, on, strength, clip_strength}. Corrupt that JSON and the widget logs a warning and resets: nothing is permanently lost, but your stack is.
  • model and clip - both optional. Wire them from your checkpoint. Leave clip unwired and the model-side weights still apply while the text-encoder half has nothing to land on, so wire both.
  • Outputs: MODEL, CLIP, ACTIVATION_WORDS. Model and clip go to your sampler and prompt encoder as usual. ACTIVATION_WORDS is a comma-joined string - run it through SteakedTextConcat (or any concat) and into your positive prompt.

Since model is optional, the node also works as a standalone trigger-word source: leave model empty, build the stack, take only ACTIVATION_WORDS.

How to install

ComfyUI Manager → search Steaked-nodes → install. Or by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/StealthNinja1O1/Steaked-nodes.git

Restart ComfyUI. requirements.txt is just torch>=2.1.0, numpy, Pillow - already present in any working ComfyUI install, so nothing here can break your Python. No model downloads either; the LoRAs are yours.

Find it under Steaked-nodes as Combo Lora Loader. Its UI talks to REST routes the pack registers on the server (/steaked/library/loras, /steaked/lora/combos), which is why the restart matters even though the node looks like pure front-end.

Common issues

The node renders as a text box full of JSON. The widget didn't load - usually a stale browser cache. Hard-refresh the tab; if that fails, check the console for a JS error. Newer ComfyUI frontends have a mixed record with heavy custom widgets, so if other packs' UIs are also acting up on your build, that's the pattern, not this node.

"I edited the combo and the other node didn't change." Combos are shared documents, but the node holds a snapshot. When a combo you're using changes elsewhere, the tab shows a re-sync prompt - click it. Local edits stay local until you hit Save to combo. Deliberate, since you can tune weights without stomping the saved stack - and the number-one confusion with this node. Combos themselves live in one gitignored JSON file, Steaked-nodes/library/lora_combos.json, so git pull won't clobber them but nothing backs them up either.

A LoRA in your stack does nothing. Each entry resolves through ComfyUI's loras folder; a miss prints [SteakedLoraLoader] LoRA not found: to the console, and dropping a file only matches it if it's already in models/loras. Past that, the classic causes: wrong architecture (an Illustrious LoRA on Flux is a no-op), weight at 1.0 where 0.5–0.8 was meant, or a missing trigger word.

Activation words come out empty. No .civitai.info sidecar and no kohya metadata in the header - common with re-uploads and merges. Nothing to parse, nothing to show. Type the word in yourself; you're not doing anything wrong.

One caveat: solo-author pack, crowded niche. The combos are the reason to pick it - if you don't want shareable stacks, the loader you already have is fine.

CategorySteaked-nodes

Inputs (3)

NameTypeDefaultDescription
lora_stackSTRING{}—
modeloptMODEL—
clipoptCLIP—

Outputs (3)

NameTypeDescription
MODELMODEL—
CLIPCLIP—
ACTIVATION_WORDSSTRING—