Save Image (Civitai Metadata)
Your PNG already contains the whole workflow. Civitai still shows nothing.
- images
- images
- parameters
The problem this solves
ComfyUI's default Save Image writes your graph into the PNG as prompt and workflow chunks. That's great for you - drag the file back onto the canvas and the workflow rebuilds. Civitai is the exception: it reads an A1111-style parameters chunk first, and only falls back to the ComfyUI graph for graphs simple enough for its reader - a KSampler fed straight by CLIPTextEncode with literal text.
Feed it anything real - a UNET loader instead of Load Checkpoint, SamplerCustomAdvanced with a CFGGuider, a seed from a settings node, a prompt written by an LLM - and your upload shows no prompt, no seed, no model link. The old fix meant retyping your prompt into a side node by hand and publishing metadata that didn't match what actually ran.
Save Image (Civitai Metadata) is a drop-in replacement for Save Image. Same images input, same filename_prefix behaviour, same images passthrough on output 0, so existing links keep working. It just also writes the parameters chunk.
It has to replace Save Image rather than sit beside it: Save Image JSON-encodes whatever it's handed, so A1111 text can't be smuggled in, and its file is written before any later node runs.
How it works
Instead of checking node types against a whitelist, the node walks your graph backwards from the image it's saving and reads the values that genuinely flowed through the links at runtime - pulled from ComfyUI's output cache, which is why a prompt written by an enhancer a second earlier still comes out right. It matches roles, not names: a sampler is anything with a model or guider, a seed/steps/sigmas input and a latent to start from; a prompt is the text at the end of the conditioning chain. So UNET loaders, subgraphs and rgthree config nodes come along for free. If the cache misses a value, it falls back to evaluating simple nodes statically.
Hashes are AutoV2 - the first 10 hex chars of the file's SHA256, the form Civitai stores. Only the checkpoint, LoRAs and embeddings get hashed; VAE and text encoders are skipped on purpose, since everyone re-uploads those and Civitai credits whoever got there first. Lookup order: its own cache (ComfyUI/user/seesee-civitai-metadata/hash_cache.json), then LoRA Manager's .metadata.json, then Civitai Helper's .civitai.info, then a .sha256 sidecar - and only then does it hash the file. The first hash of a big checkpoint makes that save noticeably slower. Nothing leaves your machine, and sidecar ids become Civitai resources entries carrying the LoRA weight.
Inputs you'll actually touch
images- what to save.filename_prefix- identical to Save Image, including%date:yyyy-MM-dd%and subfolders.embed_workflow- default on: also writes ComfyUI'sprompt/workflowchunks so the PNG still drags back into the canvas. The A1111 text is written either way.
Outputs: images (your input, unchanged) and parameters, a STRING holding the exact text baked into the PNG. Park it on a Preview Any to see what Civitai will read - that's the single best debugging move here.
Install
ComfyUI Manager → search SeeSee Civitai Metadata → Install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/seesee75-commits/ComfyUI-SeeSee-Civitai-Metadata
No extra Python packages - the pyproject declares zero dependencies. It does need ComfyUI 0.3.0 or newer, because it uses the DYNPROMPT hidden input and the async executor's output cache.
Getting it into a graph: right-click a Save Image node → Convert to Save Image (Civitai Metadata). Position, title, filename_prefix and every link survive, and Convert back undoes it. The canvas-level Convert all Save Image nodes retrofits a whole workflow at once.
Common issues
Civitai doesn't link your model. Linking is by hash, so the exact file you generated with must be uploaded to Civitai - a merged, converted or quantised copy has a different hash. The console line prints the hash that was written; compare before blaming the node.
No parameters at all. The node logs no sampler found upstream of the images and saves the image anyway - it couldn't walk back to a sampler. Read the console; every save prints one line:
[Civitai Metadata] node 243: model See-Krea2-Genesisv2-int8_convrot, seed 424242, 10 steps, Euler a/Beta, cfg 1, hires 8 steps @ 0.2, 2 LoRA
runtime cache unavailable in that line. Values fell back to static evaluation, so anything computed at runtime may be wrong or missing.
You thought --disable-metadata protected your prompt. It still suppresses the prompt/workflow chunks, but the parameters text is written regardless - writing it is the point of the node.
PNG only, for now, and no help against a host that re-encodes your upload. Keep the original.
One caveat: this is a 0.1.0 pack with a single node, and the README lists shapes its rules should handle but "not tested yet" - KSamplerAdvanced, SamplerCustom, GGUF loaders, LoRA stacks.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The images to save. | |
| filename_prefix | STRING | ComfyUI | The prefix for the file to save. Same formatting options as the normal Save Image node, e.g. %date:yyyy-MM-dd%. |
| embed_workflow | BOOLEAN | true | Also embed ComfyUI's prompt and workflow like the normal Save Image node, so the PNG can still be dragged back into ComfyUI. Civitai reads the A1111 parameters first either way. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | The input images, unchanged. |
| parameters | STRING | The A1111 parameters text written into the PNG. |