Image Saver
Save with full A1111-style metadata baked in
- images
- hashes
ComfyUI's stock Save Image node writes the workflow into the PNG and calls it a day. That's useless if you want the generation parameters - model, sampler, steps, CFG, seed, prompt - readable as the kind of metadata Civitai and A1111-style tools parse. This node fills that gap: it saves your image with a proper parameters string embedded, so the file carries its own recipe.
It's forked from alexopus's ComfyUI-Image-Saver, with the Civitai-download bits stripped out. The author is candid about why it exists - it's a stable node for their own standalone-app API, frozen so an upstream update can't change its behavior. Their own advice, which is worth repeating: for general use, alexopus's original is the fuller-featured choice. This fork is here for people who want the metadata-saving behavior without the Civitai coupling. The strong click-through on it suggests plenty of people are searching for exactly that.
How it works
You wire your finished images in, and you also feed it the generation settings - steps, CFG, sampler, seed, the prompts, dimensions - as inputs. It assembles those into an A1111-style parameters string and writes it into the saved file's metadata (and optionally embeds the full ComfyUI workflow too). The filename is templated, so you can encode the model name, seed, and timestamp right into the filename automatically. The one output, hashes, is a string of the model/resource hashes it computed - the same hashes Civitai uses to recognize which checkpoint and LoRAs made an image.
The inputs that matter
Most of the many inputs are just the metadata fields you pass through from your sampler. The few that shape behavior:
- images - what you're saving.
- filename - a template, default
%time_%basemodelname_%seed. Those%tokens get filled in, so you get self-describing filenames without renaming by hand. - path - subfolder under your output directory. Leave blank for the default.
- extension -
png,jpeg,jpg, orwebp. PNG for lossless with embedded workflow; webp/jpeg when you care about file size (withquality_jpeg_or_webpandlossless_webpto tune that). - embed_workflow - on by default; keeps the draggable ComfyUI workflow inside the file.
The metadata inputs (steps, cfg, sampler_name, scheduler, positive, negative, seed_value, width, height, modelname, clip_skip, …) are what actually populate the parameters string. They're optional, but the saver is only as complete as what you feed it - connect them from your sampler and loader for a full record.
Install
ComfyUI Manager → search ComfyUI_Mira → Install → restart, or cd ComfyUI/custom_nodes && git clone https://github.com/mirabarukaso/ComfyUI_Mira.git and restart. If it errors on load, pip install -r requirements.txt in the pack folder. No model download needed.
Common issues
The usual disappointment is "the metadata is half empty" - that's because the fields are optional inputs and you didn't wire them. The node can't read your sampler's mind; if you want steps and CFG in the saved parameters, connect steps, cfg, sampler_name and the rest from the nodes that hold those values. If the embedded hashes come back blank or wrong, check modelname and additional_hashes - the hash lookup keys off the model name you pass. And if you specifically need the Civitai auto-download or the richer feature set, use alexopus's upstream node instead; the author put that recommendation in the readme for a reason.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | image(s) to save | |
| filename | STRING | %time_%basemodelname_%seed | filename (available variables: %date, %time, %model, %width, %height, %seed, %counter, %sampler_name, %steps, %cfg, %scheduler, %basemodelname, %denoise, %clip_skip) |
| path | STRING | path to save the images (under Comfy's save directory) | |
| extension | COMBO | file extension/type to save image as | |
| stepsopt | INT | 201–10000 | number of steps |
| cfgopt | FLOAT | 7.000–100 | CFG value |
| modelnameopt | STRING | model name | |
| sampler_nameopt | STRING | sampler name (as string) | |
| scheduleropt | STRING | normal | scheduler name (as string) |
| positiveopt | STRING | unknown | positive prompt |
| negativeopt | STRING | unknown | negative prompt |
| seed_valueopt | INT | 00–18446744073709550000 | seed |
| widthopt | INT | 5120–16384 | image width |
| heightopt | INT | 5120–16384 | image height |
| lossless_webpopt | BOOLEAN | true | if True, saved WEBP files will be lossless |
| quality_jpeg_or_webpopt | INT | 1001–100 | quality setting of JPEG/WEBP |
| optimize_pngopt | BOOLEAN | false | if True, saved PNG files will be optimized (can reduce file size but is slower) |
| counteropt | INT | 00–18446744073709550000 | counter |
| denoiseopt | FLOAT | 1.000–1 | denoise value |
| clip_skipopt | INT | 0-24–24 | skip last CLIP layers (positive or negative value, 0 for no skip) |
| time_formatopt | STRING | %Y-%m-%d-%H%M%S | timestamp format |
| save_workflow_as_jsonopt | BOOLEAN | false | if True, also saves the workflow as a separate JSON file |
| embed_workflowopt | BOOLEAN | true | if True, embeds the workflow in the saved image files. Stable for PNG, experimental for WEBP. JPEG experimental and only if metadata size is below 65535 bytes |
| additional_hashesopt | STRING | hashes separated by commas, optionally with names. 'Name:HASH' (e.g., 'MyLoRA:FF735FF83F98') |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| hashes | STRING | Comma-separated list of the hashes to chain with other Image Saver additional_hashes |