LC Checkpoint Save
Bake the merged model to disk (and why the file lands in output/)
- model
- clip
- vae
You merged two checkpoints, you baked a pile of LoRAs into the weights, and now the model only exists inside a running ComfyUI session. Close the tab and it's gone. LC Checkpoint Save is the node that writes it out as a real all-in-one file - model, text encoder and VAE in one .safetensors.
It's not glamorous, but it's the last step of every merge workflow, and ComfyUI's stock Save Checkpoint node has two annoyances this one fixes. Worth knowing about before you export something you then can't reproduce.
What it actually does
Under the hood the node does the boring, correct thing: it calls ComfyUI core's own comfy.sd.save_checkpoint(), and its metadata handling is a copy of core's CheckpointSave helper from comfy_extras/nodes_model_merging.py. Same file format, same key layout, no custom serialization to go wrong. If you've saved checkpoints with the stock node, these files are indistinguishable in structure.
Two things core doesn't give you:
enabled. A save node has no outputs, so ComfyUI's native bypass has nothing to pass through - muting it just means the whole downstream branch stops. Here, enabled is a real switch: off skips the write entirely, and because it's a boolean widget you can right-click and convert it to an input, then drive it from a switch elsewhere in the graph. That's the classic "run the test, decide, then save" pattern, and it's the reason this node exists at all.
embed_workflow. Per-save control over whether the prompt and workflow JSON get written into the file's metadata. Core's node is stuck reading the global --disable-metadata launch flag; this one doesn't care what the flag says. When you're about to hand a checkpoint to someone else, turn it off.
The inputs you actually touch
model, clip and vae are all required - that's the definition of a checkpoint, an all-in-one file. If you only have a MODEL in your graph and no matching clip/VAE wired up, this node will refuse to run, and you want LC Diffusion Model Save instead. That's not a limitation, it's the author being pedantic about the word "checkpoint," and he's right.
filename_prefix defaults to checkpoints/LC_ModelBuilder. Keep the subfolder part. You'll get LC_ModelBuilder_00001_.safetensors under it, with the counter incrementing on each save so you never silently overwrite the last one.
There are no outputs. It's an output node, so it always executes when the graph runs.
Check the metadata your model is getting
The modelspec detection is copied verbatim from core, which means it only fires for the architectures core knows: SDXL, SDXL Refiner, SVD, SD3. A merged Krea 2 or Flux checkpoint saved here gets no modelspec.architecture field - you'll get the prediction-key and EDM sigma keys where applicable, and that's it. Nothing broken, just don't expect a downstream tool to read an architecture string that was never written. Check it if it matters:
python -c "
from safetensors import safe_open
f = safe_open('ComfyUI/output/checkpoints/LC_ModelBuilder_00001_.safetensors','pt')
print(f.metadata())
"
If you left embed_workflow on, that printout includes your full node graph. That's the same disclosure problem as PNG metadata (image-io-metadata.md covers the argument in detail): the default is "share everything." A checkpoint you publish is a checkpoint that carries your prompt style, your LoRA list, your paths.
Install
It ships in the LC ModelBuilder pack, which has no requirements.txt - the merge and save nodes use nothing but ComfyUI core. Search "ComfyUI LC Modelbuilder Nodes" in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_ModelBuilder_nodes
Restart ComfyUI. Then check that __init__.py sits directly inside ComfyUI_LC_ModelBuilder_nodes/ - if you unzipped it and got a folder inside a folder, the loader prints a warning and ignores the nested copy, and you'll see no LC nodes in the menu at all.
Where the file actually goes, and the #1 gotcha
output_dir = folder_paths.get_output_directory(). The save path is built with get_save_image_path against the output directory - so your new checkpoint lands in ComfyUI/output/checkpoints/, next to your renders. Not in ComfyUI/models/checkpoints/.
People hit this and assume the save failed, because the Checkpoint Loader dropdown doesn't show the file. It saved fine; it's just in the wrong place. Move it:
ls -t ComfyUI/output/checkpoints/ | head
mv ComfyUI/output/checkpoints/LC_ModelBuilder_00001_.safetensors ComfyUI/models/checkpoints/
Then hit refresh in the loader's combo box. Two other things worth flagging: a save node is an output node, so it runs on every queue while enabled is on (an accidental 12 GB write on each test run adds up), and the browser needs a hard refresh (Ctrl+Shift+R) after a pack update before the node's colors and chrome behave.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Diffusion model to save. | |
| clip | CLIP | Required -- a checkpoint is an all-in-one file. | |
| vae | VAE | Required -- a checkpoint is an all-in-one file. | |
| filename_prefix | STRING | checkpoints/LC_ModelBuilder | Subfolder/prefix under the output directory. |
| enabled | BOOLEAN | true | Off = skip the save entirely (no file written), without physically bypassing the node. Convert to an input to gate saving from a switch elsewhere in the graph. |
| embed_workflow | BOOLEAN | true | Include the prompt and workflow JSON in the saved file's metadata. Turn off before sharing/publishing a checkpoint if you don't want your exact node graph attached. |
| metadataopt | COMBO | keep all | keep all = everything this save normally writes (with embed_workflow on, your whole node graph). necessary only = just what loading needs (quant settings, if any) plus the architecture and trigger words: no workflow, no training details, no titles or edit notes. Use it before sharing a file. |
Outputs (0)
No outputs