Ultimate Lora Loader (Civitai)
A LoRA stack loader that reads your Civitai library so you don't have to
- model
- clip
- MODEL
- CLIP
If you stack LoRAs the way most people actually do - a character, a style, a finicky detail fix, all on one checkpoint - you've hit the pain this node exists for. Default ComfyUI gives you one LoraLoader per LoRA, so a four-LoRA workflow is four nodes and a graph that looks like a tangle. Ultimate Lora Loader (Civitai) is a fork of WaitWut's Ultimate Lora Loader that collapses that stack into one node and keeps going: it shows the Civitai title, cover image, and base model for each entry instead of a bare filename, plus two info buttons per row. The "Ultimate" oversells a bit; the "Civitai" is the whole point.
What it is
It's a single-node LoRA stack loader: one model in, several LoRAs applied in order, one model out. The stack lives inside the node as rows you can add, remove, reorder by dragging, toggle on/off, and set per-LoRA strengths on. Nothing else on the canvas needs to change.
What separates this from the pack's original is the Civitai-aware front end. When Civitai Toolkit has a LoRA indexed, rows and the Add Lora browser show the Civitai title with the filename underneath, an image icon that hovers a cover preview, and a Base column so you see at a glance whether something is SDXL or Illustrious before you click it. The ? button opens Toolkit's local info popup (tags, triggers); the i button opens the full "View Lora info" dialog from pythongosssss's ComfyUI-Custom-Scripts - the same one you get from right-clicking a default LoraLoader. Trigger words, cover art, and base model without tabbing out to a browser.
Honest take: the loading is standard-issue. If you don't run Civitai Toolkit and don't care about covers, rgthree's Power Lora Loader is the more battle-tested stack loader (it's the one the community actually names). This node's reason to exist is the Civitai metadata glue.
How it works
The backend is refreshingly boring. The node takes model, an optional clip, and a loras_data string that defaults to []. That string is a JSON-serialized widget the JS front end manages entirely - the rows you see are the UI, and it keeps the hidden string in sync. On execution the Python side parses it and applies each enabled entry in order via ComfyUI's own load_lora_for_models, with per-entry model and clip strengths. Same call core LoraLoader makes, so nothing exotic about the math.
One design detail worth knowing: clip is optional. When it's not connected, the node forces the CLIP-side strength to zero and patches the model only - the exact pattern core's LoraLoaderModelOnly uses. Video and upscale workflows that never touch the text encoder can leave CLIP unwired and still stack LoRAs; wire it when you want text-encoder patching, and you get the CLIP output too.
The folder browser is a small API route (/ultimate_lora_loader_civitai/tree) that builds a nested tree from ComfyUI's own LoRA search paths, so extra paths from extra_model_paths.yaml show up nested by subfolder as well.
The inputs that matter
- model (required) - the MODEL output of your checkpoint loader. This is what gets patched.
- clip (optional) - wire it for text-encoder patching (most SDXL/anime LoRAs want this); leave it unwired for model-only.
- loras_data - you never type this. It's the JSON payload the stack UI writes, which is why the Add Lora button and the rows live inside the node.
Both outputs (MODEL, CLIP) feed the sampler and CLIPTextEncode like any loader.
Installing it
The node runs standalone; the extras are soft dependencies. You need the other two packs installed and the ComfyUI fully restarted for the full experience:
cd ComfyUI/custom_nodes
git clone https://github.com/StoneZol/comfyui-ultimate-lora-loader-civitai-toolkit-supported.git
git clone https://github.com/BAIKEMARK/ComfyUI-Civitai-Toolkit.git # ? button, names, covers
git clone https://github.com/pythongosssss/ComfyUI-Custom-Scripts.git # i button
Or just search the pack title in ComfyUI Manager and let it do the work. There are no pip dependencies - pyproject.toml lists none - so install is copy-and-restart.
Gotchas
- Without Custom Scripts,
ipops an alert. The other extras degrade gracefully (filename-only, no covers), but that button is a hard dependency. - Keep config ids unique. Identity (node type, API route, menu name) comes from
js/ullc/config.json. One copy next to the original Ultimate Lora Loader is fine; two copies of this fork need distinctnode_classandapi_prefixor you'll get duplicate routes. - Missing files don't crash you. If a stored entry points at a deleted LoRA, it logs
Could not find lora … skippingand keeps going - useful, but check your console when the output looks wrong. - Stacking still has the usual rules. A Pony LoRA won't work on Illustrious just because it loads without error, and 0.7 is SDXL advice, not a law. Add one at a time with a fixed seed; black frames usually mean reorder bigger LoRAs first.
The pack was tested against Civitai Toolkit 4.1.3 and Custom Scripts 1.2.5, so if you're on much older versions, upgrade before filing a bug - and file it here, not against the upstream Ultimate Lora Loader, which this project deliberately isn't a PR against.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| loras_data | STRING | [] | — |
| clipopt | CLIP | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |
| CLIP | CLIP | — |