Output Core
Filenames and folders that tell you what made the image
- images
- images
- save_path
- subfolder
- filename_prefix
Stock SaveImage gives you a timestamp and a folder that fills up. SickOllie's Classic Output Core (SOOutputBuilderSave) is the save node that remembers everything else: it builds output folders and filenames from dropdown variables, auto-detects the upstream model and LoRA, hashes them, and writes the whole generation story into the file as ComfyUI metadata plus Civitai-readable parameters. After a few hundred test images, folders named _SickOllie_Art/clean_name/raw_stem_seed_time are a lot easier to mine than a wall of ComfyUI_00001.
How it works
You feed it decoded images, and it constructs a path from a root plus up to four subfolder variable slots and up to six filename variable slots, joined by delimiters (default _). The variables are where the magic is: clean_name, raw_stem, model_name, seed, prompt_index, outfit_index, scene_index, file stems, and date/time parts. So subfolder = clean_name + filename = raw_stem _ model_name _ time_hhmmss gives you _SickOllie_Art/my_lora_v2/my_lora_v2_flux1-dev_153042.png - readable at a glance.
On the metadata side it auto-discovers upstream model/LoRA resources by walking the workflow, computes file hashes (with a cache), and builds both ComfyUI prompt/workflow JSON chunks and an A1111/Civitai-style parameters block. PNG, JPG, and WebP are supported with a quality control (JPG/WebP only) and counter_digits for uniqueness. LoRA tested/use history records only after a successful save, so a failed write doesn't lie to your Library.
Inputs and outputs that matter
The required ones: images, output_root (default _SickOllie_Art), the subfolder_var_* and filename_var_* dropdowns, extension, and the three metadata toggles - save_prompt_json, save_workflow_json, save_civitai_parameters. There's also a saved_path read-only display that shows the last write. The context values (clean_name, raw_stem, model_name, seed, indexes, file names) come as inputs so you can wire them from upstream - in Classic you do the wiring; Studio's Auto Context handles it for you.
Outputs: images (passthrough), save_path, subfolder, and filename_prefix - all strings you can log or feed to a display.
Installing it
Part of the SickOllie pack:
cd ComfyUI/custom_nodes
git clone https://github.com/sickollie/SickOllie
or ComfyUI Manager → "SickOllie". Restart, Ctrl+F5.
Where people get burned
The biggest one: if you want the image to reload its workflow later, use PNG and keep prompt + workflow metadata enabled. JPG and WebP are inspection-only - the graph chunk doesn't travel. Second, Civitai matching is exact-hash: a converted, merged, or differently quantized model won't match its published version even with a similar name, so expect some Model hash gaps on non-vanilla files. And on filenames, delimiter habits bite: pick _ and stick with it, because a variable that resolves empty (say [None] in a subfolder slot) can collapse a path into something you didn't intend. If a folder looks wrong, check which slots are [None].
Inputs (35)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| output_root | STRING | _SickOllie_Art | Root output folder relative to ComfyUI output. |
| subfolder_literal | STRING | — | |
| subfolder_var_1 | COMBO | clean_name | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| subfolder_var_2 | COMBO | [None] | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| subfolder_var_3 | COMBO | [None] | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| subfolder_var_4 | COMBO | [None] | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| subfolder_delimiter | STRING | _ | — |
| filename_literal | STRING | — | |
| filename_var_1 | COMBO | raw_stem | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| filename_var_2 | COMBO | model_name | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| filename_var_3 | COMBO | time_hhmmss | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| filename_var_4 | COMBO | [None] | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| filename_var_5 | COMBO | [None] | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| filename_var_6 | COMBO | [None] | 16 options: [None], clean_name, raw_stem, model_name, seed, prompt_index, +10 |
| filename_delimiter | STRING | _ | — |
| extension | COMBO | png | 3 options: png, jpg, webp |
| quality | INT | 951–100 | Used for jpg/webp quality. PNG ignores this. |
| counter_digits | INT | 51–10 | — |
| save_prompt_json | BOOLEAN | true | Embed Comfy prompt metadata inside the saved image. |
| save_workflow_json | BOOLEAN | true | Embed workflow metadata inside the saved image for reload. |
| save_civitai_parameters | BOOLEAN | true | Embed Civitai-readable generation metadata inside the saved image. |
| clean_name | STRING | — | |
| raw_stem | STRING | — | |
| model_name | STRING | Connect a model name string here if desired. | |
| seed | INT | 0-1125899906842624–1125899906842624 | — |
| prompt_index | INT | 0-2147483648–2147483647 | — |
| outfit_index | INT | 0-2147483648–2147483647 | — |
| scene_index | INT | 0-2147483648–2147483647 | — |
| prompt_file | STRING | — | |
| outfit_file | STRING | — | |
| scene_file | STRING | — | |
| saved_path | STRING | Read-only display of the most recent save path. | |
| generation_infoopt | STRING | — | |
| applied_lorasopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| save_path | STRING | — |
| subfolder | STRING | — |
| filename_prefix | STRING | — |