Prompt Logger Unified v2
The node that writes a plain-text JSON log next to every image
- model
- prompt
- filename
- sampler_name
- scheduler
- steps
- cfg
- seed
- control_after_generate
- denoise
Prompt Logger Unified v2 is a logging node from the comfyui-prompt-logger pack, and it does exactly one thing: every time you run the graph, it writes a tidy .json file next to your image that records what you generated and how. Prompt text, sampler, scheduler, steps, CFG, seed, denoise, model name, LoRAs, VAE - all of it, in a file you can grep, sort, or script over without opening ComfyUI.
ComfyUI already bakes the whole workflow into the PNG's metadata, so why bother? Because that embedded JSON only lives inside the image file. If you want a machine-readable history of a project folder - say you're iterating on a character design over weeks and you want to diff prompts across runs, or you need to prove which seed/model produced a client's final asset - a sidecar file you can walk with jq is a lot friendlier than re-exporting embedded metadata. The author describes it as a tool for "reproducibility, brand integrity, and traceable creative workflows," which is a fancy way of saying: they got tired of not knowing what made an image.
How it actually works
The node is a pass-through logger. It takes your settings, computes a filename, writes the JSON sidecar, and hands you back everything as outputs. Two things are worth knowing up front, and both come straight from the source.
First, it never writes a PNG. The filename output is just a string path it predicts - base_name plus a timestamp, in whatever folder you gave it (relative to output/). Your sidecar JSON lands next to a file that only exists if you wire that filename into something that actually saves the image. If you drop this node in without connecting its outputs, you'll end up with a pile of orphaned JSON files and no pictures.
Second, the prompt is a plain text widget you fill in yourself. It isn't pulled from your CLIPTextEncode. So if you tweak the prompt in the text encoder but forget to update this box, the sidecar will confidently log the wrong words. Treat it as a form you fill out, not a monitor of your graph.
That honesty extends to the settings: the sampler list is 44 entries and the scheduler list 9, straight from ComfyUI's own sampler registry (so yes, it'll happily log euler_ancestral or a Karras schedule), but nothing here changes how your graph samples. This node is a reporter, not a driver.
The inputs that matter
folder+base_name- where the sidecar goes and what it's called.output/projectX/loggergives youlogger_<timestamp>.json. Setuse_timestampto false and every run overwrites the same file instead of appending new ones.prompt- type or paste the prompt you actually used. The one field where lying to it is a you-problem.model(optional) - plug in the MODEL you're sampling with and it'll try to identify it:model_channels320 with 4 input channels gets flagged as SDXL, 9 input channels as SD-Inpainting, everything else as SD1.5. It also hashes the first weight tensor into a 16-hexmodel_hash.lora_info(optional) - one LoRA per line inname:strength_model:strength_clipformat, e.g.stylev2:0.8:0.9.
Gotchas the README won't tell you
Three things tripped me up. The timestamps are computed in US/Pacific time, hardcoded in the source - if you're not on Pacific, your file naming clock is off. The "model hash" it computes is a hash of the first tensor in the state dict, not civitai's model hash, so don't go looking it up - it won't match anything. And the control_after_generate input is just a boolean that gets logged; it does not randomize your seed. ComfyUI's built-in "control after generate" on a seed widget is a different mechanism entirely.
One more, and it's a fun one: check the source and you'll find the denoise and control_after_generate outputs are swapped relative to their labels - the output named "control_after_generate" actually carries the denoise float and vice versa. If you wire either of those downstream, verify what you're actually passing.
Installing it
No model downloads, no heavy deps, no requirements.txt - the only non-ComfyUI import is pytz, which ComfyUI already ships. Install via ComfyUI Manager (search "comfyui-prompt-logger") or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/sputnik57/comfyui-prompt-logger
Then restart ComfyUI. Honestly, this is a small personal tool - three Google impressions, zero community chatter - so it's less "essential pack" and more "handy if the use case fits." If you want a scriptable record of every generation in a folder, it'll do that in one node. Just remember to actually save the image too.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| folder | STRING | output/projectX | — |
| base_name | STRING | logger | — |
| sampler | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | normal | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| steps | INT | 20 | — |
| cfg | FLOAT | 7.50 | — |
| seed | INT | 2025 | — |
| control_after_generate | BOOLEAN | false | — |
| denoise | FLOAT | 1.00 | — |
| use_timestamp | BOOLEAN | true | — |
| timestamp_format | STRING | %d%b%Y_%H%M | — |
| prompt | STRING | — | |
| modelopt | MODEL | Diffusion model for metadata extraction | |
| checkpoint_nameopt | STRING | Name of the checkpoint model used | |
| lora_infoopt | STRING | LoRA information (name:strength_model:strength_clip format) | |
| vae_nameopt | STRING | Name of the VAE model used |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |
| filename | STRING | — |
| sampler_name | STRING | — |
| scheduler | STRING | — |
| steps | INT | — |
| cfg | FLOAT | — |
| seed | INT | — |
| control_after_generate | BOOLEAN | — |
| denoise | FLOAT | — |