LC Fingerprint Library π
Your Model Folder, Remembered in About a Megabyte Per File
- report
What this is for
If you've been downloading checkpoints for a year, you have a models folder with a hundred files in it and no idea what half of them are. The model card is gone, the file is called krea_v3_final_FINAL.safetensors, and the page explaining which two models it merged is deleted.
LC Fingerprint Library is the fix, and it's a quiet one: it walks the folders you point it at and stores a tiny fingerprint of every model and LoRA it finds - about 1 MB per file, in models/fingerprints/, tagged with the model family. Once a file is in, the original can go. Its partner, LC Fingerprint Identify π, is what turns those fingerprints back into an actual sentence like "60% Krealism, 40% Turbo, plus this LoRA at about 0.4". The library is the thing that has to exist first, so start here.
Why this is worth doing now
Merges are the bulk of what CivitAI hosts, and their provenance is usually undocumented - WAI is the go-to example, where the merge lineage was never published and every claim about how it was made is inference. Krea 2 then shifted the whole ecosystem off Ideogram 4 in about a week, and the LoRA and finetune supply that followed has been relentless: a huge volume of files churned fast, with the ingredients often gone by the time you get curious.
A 1 MB sketch you kept outlives a model card that isn't there anymore.
How it actually works
Each layer's weights get squashed into 1024 numbers - a count sketch, a fixed random projection seeded from the layer's name and size, so the same weights always produce the same 1024 numbers. Two properties do all the work. Sketches keep distances, so similar layers give similar sketches. And they're linear: sketch(A) - sketch(B) = sketch(A - B). Subtract a base model from its finetune and you're holding a fingerprint of exactly what the finetune changed - which is the trick Identify uses to attribute changes block by block.
Family is read off the layer names: Krea 2, Z-Image, Anima, Flux.1, Flux.2 / Klein, Qwen-Image, Wan, SDXL, SD 1.5, HiDream, Chroma, LTX, MiniMax H3. Things it can't place get skipped rather than mislabelled, as are partial files under 40 weight layers (a ControlNet patch, an adapter). VAEs, text encoders and upscalers are skipped too; nobody merges those.
The inputs that matter
folders is the one you'll actually edit, one entry per line, and it's forgiving: a full path, a path relative to the ComfyUI folder (models/loras), or a bare registered folder name (loras, checkpoints, diffusion_models) which expands to every place ComfyUI reads that type from. A folder of raw downloads works fine.
include picks models and LoRAs (the default), models only, or LoRAs only.
precision - leave it at bf16 / fp16 / fp8 only unless you have a reason. An int8 or nvfp4 file is the same model rounded, so fingerprinting it adds a duplicate, not information.
recursive (on) and skip_known (on) are the two you leave alone: skip_known compares size and date, so a rerun only adds what's new.
The output is report, a STRING listing each file as added (family, layer count, how long it took) or skipped and why. It's printed to the console as it runs; wire it into Show Text if you want it on the graph.
Install
ComfyUI Manager β search LC Modelbuilder (Registry name: ComfyUI LC Modelbuilder Nodes, publisher lonecatone23). Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_ModelBuilder_nodes
Then restart ComfyUI and hard-refresh the browser (Ctrl+Shift+R) so the pack's JS chrome loads. There's no requirements.txt on purpose - the merge, save and fingerprint nodes only use what ships with ComfyUI core. install.py is there for the face scorer's onnxruntime; nothing to install for this one.
One structural gotcha the author calls out: __init__.py must sit directly in ComfyUI/custom_nodes/ComfyUI_LC_ModelBuilder_nodes/. If you unzipped it and got a folder inside a folder, nothing loads and the console warns you about a nested pack folder.
Where it bites
Only .safetensors is walked. GGUF quants live in .gguf files and are invisible to this node and to Identify. A library built from a GGUF-only download folder comes back empty, so keep a bf16 or fp8 safetensors copy of anything you care about keeping track of.
The index is keyed on absolute path. Move or rename a file and the next run treats it as new: same model, second fingerprint, two same-named candidates later. Not fatal, just clutter.
It re-runs on every queue. The node is deliberately non-cacheable, which is correct for a folder scan and mildly annoying if you forget. skip_known is what makes the repeat runs free.
Weird quants are slow. Files it can't stream get decoded through ComfyUI, so an int8 file takes longer and eats more RAM than its size suggests - another vote for the precision default.
Cancel lands between files, not inside one. A 25 GB checkpoint finishes reading before the interrupt takes effect.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| folders | STRING | Folders (or single files) to fingerprint, one per line: full paths, paths from the ComfyUI folder (models/loras), or a model folder name (loras, diffusion_models, checkpoints) for every place ComfyUI reads it from. Every .safetensors inside is checked: models and LoRAs go in the library, VAEs / text encoders / upscalers are skipped. | |
| recursive | BOOLEAN | true | Also the folders inside them. |
| include | COMBO | models and LoRAs | 3 options: models and LoRAs, models only, LoRAs only |
| skip_known | BOOLEAN | true | Skip files already in the library (same size and date), so a rerun only adds what is new. |
| precision | COMBO | bf16 / fp16 / fp8 only | Models only: leave out int8, mxfp8, nvfp4 and other lower quants. They are the same model as their bf16 / fp8 file, just rounded, so they add nothing. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| report | STRING | β |