Save Image (Umbra Lab)
A save node that writes your PNG, your workflow, and an A1111-readable settings string
- images
- positive
- negative
ComfyUI's default SaveImage already embeds the workflow in the PNG. Save Image (Umbra Lab) does that, then keeps going: it also writes an A1111-style parameters string and a civitai_metadata block, so the same file is readable by ComfyUI, by A1111's PNG Info tab, and by CivitAI's uploader. If you've ever dragged a PNG into CivitAI and watched it fail to detect the prompt, this is the node that fixes the class of problem - the file gets the dialect every tool in the ecosystem expects.
How it works
On every save it writes three kinds of metadata into the PNG text chunks:
- ComfyUI standard - the
workflowandpromptJSON chunks, so dragging the PNG back into ComfyUI rebuilds the graph as usual. - A1111
parameters- a flatprompt\nNegative prompt: ...\nSteps: ..., Sampler: ..., CFG scale: ..., Seed: ..., Model: ..., Size: ...string. That's exactly the format A1111's PNG Info reads and re-applies. civitai_metadata- a structured payload with the prompt and model resources, which CivitAI's uploader picks up.
Beyond the metadata, there's real file-management muscle. filename_prefix supports %date% (the default is UmbraLab_%date%). The optional folder inputs give you save_to_yyyy_mm_dd_folder (date-dated subfolders that roll over at midnight), save_to_set_subfolder + set_subfolder for grouping batches, and save_set_to_style_subfolder for organizing a set by style. output_folder lets you point saves anywhere instead of the default output dir.
The inputs a beginner sets
- images - what to save.
- filename_prefix - the base name;
%date%becomes the date. - positive_prompt / negative_prompt - the text to record. The node also accepts positive / negative CONDITIONING inputs and, cleverly, can pull the actual prompt text out of your workflow if you leave the text fields empty, so you don't have to maintain prompts twice.
The rest - model_name, seed, steps, cfg, sampler_name, scheduler - are all optional and exist so you can wire the real values from a sampler (the Umbra KSamplers output exactly these) rather than typing them. Per-batch values are supported, so a batch of images records each image's own seed.
Installing it
Part of Umbra-Nodes, the ComfyUI companion pack for Umbra Studio (NocturneLabs' open-source local AI creation suite). ComfyUI Manager → search "Umbra Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Nocturne-Ai-Labs/Umbra-Nodes
Restart ComfyUI. No pip deps, no models - it uses ComfyUI's own PNG-saving machinery.
Gotchas
The metadata is written into the PNG text chunks, which means the same rules as every ComfyUI save apply: re-encoding kills it. Upload to a host that recompresses (Reddit, most Discord previews) and the workflow and A1111 string are gone - share the original file. Also, SaveImage-class nodes write to ComfyUI/output/ permanently, unlike PreviewImage's temp folder, so don't leave this in the graph during heavy iteration or you'll bury yourself in PNGs; swap in a preview node until you're ready to commit. If positive_prompt is empty and you didn't wire conditioning, the recorded prompt may be blank - the workflow-extraction fallback only kicks in when it can find a CLIP Text Encode upstream.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| filename_prefix | STRING | UmbraLab_%date% | — |
| positive_prompt | STRING | — | |
| negative_prompt | STRING | — | |
| positiveopt | CONDITIONING | — | |
| negativeopt | CONDITIONING | — | |
| output_folderopt | STRING | — | |
| save_to_yyyy_mm_dd_folderopt | BOOLEAN | false | — |
| save_to_set_subfolderopt | BOOLEAN | false | — |
| set_subfolderopt | STRING | — | |
| save_set_to_style_subfolderopt | STRING | — | |
| model_nameopt | STRING | — | |
| seedopt | INT | 00–18446744073709550000 | — |
| stepsopt | INT | 201–10000 | — |
| cfgopt | FLOAT | 7.00–100 | — |
| sampler_nameopt | STRING | euler | — |
| scheduleropt | STRING | normal | — |
| output_formatopt | COMBO | png | 3 options: png, jpeg, webp |
| output_qualityopt | INT | 901–100 | — |
Outputs (0)
No outputs