CivitAI metadata setup
Making your generations actually show their used resources on CivitAI
- ui_widget
- metadata_string
- checkpoint
- vae
- sampler
- scheduler
- embeddings
- lora_tags
- full_pos_prompt
- neg_prompt
- steps
- denoising
- clip_skip
- cfg
- seed
- width
- height
- hires_upscaler
- hires_upscale
- analytics_dataset
If you've ever uploaded a ComfyUI image to CivitAI and watched the "resources used" section sit there empty - no checkpoint, no LoRAs, nothing - you've hit a genuinely common complaint. A1111 embeds that data in a format CivitAI's parser understands natively; ComfyUI's default save doesn't, so people bounce between custom metadata nodes hunting for one that actually works. LF_CivitAIMetadataSetup is one people specifically point to as the fix - it's built to produce metadata in the shape CivitAI expects, not just a generic embedded workflow blob.
The mechanism is a bit unusual for a "metadata" node: it's also a pass-through hub. You wire your actual generation parameters into it - checkpoint, VAE, sampler, scheduler, prompts, steps, CFG, seed, dimensions, hi-res fix settings - and it re-emits nearly every single one of them as its own labeled output, in addition to bundling everything into a metadata_string. That means you can drop this node into the middle of an existing pipeline as a tap: your CheckpointLoaderSimple, KSampler, and friends still get their values, but now this node is also watching and packaging what went through. It's a lot of optional inputs, but you don't need to fill them all - only checkpoint is required, and the rest just enriches the metadata string with whatever you connect.
Worth calling out specifically: lora_tags takes a string, and if you're using LoRAs whose filenames embed trigger words and weights (a real convention some LoRA authors use), LF_ParsePromptWithLoraTags's loras output feeds directly into this field. And analytics_dataset in the outputs suggests this node is also what's meant to be feeding LF_UsageStatistics's chart, though that link isn't spelled out explicitly in the pack's docs.
The output you'll actually use downstream is metadata_string - wire it straight into LF_SaveImageForCivitAI's civitai_metadata input, and that node embeds it when it writes your file.
Installing it. ComfyUI Manager: search "LF Nodes," install, restart. Manual: cd ComfyUI/custom_nodes && git clone https://github.com/lucafoscili/lf-nodes then restart - use that repo, not comfyui-lf, which comfy.icu links but which the author archived after migrating the whole pack. No models, no heavy deps; it's config plumbing, not compute.
Where people get tripped up. Even with correctly built metadata, CivitAI's own parser is finicky - multiple people report trying several "save with metadata" nodes before one actually got recognized, and this pack is one that's held up in practice, but "it embeds correctly" and "CivitAI's site reliably reads it every time" aren't quite the same guarantee. Second: this node only builds the metadata string, it doesn't save anything - pair it with LF_SaveImageForCivitAI, or the string just sits unused. Third, don't confuse sampler/scheduler here with a live picker of what your KSampler is currently doing - these are separate dropdowns you set to match your actual sampler manually; the node has no way to introspect your graph and auto-fill them.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| checkpoint | COMBO | None | Checkpoint used to generate the image. |
| vaeopt | COMBO | VAE used to generate the image. | |
| sampleropt | COMBO | None | Sampler used to generate the image. |
| scheduleropt | COMBO | None | Scheduler used to generate the image. |
| embeddingsopt | STRING | Embeddings used to generate the image. | |
| lora_tagsopt | STRING | Tags of the LoRAs used to generate the image. | |
| positive_promptopt | STRING | Prompt to generate the image. | |
| negative_promptopt | STRING | Negative prompt used to generate the image. | |
| stepsopt | INT | 301–10000 | Steps used to generate the image. |
| denoisingopt | FLOAT | 1.000–1 | Denoising strength used to generate the image. |
| clip_skipopt | INT | -1-24–-1 | CLIP skip used to generate the image. |
| cfgopt | FLOAT | 7.000–30 | CFG used to generate the image. |
| seedopt | INT | 00–18446744073709550000 | Seed used to generate the image. |
| widthopt | INT | 1024 | Width of the image. |
| heightopt | INT | 1024 | Height of the image. |
| hires_upscaleopt | FLOAT | 1.50 | Upscale factor for Hires-fix. |
| hires_upscaleropt | COMBO | Upscale model for Hires-fix. | |
| ui_widgetopt | KUL_CODE | — |
Outputs (19)
| Name | Type | Description |
|---|---|---|
| metadata_string | STRING | — |
| checkpoint | — | |
| vae | — | |
| sampler | euler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,ddim,uni_pc,uni_pc_bh2 | — |
| scheduler | normal,karras,exponential,sgm_uniform,simple,ddim_uniform,beta,linear_quadratic,kl_optimal | — |
| embeddings | STRING | — |
| lora_tags | STRING | — |
| full_pos_prompt | STRING | — |
| neg_prompt | STRING | — |
| steps | INT | — |
| denoising | FLOAT | — |
| clip_skip | INT | — |
| cfg | FLOAT | — |
| seed | INT | — |
| width | INT | — |
| height | INT | — |
| hires_upscaler | — | |
| hires_upscale | FLOAT | — |
| analytics_dataset | JSON | — |