Nodes/LF Nodes/CivitAI metadata setup
ComfyUI Node

CivitAI metadata setup

Making your generations actually show their used resources on CivitAI

By lucafoscili·Created 2 years ago·Updated about a year ago· 50
CivitAI metadata setup
  • 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
checkpointNone
vae
samplerNone
schedulerNone
embeddings
lora_tags
positive_prompt
negative_prompt
steps30
denoising1.00
clip_skip-1
cfg7.00
seed0
width1024
height1024
hires_upscale1.50
hires_upscaler

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.

Category✨ LF Nodes/Configuration

Inputs (18)

NameTypeDefaultDescription
checkpointCOMBONoneCheckpoint used to generate the image.
vaeoptCOMBOVAE used to generate the image.
sampleroptCOMBONoneSampler used to generate the image.
scheduleroptCOMBONoneScheduler used to generate the image.
embeddingsoptSTRINGEmbeddings used to generate the image.
lora_tagsoptSTRINGTags of the LoRAs used to generate the image.
positive_promptoptSTRINGPrompt to generate the image.
negative_promptoptSTRINGNegative prompt used to generate the image.
stepsoptINT301–10000Steps used to generate the image.
denoisingoptFLOAT1.000–1Denoising strength used to generate the image.
clip_skipoptINT-1-24–-1CLIP skip used to generate the image.
cfgoptFLOAT7.000–30CFG used to generate the image.
seedoptINT00–18446744073709550000Seed used to generate the image.
widthoptINT1024Width of the image.
heightoptINT1024Height of the image.
hires_upscaleoptFLOAT1.50Upscale factor for Hires-fix.
hires_upscaleroptCOMBOUpscale model for Hires-fix.
ui_widgetoptKUL_CODE

Outputs (19)

NameTypeDescription
metadata_stringSTRING
checkpoint
vae
samplereuler,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
schedulernormal,karras,exponential,sgm_uniform,simple,ddim_uniform,beta,linear_quadratic,kl_optimal
embeddingsSTRING
lora_tagsSTRING
full_pos_promptSTRING
neg_promptSTRING
stepsINT
denoisingFLOAT
clip_skipINT
cfgFLOAT
seedINT
widthINT
heightINT
hires_upscaler
hires_upscaleFLOAT
analytics_datasetJSON