Workflow Manifest Writer π
Every render deserves a receipt β this is the receipt
- manifest_path
- summary
The pack's own docstring says it best: without record-keeping, every generation is undocumented once the workflow graph closes. You get a great image, and six weeks later you have no idea which checkpoint, seed, and LoRA stack made it. Workflow Manifest Writer fixes that by writing a JSON file - the full parameter set - alongside your output, numbered to match the pack's Custom Folder Batch Saver so an image and its manifest can share the same number.
It's record-keeping for the reproduction case: you need to rerun a specific render, or compare why two runs diverged. The embedded-metadata route (drag the PNG back into ComfyUI, or use the pack's Load Image + Recovered Metadata node) recovers a lot of this after the fact, but a written manifest survives even when you're working with a batch of renamed files.
How it works - and the honest limitation
Here's the thing to internalize before you wire it up: it does not auto-detect anything. The docstring is explicit that ComfyUI doesn't expose a clean, stable API for a node to read its own upstream graph at execution time. So every field is something you explicitly connect or type in. This node is a form with your name on it, not a forensic tool.
Which means the wiring ritual is: on your KSampler, right-click the seed, steps, cfg, sampler, and scheduler widgets β Convert widget to input, and fan those out to both the sampler and this node. Same for the checkpoint name and prompts from their loaders/encoders. Do it once, save the workflow, and every future run writes its own manifest automatically. That's the real payoff - one-time setup, permanent receipts.
It writes to output_dir (default output/tensorvizion/manifests, relative to ComfyUI root), with a prefix_NNNNN.json naming scheme that reads existing files to avoid collisions - same convention as the pack's saver, so matching prefixes and output dirs on both nodes give you image_00001.png + run_00001.json... well, matching numbers at least.
The fields that matter
The structured ones: checkpoint_name, positive_prompt, negative_prompt, seed, steps, cfg, sampler_name, scheduler. Then two genuinely useful optional free-texts:
- lora_stack_summary - paste or wire a LoRA list (the pack's LoRA Stack / Quick LoRA Stacker produce exactly this shape of summary).
- extra_notes - your own observation about the run. "Better at 30 steps," "weird artifacts in the background." This is the field that makes the manifest a diary rather than a log.
Outputs
manifest_path (the written file's location) and summary. Both STRING, both easily displayed or logged.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
Restart ComfyUI; find Workflow Manifest Writer π under TensorVizion/Workflow. No extra dependencies - it's the standard library writing JSON.
Where people get burned
- Empty fields stay empty. A manifest with
"seed": 0, "steps": 0, "cfg": 0is worse than no manifest, because it looks authoritative. The defaults are zero for a reason - nothing is assumed - so if you don't wire a field, you get a clean zero. Wire everything you care about. - It's
OUTPUT_NODE, so it runs. Like Workflow End, it's a terminal node; make sure the values feeding it are the actual ones used, not stale copies from an earlier branch. - Numbering only matches if you set the same prefix and output dir as whatever save node you're pairing with. Pick those once, up front.
If you're someone who treats reproducibility seriously - or you ship workflows to clients and want a paper trail - this is one of the few nodes in the pack that fills a hole nothing else covers.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| output_dir | STRING | output/tensorvizion/manifests | β |
| prefix | STRING | run | β |
| checkpoint_name | STRING | β | |
| positive_prompt | STRING | β | |
| negative_prompt | STRING | β | |
| seed | INT | 00β18446744073709550000 | β |
| steps | INT | 00β1000 | β |
| cfg | FLOAT | 0.000β100 | β |
| sampler_name | STRING | β | |
| scheduler | STRING | β | |
| lora_stack_summaryopt | STRING | β | |
| extra_notesopt | STRING | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| manifest_path | STRING | β |
| summary | STRING | β |