π Civitai Visual Checkpoint Model Loader by LX
Pick checkpoints by their actual face
- MODEL
- CLIP
- VAE
You know the feeling: a models/checkpoints folder with forty files, half named v10_final_FINAL, and you're guessing which one was the good portrait model from memory. The default Load Checkpoint gives you a plain dropdown and a prayer. This node is the antidote - it loads a checkpoint the same way, but you pick it from a grid of thumbnails with search, filtering, and Civitai metadata attached. It's one of the three "Visual Browser" loaders in the VisualBrowserNodes-by-LX pack (the LoRA and diffusion variants are its siblings).
What it actually is
Under the hood this is a stock ComfyUI checkpoint loader wearing a fancy frontend. The backend calls comfy.sd.load_checkpoint_guess_config with output_vae=True and output_clip=True - the exact same path the core Load Checkpoint node takes. Nothing exotic about the model side. The trick is the browser: the node ships JavaScript (in the pack's web/ folder) that injects a big "Open Visual Checkpoint Model Loader" button onto the node. Click it and an overlay opens showing your local .safetensors as a grid of preview images, filterable by base model, searchable by name or folder, with WASD/arrow-key navigation.
The Civitai part is where the "visual" magic comes from. Select a file, hit Load Data from Civitai, and the backend hashes the file (SHA-256, cached by mtime so it re-hashes if you replace the file) and the frontend asks Civitai's public api/v1/model-versions/by-hash endpoint for the matching model page. You get the preview image, base model info, and trigger words pulled straight down. The name "Civitai Visual" makes people assume it needs an API key - it doesn't. No key, no token, no account. The by-hash endpoint is public.
The inputs and outputs that matter
The schema is minimal. One input:
- selected_model - a string holding the checkpoint filename. You don't type it; clicking a card in the browser writes it here. Leave it empty and the node raises
"No checkpoint selected."
Outputs are the familiar trio, identical to the stock loader:
- MODEL β wire into the sampler
- CLIP β wire into your positive/negative text encodes
- VAE β wire into VAE Decode
That's the whole thing. If you've built one workflow with Load Checkpoint, you already know how to use this - just swap the node.
Installing it
The README gives two routes, and there are no Python dependencies to fight (pyproject.toml declares dependencies = []), so this is one of the rare packs that just works:
# Method 1: ComfyUI Manager
# Open Manager β Custom Nodes Manager β search "Civitai Visual Browser & Loader by LX" β Install β restart
# Method 2: manual
cd ComfyUI/custom_nodes
git clone https://github.com/LX-ComfyUI/VisualBrowserNodes-by-LX
Restart ComfyUI, right-click the canvas, and search for "Civitai Visual Checkpoint Model Loader by LX".
Where people get burned
- First Civitai load is manual. Metadata doesn't populate itself - you have to click Load Data from Civitai per model once. After that it's cached in
checkpoint_cache.jsoninside the pack folder, so it's a one-time cost per file. - The hash lookup only matches files that exist on Civitai. If you renamed a file or trained something privately, the by-hash query comes back empty and you're left with your local preview image. Not a bug, just a limitation of how Civitai's API works.
- "No checkpoint selected." - you'll see this if the browser wrote nothing to the node, usually because you closed the overlay without clicking a card. Open it and click.
- It's a small personal pack (0 stars-worthy community footprint, single dev under
LX-ComfyUI). As with any custom node, read what it does before trusting it with anything sensitive - it fetches only public Civitai metadata and previews, and keeps its state in browserlocalStorage, which is about as boring as custom nodes get.
Honest verdict: if you've got a tidy model collection and good previews, the default dropdown is survivable. But once you're past twenty checkpoints, the ability to see what you're loading stops being a nicety. This node is the least painful fix for that particular flavor of annoyance.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| selected_model | STRING | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | β |
| CLIP | CLIP | β |
| VAE | VAE | β |