ComfyUI Node

NO8D-LoRA stack

Multiple LoRAs, one clean node

By no8d·Created 2 months ago·Updated 14 days ago· 271
NO8D-LoRA stack
    • model
    • trigger_words
    unet_name
    weight_dtype
    lora_picker
    stack_json[]

    The stock way to apply a LoRA in ComfyUI is a chain: Load LoRA node after Load LoRA node, each one taking the previous model output, each one asking for a CLIP you may not even need. Run three LoRAs and your graph is a ladder. NO8D-LoRA stack collapses that into one node: it's a UNET loader with a LoRA list built in, so you pick the base model and then add, remove, enable, disable, and reorder LoRAs without growing the graph.

    The notable design choice is right in the name - there's no CLIP input. This node only patches the UNET (the diffusion model), not the text encoder. That's the right call for the modern architectures: on Flux, SD3, Qwen, and Krea 2 the interesting LoRAs are trained on the diffusion model, and the CLIP patch is either irrelevant or actively unhelpful when you're using a separate text encoder. So the workflow is: load your UNET here, stack LoRAs, and encode your prompt wherever that base model's encoder lives.

    What you set

    • unet_name and weight_dtype - these are inherited wholesale from ComfyUI's native UNETLoader, and they follow upstream updates. Same model list, same fp8 options (fp8_e4m3fn, fp8_e4m3fn_fast, fp8_e5m2).
    • lora_picker - a dropdown of your installed LoRAs. This is the "currently adding" slot; pick one and it joins the stack.
    • stack_json - the stack itself, as JSON. You won't type this by hand; the node's frontend edits it when you use the add/remove/reorder controls. New entries start at strength 1.0 with a 0–2 slider range.

    Outputs are the two that matter: model (the patched model, wire it to your sampler) and trigger_words. That second one is quietly great - it merges the trigger words from every enabled LoRA into a single comma-separated string, so you don't have to remember to type ch9ractername, styl3name into your prompt. The node keeps them deduplicated and skips disabled or zero-weight entries.

    How it works under the hood

    The stack is applied in order, top to bottom, by loading each LoRA and patching the model once per entry. The caching is worth noting: if the same LoRA file appears twice, it's loaded from disk once and reused. There's also a smart IS_CHANGED implementation - the node only re-runs when something that affects the result actually changed (model choice, enabled entries, weights), so it won't gratuitously invalidate the graph downstream.

    The honest caveats

    Stacking LoRAs is still stacking LoRAs. Three at full strength will fight each other, and the node's per-entry toggles exist precisely so you can A/B which combination is actually helping. The usual rule applies: most LoRAs want to sit well below 1.0 when combined. And because this node loads the UNET itself, it replaces your model loader - if your workflow expects a checkpoint node with baked-in CLIP, you'll be restructuring that part of the graph.

    Install

    Same as the rest of the pack:

    cd ComfyUI/custom_nodes
    git clone https://github.com/no8d/ComfyUI-NO8D-controls.git
    python -m pip install -r requirements.txt
    

    ComfyUI Manager → search "NO8D-controls". No models to download, no heavy deps. If the LoRA dropdown comes up empty, check that your LoRAs are in ComfyUI/models/loras where every other loader finds them.

    CategoryNO8D-control

    Inputs (4)

    NameTypeDefaultDescription
    unet_nameCOMBO0 options:
    weight_dtypeCOMBO4 options: default, fp8_e4m3fn, fp8_e4m3fn_fast, fp8_e5m2
    lora_pickerCOMBO1 options: None
    stack_jsonSTRING[]

    Outputs (2)

    NameTypeDescription
    modelMODEL
    trigger_wordsSTRING