Image Saver
The node that finally lets you control where everything goes
- images
- saved_paths
The author of Endless says this node is why he started writing Python at all, and you can feel it. The Image_saver node exists to fix the annoyances every other saver left unsolved: it saves images and their JSON metadata to different folders if you want, it handles Windows UNC paths when the default saver wouldn't, it bakes your batch prompts into filenames, and it uses standard Python timestamp formats instead of the WAS Suite's quirks. If you've ever fought a saver over where your files land, this is a relief.
It's genuinely feature-complete for a saver node: three formats (PNG, JPEG, WEBP), workflow embedding into the PNG, separate JSON export, per-prompt filenames, filename numbering with padding, and a saved_paths output that tells you exactly where everything went after each run.
The inputs that matter
There are a lot of them, but you'll live in five:
images- the IMAGE tensor off your VAE Decode. Obviously required.output_path- where images go. Empty means ComfyUI's default output folder; give it a path (UNC paths work on Windows, which was the author's whole complaint) and images land there.json_folder- the killer feature: a separate folder for the JSON metadata. Leave empty and the JSON goes next to the images.prompt_list- feed it thePROMPT_LISToutput from the Endless batch prompt nodes and your filename becomes[first words of prompt]..._<number>, one per image. This is how batched images stay identifiable.filename_prefix- defaultBatch. The base name everything builds on.
Behind those: include_timestamp + timestamp_format (standard Python strftime - %Y-%m-%d_%H-%M-%S is the default; the README is explicit that this is not the WAS Suite [time(...)] syntax), image_format, jpeg_quality, delimiter (replaces spaces, default _), prompt_words_limit (how many prompt words go in the filename, 1-16), embed_workflow (you should really leave this on - it's what makes drag-and-drop reconstruction work), save_json_metadata, enable_filename_numbering / filename_number_padding / filename_number_start, and embed_png_metadata.
How it works
Under the hood it assembles a filename from your prefix, timestamp, prompt words, and a padded counter, then writes each image in the batch to output_path. The JSON path is independent, so you can point images at a NAS and metadata at a local folder. OS-aware filename length limits keep you from hitting filesystem errors (255 chars on Windows/Linux/macOS). The output saved_paths is a STRING with the full path for every file - handy if you're chaining into another node that logs or reports.
Where people get burned
The timestamp format is the classic trip-up. WAS Suite uses [time(%Y-%m-%d__%I-%M%p)]; this node uses raw Python strftime like %Y_%m_%d__%I-%M%p. Copy a WAS-format timestamp in here and you'll get literal [time(...)] text in your filenames. Also: the README notes a July 2025 fix that made the prompt_list connection optional - so a missing prompt wire no longer breaks the save.
Installing it
Part of Endless πβ¨ Nodes by tusharbhutt:
cd ComfyUI/custom_nodes
git clone https://github.com/tusharbhutt/Endless-Nodes
# restart ComfyUI
Or ComfyUI Manager β search "Endless". No extra dependencies - it uses PIL/Pillow and folder_paths, both already in ComfyUI. No model files.
Gotchas
Beyond the timestamp syntax, remember that workflow embedding and PNG metadata are separate toggles - if you're sharing images, make sure embed_workflow is on, because that's the piece the community expects ("workflow included" is culture). And while this is a well-trodden node from a pack the author uses daily, it's still a one-maintainer hobby project: keep an eye on the repo before building a whole pipeline on it. For a truly battle-hardened alternative, Impact Pack's save nodes are the ecosystem default, but they don't offer the separate-JSON-folder trick.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| include_timestamp | BOOLEAN | true | β |
| timestamp_format | STRING | %Y-%m-%d_%H-%M-%S | β |
| image_format | COMBO | PNG | 3 options: PNG, JPEG, WEBP |
| jpeg_quality | INT | 951β100 | β |
| delimiter | STRING | _ | β |
| prompt_words_limit | INT | 81β16 | β |
| embed_workflow | BOOLEAN | true | β |
| save_json_metadata | BOOLEAN | false | β |
| enable_filename_numbering | BOOLEAN | true | β |
| filename_number_padding | INT | 21β9 | β |
| filename_number_start | BOOLEAN | false | β |
| embed_png_metadata | BOOLEAN | true | β |
| output_pathopt | STRING | β | |
| prompt_listopt | STRING | β | |
| filename_prefixopt | STRING | Batch | β |
| negative_prompt_listopt | STRING | β | |
| json_folderopt | STRING | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| saved_paths | STRING | β |