Bobs LoRA Loader (Universal)
Nine LoRA sliders instead of one — on any model you throw at it
- model
- clip
- MODEL
- CLIP
- info
Every LoRA is a bundle. A character LoRA trained on a face, some outfits, and the aesthetic of its dataset isn't one thing - it's all three stuffed into one file, and ComfyUI's built-in LoraLoader applies the whole bundle at a single strength. That's the problem Bobs LoRA Loader exists to fix, and the Universal node is the version that fixes it for everything.
It's one of three loaders in the Bobs_LoRA_Loader pack, alongside dedicated FLUX and SDXL nodes with architecture-named blocks. Universal is the one you want when you switch models - SD1.5, SDXL, SD3/3.5, FLUX, Qwen-Image, Wan, LTX-Video, AuraFlow, whatever - because it works out the model's block layout at runtime instead of reading a hardcoded table. No waiting for an update when a new architecture drops; the info output tells you what stacks it found.
How it works
Two things make this work, and both are more careful than they look. First, ComfyUI's own comfy.lora translates every LoRA naming dialect (kohya lora_unet_*, OneTrainer lora_transformer_*, diffusers transformer.*, LyCORIS, PEFT) into canonical model keys, so the node classifies by what the patch actually targets rather than by the file's internal names.
Second, it treats almost every diffusion backbone the same way: an ordered stack (or two) of repeated blocks. input_blocks → middle_block → output_blocks for a UNet, double_blocks/single_blocks for FLUX, transformer_blocks for Qwen-Image and LTX-Video, and so on. The node discovers those stacks from the loaded model, concatenates them in execution order, and maps every block to a 0–1 depth axis split into five buckets. So the "Early" slider means composition on a 19+38-block FLUX, a 60-block Qwen-Image, and a 20-stage SDXL the same way. Text-encoder patches go to the CLIP output; everything else patches the model.
The inputs that matter
You set three things and mostly ignore the rest:
lora_name- the LoRA file.Nonepasses the model through untouched.preset-Character,Style,Concept,Detail & Texture,Fix Hands/Anatomy,Full (Normal LoRA), orCustom. Here's the gotcha: any preset overrides the sliders entirely. It does not blend with them. Onlystrengthstill multiplies on top. If you've been tweaking sliders and seeing no change, this is why.strength- a global multiplier (-5 to 5) applied to every block weight. Not the old 0.5–0.8 LoRA habit; it's a scaler on top of the block values.
Set preset to Custom and you get nine sliders: Text Encoder, Input & Embeddings, then Early Blocks (Composition) through Late Blocks (Texture) (the depth buckets), plus Output Head and Other Tensors. The rough rule of thumb: early blocks carry composition and subject identity, late blocks carry style, detail and texture. That's why Character drops the late blocks and Style does the reverse.
The third output, info (a STRING you can view or pipe into a text node), is the node's best feature: a per-block report of weight, tensors found, and tensors actually patched. When a tool silently ignores a LoRA it can't apply - a real community complaint - this one tells you instead.
Installing it
Zero dependencies, zero model downloads. The package ships no requirements.txt; it's pure ComfyUI. Either search "Bobs_LoRA_Loader" in the ComfyUI Manager, or:
cd ComfyUI/custom_nodes/
git clone https://github.com/BobsBlazed/Bobs-Lora-Loader
Then restart ComfyUI. Nodes live under Add Node → Bobs_Nodes.
Common issues
- Nodes don't appear in the menu. Check the startup console for a traceback mentioning
bobs_. Usually a partial clone or stale__pycache__. WARNING: N% of UNet tensors landed in '<block>'. Wrong node for the model (an SDXL model in the FLUX node). Switch to Universal.none of its tensors match this model. The LoRA was trained for a different architecture. Nothing is applied - check your base model matches the LoRA's family.- High
Other Tensorscount. The classifier couldn't place those weights. Try Universal first; if it's still high, that's a real bug worth an issue - theinfooutput names the architecture and stacks, so include it.
Want the exact same result as ComfyUI's built-in loader? Pick Full (Normal LoRA). Everything else deliberately differs - that's the point. If a LoRA's style is overbaked but the subject is right, this is the cleanest way to keep one and drop the other.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Diffusion model to patch. | |
| lora_name | COMBO | LoRA file to load. 'None' passes the model through untouched. | |
| strength | FLOAT | 1.00-5–5 | Global multiplier applied on top of every block weight. |
| preset | COMBO | Choose 'Custom' to use the sliders below; any other preset overrides them. | |
| Text Encoder | FLOAT | 1.00-2–2 | All text-encoder weights (CLIP / T5 / LLM), whatever the model uses. |
| Input & Embeddings | FLOAT | 1.00-2–2 | Patch, timestep, guidance and context embedding layers feeding the block stack. |
| Early Blocks (Composition) | FLOAT | 1.00-2–2 | First 20% of the block stack. Global composition and layout. |
| Early-Mid Blocks (Subject) | FLOAT | 1.00-2–2 | 20–40% of the block stack. Subject identity. |
| Mid Blocks (Concept & Style) | FLOAT | 1.00-2–2 | 40–60% of the block stack. Concept and dominant style. |
| Late-Mid Blocks (Detail) | FLOAT | 1.00-2–2 | 60–80% of the block stack. Detail generation. |
| Late Blocks (Texture) | FLOAT | 1.00-2–2 | Final 20% of the block stack. Fine texture and surface. |
| Output Head | FLOAT | 1.00-2–2 | Final projection back to latent space. |
| Other Tensors | FLOAT | 1.00-2–2 | Tensors that matched no stack, embedding or head pattern. |
| clipopt | CLIP | Optional. Leave unconnected to patch the model only. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | Model with the block-weighted LoRA applied. |
| CLIP | CLIP | CLIP with the text-encoder portion of the LoRA applied. |
| info | STRING | Per-block report: weight, tensors found and tensors actually patched. |