Zip Save
Zip up the files your run just made
- paths
- zip_path
- file_count
Zip Save is the write end of the WAS archive family: it takes files that live in ComfyUI's folders and packs them into one zip on disk. Where ZIP Add builds an archive from images, masks and text on the wire, Zip Save reaches into your output, input and temp folders and grabs whatever files you point it at - an earlier render, a log, a JSON - and bundles them into a numbered archive. It's the "gather everything and hand me one file" node.
It also writes archives created elsewhere in the graph: Zip Save (the archive family's tooltips call it Save ZIP) is where the ZIP value from ZIP Add, ZIP Manage or Open ZIP goes when it's time to land on disk. That's the standard finish for the family - build and filter on the wire, write here.
Choosing the files
Two ways in, and you can use both. files is a multiline box, one file per line, in the order you want them archived. A line is either a menu label like renders/cat.png [output] - where the bracketed tag says which folder it came from, so two files of the same name from different folders stay apart - or a full path the pack may read. Line order is archive order. Blank lines are ignored, a # line is a comment, and naming a file twice only puts it in once.
paths is the second way: an ARRAY or STRING input that takes the same thing from a link, appended after whatever you typed. So the natural flow is - have a node produce a list of render paths? Wire that list straight into paths and Zip Save does the rest.
The settings that shape the archive
entry_paths- what each file is called inside the zip:relative path(just its path below input/output/temp),source folder and relative path(output/batch/cat.png), orfile name only. With file-name-only, a clash is numbered apart ascat_2.png.compression-deflatefor text/JSON/documents (much smaller),storefor already-compressed PNGs and JPEGs (faster, no gain from re-packing).root- where the archive lands: ComfyUI'soutputortemp, or any folder underpaths.allow_write.filename_prefixnames the part below it, tokens expand, so[time(%Y-%m-%d)]/notesfiles each day's under a dated folder.
The filename quartet is fiddly but simple once you see it: filename_prefix (default ComfyUI), filename_delimiter (_), filename_number_padding (4 → _0001), and optional filename_suffix (after the number, before .zip). ComfyUI_0001_renders.zip is a prefix of ComfyUI, delimiter _, padding 4, suffix _renders. Set padding to 0 and the number disappears entirely - which also means the same file gets rewritten every run.
Outputs and failure behavior
zip_path is the full path of the archive that was written, numbering and all - feed it to a text console, a report node, or back into Open ZIP. file_count tells you how many files actually went in.
The node is honest about problems: a file deleted since you chose it is reported and skipped, and if nothing is left to archive it says so rather than writing an empty zip. Where beginners get burned is the padding-0 rewrite - great for "keep one canonical archive up to date," a quiet surprise if you expected history. Leave padding at 4 until you mean otherwise.
Install
WAS Node Suite v3 - ComfyUI Manager, search "WAS Node Suite v3", or cd ComfyUI/custom_nodes && git clone https://github.com/WASasquatch/was-node-suite-comfyui, restart. Requires ComfyUI 0.14.0+ / Python 3.10+, no feature flag, no extra packages - standard-library zip under the hood. It's the least glamorous node in the pack and the one that turns "email me the batch" into a single delivered file.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| files | STRING | The files going into the archive, one per line, in that order. A line is a menu label such as 'renders/cat.png [output]', or a full path to a file. | |
| entry_paths | COMBO | relative path | What each file is called inside the archive: its path below input, output or temp, that path with the source folder in front, or the file name alone. |
| compression | COMBO | deflate | How the files are packed. 'deflate' makes text, JSON and documents much smaller; 'store' packs them unchanged, which is faster and suits PNGs and JPEGs, compressed already. |
| root | COMBO | Which folder the file lands in: ComfyUI's own 'output' or 'temp', or any folder added under paths.allow_write in config.yaml, listed by its own name. filename_prefix names the part below it, so '[time(%Y-%m-%d)]/notes' files each day's under a dated folder. | |
| filename_prefix | STRING | ComfyUI | The name part of the archive, before the number. Tokens are expanded here too, so a date or a custom token can go in the name rather than the folder. |
| filename_delimiter | STRING | _ | What sits between the name and the number: 'ComfyUI_0001.zip' with the default, 'ComfyUI0001.zip' if cleared. |
| filename_number_padding | INT | 40–9 | How many digits the number is padded to with leading zeros: 4 gives '_0001', 1 gives '_1'. 0 drops the number and rewrites the same file every run. |
| filename_suffixopt | STRING | Extra text placed after the number and before the extension, so a suffix of '_renders' gives 'ComfyUI_0001_renders.zip'. Empty by default. | |
| pathsopt | ARRAY,STRING | More files to archive, from a link rather than the box above: this socket takes a connection. A string holding several lines is read as several files. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| zip_path | STRING | The full path of the archive that was written, numbering and all, so a later node can report it, print it, or open it again with Zip Open. |
| file_count | INT | How many files went into the archive. Lower than the number of lines chosen when one of them had been deleted, which the log names. |