Nodes/LoRA Preview/Power LoRA Loader (with Preview)
ComfyUI Node

Power LoRA Loader (with Preview)

Stack Five LoRAs in One Node, With a Thumbnail for Each

By shhostweb-beep·Created 18 days ago·Updated 18 days ago· 0
Power LoRA Loader (with Preview)
  • model
  • clip
  • MODEL
  • CLIP
◄loras_json[]►

One node instead of five, and you can see what's in it

Stacking isn't a power-user move anymore - it's how the current crop of good results gets made. The highest-scoring realism recipes of 2026 are LoRA stacks: three LoKrs at 1.0 on Klein 9B, or two at up to 1.4 on Z-Image Turbo, which is roughly where that base runs out of headroom. Core ComfyUI still gives you one LoRA per node, so a four-LoRA recipe is four nodes and four names you squint at to remember what's in the chain.

Power LoRA Loader (with Preview) compresses that into a single node: one row per LoRA, each with an on/off dot, a thumbnail, the name, and a strength. rgthree's Power Lora Loader is the one most people run - hundreds of threads name it - and it earns that by pulling trigger words off CivitAI. This pack doesn't. What it does is show you the pictures, with no dependencies at all.

How it works under the hood

The unusual part, and the source of every quirk below: the list isn't Python widgets. It's one string input, loras_json, holding a JSON array like [{"on":true,"lora":"style.safetensors","strength":0.8}]. The JavaScript draws the rows and rewrites that string on every edit; the Python side parses it and loops:

loader = nodes.LoraLoader()
for it in items:
    ...
    model, clip = loader.load_lora(model, clip, name, strength, strength)

That's ComfyUI's own load_lora, once per row, in row order - so the math is identical to chaining stock loaders, and row order is stack order. That matters, because stacking interactions are unpredictable and the standing fix when things go black or NaN is to reorder, larger LoRAs first. Here that's cheaper than rewiring a chain, though there's no drag-to-reorder: you remove the row and add it back, or edit the order in loras_json by hand.

Rows that are switched off, rows with no name, and rows at exactly 0 strength are skipped entirely - so zero is a free off-switch that also saves the load time.

Inputs, outputs, and the row UI

model and clip come in, plus loras_json, which is read-only in practice - it's the UI's serialization target. Out come MODEL and CLIP, wired as any core loader: model to the sampler, clip to your text encoders.

The rows are where you work. An on/off dot per row, plus Toggle All in the header for A/B-ing a whole stack against none. Strength as ◀ 1.00 ▶: arrows step by 0.05, or click the number to type an exact value. ✕ removes a row, + Add LoRA appends one, and hovering a row floats a large preview beside the node, while the picker shows a 300px preview as you move down it. That beats a full generation to find out what style_v3 was.

One thing you give up: a single strength per row, applied to both model and clip. If a LoRA needs strength_clip higher than strength_model - common with anime styles - this node can't express it. Load that one separately.

The failure mode to know about

Malformed JSON fails silently. The parse is wrapped in a bare try/except that falls back to an empty list, so a broken loras_json never errors - the model passes straight through and the LoRA does nothing. You get a normal-looking image and no clue. It happens when you hand-edit the field or paste JSON from elsewhere; if the output looks like the plain base model, read loras_json.

A missing LoRA errors at run time, not at load. The stock loader's dropdown validates against files on disk; here the names are buried in a string, so nothing validates. Delete or rename a file a row points at and you find out when the graph executes. The bundled example workflow ships with two of the author's own LoRAs in it - pick your own, or expect exactly that error.

If the node renders as a plain text box of raw JSON, the JS extension didn't load: hard-refresh with Ctrl+F5, then restart ComfyUI.

Installing it

Same pack, same steps - no requirements.txt, dependencies = [] in pyproject.toml, nothing to pip install:

cd ComfyUI/custom_nodes
git clone https://github.com/shhostweb-beep/ComfyUI-LoRA-Preview

Restart and hard-refresh. Manager users can search LoRA Preview; the repo is registry-ready (publisher starhostig, v1.0.1), and if the listing hasn't landed yet, clone it.

Worth being honest about provenance: one author, one commit, MIT, README in English and Persian, no community footprint to speak of. The code is small and readable, but if a row misbehaves you're debugging it yourself. Canvas-drawn rows are exactly what ComfyUI's Nodes 2.0 frontend rewrite broke in other packs, and the README admits it's only been tested in limited frontend setups - odd-looking rows, suspect that first. The upside of the thinness is that it fights nothing: it sits happily beside EasyUse's thumbnails or rgthree's loader while you decide which you prefer.

Categoryloaders

Inputs (3)

NameTypeDefaultDescription
modelMODEL—
clipCLIP—
loras_jsonSTRING[]—

Outputs (2)

NameTypeDescription
MODELMODEL—
CLIPCLIP—