MetaHub Save Image
A 'Save Image' that actually remembers what you generated
- images
ComfyUI's built-in Save Image embeds the workflow JSON, which ComfyUI itself can read back fine. Almost everything else can't. Civitai, A1111, and most gallery tools look for a plain-text parameters chunk instead - the kind A1111 has been writing since 2022. So the stock behavior is "reproducible inside ComfyUI, invisible everywhere else." MetaHub Save Image is a drop-in swap that writes both: the A1111/Civitai parameters text, plus a full JSON chunk with your workflow and performance stats. You change one node, everything you save from then on is self-documenting.
Wire VAEDecode.IMAGE into images and hit generate. That's the entire setup - images is the only required input, and the node auto-detects the rest. If you've ever squinted at an old output folder trying to remember which seed made a given image, you already know why that's worth it.
How it actually works
The node ships a WorkflowExtractor that walks your graph's prompt data looking for the usual suspects: KSampler-family nodes for seed/steps/cfg/sampler/scheduler, checkpoint loaders for the model, LoraLoader nodes for LoRA names and weights, CLIPTextEncode for the prompts, VAELoader for the VAE. Models and LoRAs get a SHA256 hash in the Civitai AutoV2 format (first 10 hex chars), cached in memory so the second generation costs almost nothing. When multiple samplers exist, it picks the one feeding the latent of the VAEDecode connected to your images, falling back to the first one found. If a custom node in your graph defeats the extractor, the image still saves with the metadata marked partial - fail-safe by design, so a weird workflow never eats your output.
The inputs that matter
The visible optional fields are all about filenames and organization:
filename_pattern(defaultComfyUI_%counter%) - placeholders like%seed%,%model%,%date%,%time%; subfolders work, and each segment is sanitized against path tricks.file_format- PNG, JPEG, or WebP. PNG gets the standard chunks; JPEG/WebP fall back to EXIF fields.output_path- leave empty for ComfyUI's default output folder.tags,notes,project_name- the IMH Pro fields, used if you organize in the companion Image MetaHub app. Ignore them if you don't.
It's an output node with no outputs, so it just terminates your graph.
Installing it
Easiest is ComfyUI Manager - search for ImageMetaHub Save (it's published on the Comfy Registry), install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/LuqP2/ImageMetaHub-ComfyUI-Save.git
Restart ComfyUI. Worth knowing: despite the README telling you to pip install -r requirements.txt, there is no requirements file and no Python dependencies beyond what ComfyUI already ships (PIL, numpy, torch). It's a pure-Python node, which is refreshingly rare in this ecosystem. No model files to download either.
Where people get burned
- "Model hash is 0000000000" - the node couldn't find the checkpoint file. Either your models aren't in
ComfyUI/models/checkpoints/or you've put them somewhere nonstandard; set theCOMFYUI_CHECKPOINT_PATHenvironment variable and it searches there too. - "LoRAs not detected" - it only understands standard
LoraLoadernodes. Custom LoRA loaders won't be parsed, and that's when thepartialflag kicks in. - VRAM peak shows None - expected on Apple Silicon and CPU. VRAM tracking is CUDA-only; it's not a bug.
One honest caveat: the node is the official companion to Image MetaHub, a desktop organizer that has a paid Pro tier. But the metadata it writes is plain standard chunks - A1111, Civitai, and any tool that reads PNG info will see it whether or not you ever install the app. That's the part that makes it worth using even if the organizer isn't for you.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| filename_patternopt | STRING | ComfyUI_%counter% | Filename pattern with placeholders |
| file_formatopt | COMBO | PNG | File format |
| output_pathopt | STRING | Custom output directory (empty = ComfyUI default) | |
| tagsopt | STRING | Optional Image MetaHub tags (comma-separated) | |
| notesopt | STRING | Optional Image MetaHub notes | |
| project_nameopt | STRING | Optional Image MetaHub project name |
Outputs (0)
No outputs