LoRA Stack (Dynamic)
The node the LoRA Optimizer quick-start actually tells you to use
- lora_stack
- lora_stack
If you've read the LoRA Optimizer README, this is the node its own quick-start tells you to start with: "Add a LoRA Stack (Dynamic) node - pick your LoRAs, set strengths." It's the pack's main entry point - one node with up to 10 adjustable slots, instead of chaining ten separate LoRAStack nodes together by hand.
What it is and why you'd use it
The plain LoRAStack node holds exactly one LoRA per node; you chain several together for a multi-LoRA stack. LoRAStackDynamic collapses that into a single node with a slider for how many slots you want (1–10), each slot getting its own file picker, strength, and - if you flip on advanced mode - the same per-LoRA conflict controls the plain Stack node has. For anyone building a merge with three, five, or eight LoRAs, this is the one you actually drag onto the canvas.
How it works
Set lora_count to however many LoRAs you're stacking, then fill in each slot. settings_visibility switches between two views: simple shows one strength slider per LoRA (fast, and enough for most merges), advanced splits it into separate model/clip strength plus conflict_mode, key_filter, and preserve per slot - identical semantics to LoRAStack, just repeated across all ten. input_mode controls how you pick files: dropdown browses your LoRA folder normally, text lets you type a filename (or wire in a text node) - useful if you're generating LoRA names programmatically or working from a list.
The inputs and outputs that matter
Per slot (_1 through _10, whichever lora_count exposes):
enabled_N- toggle a slot off without deleting it, handy for quick A/B tests.lora_name_N(dropdown mode) orlora_name_text_N(text mode) - which file. Text mode accepts a short name, a full relative path, orNoneto skip the slot.strength_N(simple) ormodel_strength_N/clip_strength_N(advanced) - how hard it hits image generation vs. text understanding, separately if you need it.conflict_mode_N/key_filter_N/preserve_N(advanced only) - same options as LoRAStack: force this LoRA to dominate or defer in contested regions, filter which keys it contributes, or protect it as a style LoRA. See the LoRAStack article for the full breakdown of what each option does.
Optional: lora_stack to append even more LoRAs from another Stack node beyond the 10-slot cap, and base_model_filter to filter the dropdown by architecture - but that one only does anything if you also have ComfyUI-Lora-Manager installed; without it the option sits there inert.
Output is a single lora_stack - wire it straight into LoRA Optimizer, LoRA AutoTuner, LoRA Conflict Editor, or the Compatibility Analyzer.
How to install it
Via ComfyUI Manager: search "LoRA Optimizer", install, restart. Manually:
cd ComfyUI/custom_nodes/
git clone https://github.com/ethanfel/ComfyUI-LoRA-Optimizer.git
Restart - nodes appear under loaders. Nothing extra to download; it works on your existing LoRA files.
Common issues & troubleshooting
More than 10 LoRAs. lora_count caps at 10 per node. If you're genuinely stacking more than that (rare, but it happens with combo-testing workflows), chain a second LoRAStack or LoRAStackDynamic node into the lora_stack input rather than trying to force the slider past its max.
base_model_filter does nothing. This is a real dependency gap, not a bug: the filter only works with ComfyUI-Lora-Manager installed alongside this pack. Without it, leave it on All - it won't error, it just won't filter.
A stray enabled toggle is an easy miss. With ten slots' worth of enabled_N checkboxes on one node, it's easy to leave a slot on that you meant to disable for a test - the effect (a style you thought you removed still faintly bleeding through) can be subtle enough to miss on a quick look. Worth a second glance before you conclude the optimizer "isn't listening" to a change you made.
Advanced mode is a lot of widgets. If your canvas is getting cluttered with ten slots' worth of advanced fields, drop back to simple mode for the LoRAs where you're not overriding conflict behavior, and only expand advanced settings on the one or two LoRAs actually causing trouble.
Inputs (95)
| Name | Type | Default | Description |
|---|---|---|---|
| settings_visibility | COMBO | Simple: one strength slider per LoRA. Advanced: separate model/clip strength, conflict mode, and key filter per LoRA. | |
| input_mode | COMBO | dropdown | Dropdown: pick LoRAs from a list. Text: type LoRA names or connect text nodes (short names are auto-resolved). |
| lora_count | INT | 31–10 | How many LoRA slots to show. Increase to add more LoRAs. |
| enabled_1 | BOOLEAN | true | Enable or disable LoRA #1 without removing it from the list. |
| lora_name_1 | COMBO | LoRA #1 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_1 | STRING | None | LoRA #1 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_1 | FLOAT | 1.00-10–10 | How strongly LoRA #1 affects the output. 1.0 = full effect. |
| model_strength_1 | FLOAT | 1.00-10–10 | How strongly LoRA #1 affects image generation (visual style, composition). |
| clip_strength_1 | FLOAT | 1.00-10–10 | How strongly LoRA #1 affects text understanding (prompt interpretation). |
| conflict_mode_1 | COMBO | all | LoRA #1 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_1 | COMBO | all | LoRA #1 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_1 | BOOLEAN | false | Mark LoRA #1 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_2 | BOOLEAN | true | Enable or disable LoRA #2 without removing it from the list. |
| lora_name_2 | COMBO | LoRA #2 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_2 | STRING | None | LoRA #2 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_2 | FLOAT | 1.00-10–10 | How strongly LoRA #2 affects the output. 1.0 = full effect. |
| model_strength_2 | FLOAT | 1.00-10–10 | How strongly LoRA #2 affects image generation (visual style, composition). |
| clip_strength_2 | FLOAT | 1.00-10–10 | How strongly LoRA #2 affects text understanding (prompt interpretation). |
| conflict_mode_2 | COMBO | all | LoRA #2 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_2 | COMBO | all | LoRA #2 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_2 | BOOLEAN | false | Mark LoRA #2 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_3 | BOOLEAN | true | Enable or disable LoRA #3 without removing it from the list. |
| lora_name_3 | COMBO | LoRA #3 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_3 | STRING | None | LoRA #3 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_3 | FLOAT | 1.00-10–10 | How strongly LoRA #3 affects the output. 1.0 = full effect. |
| model_strength_3 | FLOAT | 1.00-10–10 | How strongly LoRA #3 affects image generation (visual style, composition). |
| clip_strength_3 | FLOAT | 1.00-10–10 | How strongly LoRA #3 affects text understanding (prompt interpretation). |
| conflict_mode_3 | COMBO | all | LoRA #3 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_3 | COMBO | all | LoRA #3 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_3 | BOOLEAN | false | Mark LoRA #3 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_4 | BOOLEAN | true | Enable or disable LoRA #4 without removing it from the list. |
| lora_name_4 | COMBO | LoRA #4 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_4 | STRING | None | LoRA #4 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_4 | FLOAT | 1.00-10–10 | How strongly LoRA #4 affects the output. 1.0 = full effect. |
| model_strength_4 | FLOAT | 1.00-10–10 | How strongly LoRA #4 affects image generation (visual style, composition). |
| clip_strength_4 | FLOAT | 1.00-10–10 | How strongly LoRA #4 affects text understanding (prompt interpretation). |
| conflict_mode_4 | COMBO | all | LoRA #4 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_4 | COMBO | all | LoRA #4 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_4 | BOOLEAN | false | Mark LoRA #4 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_5 | BOOLEAN | true | Enable or disable LoRA #5 without removing it from the list. |
| lora_name_5 | COMBO | LoRA #5 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_5 | STRING | None | LoRA #5 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_5 | FLOAT | 1.00-10–10 | How strongly LoRA #5 affects the output. 1.0 = full effect. |
| model_strength_5 | FLOAT | 1.00-10–10 | How strongly LoRA #5 affects image generation (visual style, composition). |
| clip_strength_5 | FLOAT | 1.00-10–10 | How strongly LoRA #5 affects text understanding (prompt interpretation). |
| conflict_mode_5 | COMBO | all | LoRA #5 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_5 | COMBO | all | LoRA #5 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_5 | BOOLEAN | false | Mark LoRA #5 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_6 | BOOLEAN | true | Enable or disable LoRA #6 without removing it from the list. |
| lora_name_6 | COMBO | LoRA #6 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_6 | STRING | None | LoRA #6 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_6 | FLOAT | 1.00-10–10 | How strongly LoRA #6 affects the output. 1.0 = full effect. |
| model_strength_6 | FLOAT | 1.00-10–10 | How strongly LoRA #6 affects image generation (visual style, composition). |
| clip_strength_6 | FLOAT | 1.00-10–10 | How strongly LoRA #6 affects text understanding (prompt interpretation). |
| conflict_mode_6 | COMBO | all | LoRA #6 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_6 | COMBO | all | LoRA #6 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_6 | BOOLEAN | false | Mark LoRA #6 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_7 | BOOLEAN | true | Enable or disable LoRA #7 without removing it from the list. |
| lora_name_7 | COMBO | LoRA #7 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_7 | STRING | None | LoRA #7 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_7 | FLOAT | 1.00-10–10 | How strongly LoRA #7 affects the output. 1.0 = full effect. |
| model_strength_7 | FLOAT | 1.00-10–10 | How strongly LoRA #7 affects image generation (visual style, composition). |
| clip_strength_7 | FLOAT | 1.00-10–10 | How strongly LoRA #7 affects text understanding (prompt interpretation). |
| conflict_mode_7 | COMBO | all | LoRA #7 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_7 | COMBO | all | LoRA #7 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_7 | BOOLEAN | false | Mark LoRA #7 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_8 | BOOLEAN | true | Enable or disable LoRA #8 without removing it from the list. |
| lora_name_8 | COMBO | LoRA #8 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_8 | STRING | None | LoRA #8 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_8 | FLOAT | 1.00-10–10 | How strongly LoRA #8 affects the output. 1.0 = full effect. |
| model_strength_8 | FLOAT | 1.00-10–10 | How strongly LoRA #8 affects image generation (visual style, composition). |
| clip_strength_8 | FLOAT | 1.00-10–10 | How strongly LoRA #8 affects text understanding (prompt interpretation). |
| conflict_mode_8 | COMBO | all | LoRA #8 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_8 | COMBO | all | LoRA #8 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_8 | BOOLEAN | false | Mark LoRA #8 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_9 | BOOLEAN | true | Enable or disable LoRA #9 without removing it from the list. |
| lora_name_9 | COMBO | LoRA #9 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_9 | STRING | None | LoRA #9 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_9 | FLOAT | 1.00-10–10 | How strongly LoRA #9 affects the output. 1.0 = full effect. |
| model_strength_9 | FLOAT | 1.00-10–10 | How strongly LoRA #9 affects image generation (visual style, composition). |
| clip_strength_9 | FLOAT | 1.00-10–10 | How strongly LoRA #9 affects text understanding (prompt interpretation). |
| conflict_mode_9 | COMBO | all | LoRA #9 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_9 | COMBO | all | LoRA #9 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_9 | BOOLEAN | false | Mark LoRA #9 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| enabled_10 | BOOLEAN | true | Enable or disable LoRA #10 without removing it from the list. |
| lora_name_10 | COMBO | LoRA #10 — pick a LoRA file or leave as 'None' to skip this slot. | |
| lora_name_text_10 | STRING | None | LoRA #10 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections. |
| strength_10 | FLOAT | 1.00-10–10 | How strongly LoRA #10 affects the output. 1.0 = full effect. |
| model_strength_10 | FLOAT | 1.00-10–10 | How strongly LoRA #10 affects image generation (visual style, composition). |
| clip_strength_10 | FLOAT | 1.00-10–10 | How strongly LoRA #10 affects text understanding (prompt interpretation). |
| conflict_mode_10 | COMBO | all | LoRA #10 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees. |
| key_filter_10 | COMBO | all | LoRA #10 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers. |
| preserve_10 | BOOLEAN | false | Mark LoRA #10 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA. |
| lora_stackopt | LORA_STACK | Connect another LoRA Stack node here to add even more LoRAs to the list. | |
| base_model_filteropt | COMBO | All | Filter LoRA dropdowns by base model type (dropdown mode only). Requires ComfyUI-Lora-Manager installed. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| lora_stack | LORA_STACK | — |