πͺ πΌοΈ Visual LoRA Loader
Your LoRA folder as a wall of thumbnails, with the ones you actually use on top
- model
- clip
- MODEL
- CLIP
- lora_name
Past a hundred LoRAs you stop recognising filenames and start recognising pictures. This is the pack's flagship node: a browsable grid of preview cards inside the node, click to select, multi-select to stack, plus sorting and usage ranking so the three adapters you actually reach for live at the top instead of buried under six hundred downloads you never used twice.
Every ecosystem has one of these - rgthree's Power Lora Loader is the famous one, and its breakage under ComfyUI's Nodes 2.0 frontend rewrite turned a utility node into a year-long argument about upstream compatibility. The reason people get attached is simple: a four-hundred-name dropdown is not a user interface.
How the thumbnails get there
Two sources, in order:
- A sidecar image. If there's a
mypicture.png/.jpg/.jpeg/.webpsitting next tomypicture.safetensorsin your LoRA folder, that's the preview. Downloading model pages from Civitai usually gives you both files; dropping them in the same folder is all it takes. - Civitai by file hash. With the scraping toggle enabled, the node computes the SHA256 of the LoRA file and asks Civitai's API to find the model version by hash, then downloads the first preview image next to the LoRA. This is opt-in - the code defaults to off; the repo's example
.envships it enabled, so if you copied that file, it's on. An optional Civitai API key raises your rate limit. The TMDB path is the same idea for celebrity LoRAs, matching the parsed person name against TMDB's search.
Keys and toggles live in a local .env in the pack's user directory, never in the workflow, and the debug export excludes them. Failed lookups are recorded so the node stops retrying hopeless files, with a ποΈ Clear Scrapes Cache button in settings when you want another go.
Usage tracking is local: it counts how often each LoRA loads and shows rank badges (π₯ and the medal tiers) in the picker, which is what makes Usage (High to Low) sorting useful.
The inputs that matter
model and clip in, then folder - the same filter the rest of the pack uses (empty for everything, or a subfolder name) - and strength_model / strength_clip. Note that the two strengths apply to the whole selection; select three LoRAs and all three get the same weight.
Then the library-management widgets, all advanced: display_mode (Scrollable vs Show All), sort_loras_by (name, usage high/low, date modified), sort_folders_by (name, total usage, average usage, LoRA count), folder_position (Folders First vs Root LoRAs First), content_alignment (Left Aligned / Right Aligned), and output_format + custom_regex for the name string.
Outputs are MODEL, CLIP, and lora_name - a comma-separated list of everything that actually loaded, in load order. For filenames that's ideal; just don't feed it to a node expecting a single name.
Two behaviours worth knowing: selection is driven by the frontend (the visible picks are serialized as JSON and handed to the backend at execution), and the hidden selection mode supports Sequential, Random and Random (No Replace) cycling, with a per-node state file remembering which item it assigned to each queued prompt. That's the "try fifty LoRAs overnight" feature - no duplicates until the pool empties, then it refills. And the fast path: both strengths at 0 skips the disk read entirely while still counting usage and returning names, which makes it a name-collector if you need one.
Install
ComfyUI Manager β search SaturnNodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/KOFiblto/ComfyUI-SaturnNodes
Restart. Requirements are Pillow, numpy and piexif - no vision models, no torchvision, since all the image work is preview thumbnails. Category: πͺ SaturnNodes/Loaders (FolderLoraLoaderVisualPrettyV2 is an alias for old graphs).
Where people get burned
The grid renders as a stack of text fields. That's the frontend, not the pack. The author's own note is that this node breaks on Frontend V1 (LiteGraph classic) and works on V2 (the Vue UI) - so run it on the newer frontend. The generic version of this problem is Nodes 2.0 breaking third-party node rendering across many popular packs, and the standard workaround is switching the frontend back.
No thumbnails, and the first scan takes forever. The first scrape run hashes every LoRA in the folder - that's a full read per file, and 300 adapters is a lot of disk. It's a one-time pass per file, failures are cached, and sidecar previews you supply yourself skip it entirely.
The wrong celebrity. TMDB matching uses the parsed name, so a quirky filename can resolve to a random person. It's a scraped thumbnail, not a database record - correct it by putting the right image next to the file.
Selection seems ignored at execution time. Multi-select and the cycling modes are frontend state pushed at run time; if a run used the wrong LoRAs, look at the lora_name output. It reports what actually loaded, which settles it immediately.
Everything got the same weight. One strength pair, whole selection. If a character at 0.7 and a style at 0.35 are both needed, that's two loader nodes.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | β | |
| clip | CLIP | β | |
| folder | STRING | β | |
| strength_model | FLOAT | 1.00-100β100 | β |
| strength_clip | FLOAT | 1.00-100β100 | β |
| display_mode | COMBO | Scrollable | 2 options: Scrollable, Show All |
| sort_loras_by | COMBO | Name (A-Z) | 6 options: Name (A-Z), Name (Z-A), Usage (High to Low), Usage (Low to High), Date Modified (Newest First), Date Modified (Oldest First) |
| sort_folders_by | COMBO | Name (A-Z) | 5 options: Name (A-Z), Name (Z-A), Total Usage (High to Low), Average Usage (High to Low), Total LoRAs (Most First) |
| folder_position | COMBO | Folders First | 2 options: Folders First, Root LoRAs First |
| content_alignment | COMBO | Left Aligned | 2 options: Left Aligned, Right Aligned |
| output_format | COMBO | Filename | 6 options: Parsed Name, Filename, Filename without extension, Relative Path, Full Path, Custom Regex |
| custom_regex | STRING | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | β |
| CLIP | CLIP | β |
| lora_name | STRING | β |