LoRA Stack Container
Five LoRA slots that never touch your model
- lora_stack
- lora_stack
- trigger_words_1
- trigger_words_2
- trigger_words_3
- trigger_words_4
- trigger_words_5
The name is accurate and slightly misleading at once. "LoRA Stack Container" holds five LoRAs and loads none of them: no MODEL input, no CLIP input, nothing generated. It's a settings box that outputs a list - plus something core ComfyUI doesn't give you, a trigger-word string per slot.
That's the pitch. Stacking LoRAs is normal here - style plus character plus concept - and the usual way is chaining four LoraLoader nodes until the graph looks like a ladder. rgthree's Power Lora Loader is what most people reach for instead: one node, per-entry toggles, right-click for trigger words. This pack is a from-scratch, dependency-free take on the same job; the container is the half that manages what you load.
What the five slots do
Every slot has four widgets, repeated five times:
slotN_enabled- a boolean. Slot 1 is on by default, slots 2–5 are off.slotN_lora_name- the dropdown, populated from yourmodels/lorasfolder withNoneat the top.slotN_strength_modelandslotN_strength_clip- floats, default 1.0, range -10 to 10, step 0.01.
A slot contributes to the output stack only if it's enabled, has a real LoRA picked, and at least one of the two strengths is non-zero - switch slot 4 on, leave both strengths at 0.0, and it silently contributes nothing.
The negative end is the useful part. When two LoRAs overlap and one is stomping the other, running the second at -0.4 pulls the shared behaviour back without dropping it entirely.
Inputs, outputs, and where they go
There's one optional input, lora_stack: wire another container into it to go past five LoRAs. Chain order is application order - whatever arrives through lora_stack is merged before the local slots.
Outputs are lora_stack plus trigger_words_1 through trigger_words_5, one string per slot. The stack goes into Load LoRA (StackInput); the trigger strings go into Trigger Filter or straight into your prompt.
The trigger words tap, and the catch
The strings aren't guessed from the filename. At execution time the node reads the LoRA's safetensors header, pulls ss_tag_frequency, sums the counts across every dataset bucket, and returns the top 200 tags by training-image count as a comma-separated string - the same list the pack's info popup shows. No tag-frequency data? It falls back to explicit trained-word fields, then to a Civitai lookup keyed on the file's SHA256.
Here's the opinion: top-200 tag frequency is not a trigger word. On a kohya-trained anime LoRA it's mostly the generic vocabulary every LoRA shares - 1girl, solo, long hair - with the actual token somewhere near the top. Treat trigger_words_N as a hint to read, not a block to paste. Five of them raw into a positive prompt is how you end up with hundreds of duplicated tokens and a slightly worse image than before.
Two practical notes: the first time a LoRA with no tag-frequency data runs, the node hashes the entire file and calls civitai.com (8-second timeout - air-gapped boxes stall per LoRA, once), then caches a .civitai.info file next to your LoRA and answers instantly after that. And trigger words get collected for any slot with a LoRA selected - including slots you've switched off.
Install
ComfyUI Manager → search for Lora Stack Pack (or ComfyUI_lora_stack_pack), install, restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/makszlak/ComfyUI_lora_stack_pack
No requirements.txt and no pip dependencies at all - pyproject.toml declares an empty dependency list and the node code imports only comfy.* and folder_paths. Nothing to download; the nodes land under loaders/lora_stack.
Where people get burned
The fancy per-slot UI probably isn't loading. The pack ships lora_stack_pack.js at the repo root and its __init__.py points WEB_DIRECTORY at a web folder that doesn't exist in the repo. So the ⚙ "Slot N Info" buttons from the README screenshots have nothing to run. The nodes work fine without them - you just don't get the info popups. If you want them:
cd ComfyUI/custom_nodes/ComfyUI_lora_stack_pack
mkdir -p web/js && cp lora_stack_pack.js web/js/
Then restart ComfyUI and hard-refresh the browser - the script's own import path expects to be served from js/, so the copy has to go there, not in web/ directly.
Reordering means moving slots. Order changes results, and the long-standing advice when a stack goes black or NaN is larger LoRAs first - here that means moving a LoRA to a different slot.
New LoRAs need a refresh - same as the core loader: drop the file in models/loras, hit Refresh, and the dropdown lists it.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| slot1_enabled | BOOLEAN | true | — |
| slot1_lora_name | COMBO | 1 options: None | |
| slot1_strength_model | FLOAT | 1.00-10–10 | — |
| slot1_strength_clip | FLOAT | 1.00-10–10 | — |
| slot2_enabled | BOOLEAN | false | — |
| slot2_lora_name | COMBO | 1 options: None | |
| slot2_strength_model | FLOAT | 1.00-10–10 | — |
| slot2_strength_clip | FLOAT | 1.00-10–10 | — |
| slot3_enabled | BOOLEAN | false | — |
| slot3_lora_name | COMBO | 1 options: None | |
| slot3_strength_model | FLOAT | 1.00-10–10 | — |
| slot3_strength_clip | FLOAT | 1.00-10–10 | — |
| slot4_enabled | BOOLEAN | false | — |
| slot4_lora_name | COMBO | 1 options: None | |
| slot4_strength_model | FLOAT | 1.00-10–10 | — |
| slot4_strength_clip | FLOAT | 1.00-10–10 | — |
| slot5_enabled | BOOLEAN | false | — |
| slot5_lora_name | COMBO | 1 options: None | |
| slot5_strength_model | FLOAT | 1.00-10–10 | — |
| slot5_strength_clip | FLOAT | 1.00-10–10 | — |
| lora_stackopt | LORA_STACK | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| lora_stack | LORA_STACK | — |
| trigger_words_1 | LORA_TRIGGER_WORDS | — |
| trigger_words_2 | LORA_TRIGGER_WORDS | — |
| trigger_words_3 | LORA_TRIGGER_WORDS | — |
| trigger_words_4 | LORA_TRIGGER_WORDS | — |
| trigger_words_5 | LORA_TRIGGER_WORDS | — |