Save ZIP
Bundle a workflow's output into an archive and know where it went
- zip
- zip_path
- file_count
Save ZIP is the output end of WAS Node Suite's archive category: it takes a ZIP - built upstream by the pack's ZIP Add or Open ZIP nodes - and writes it as a numbered file under ComfyUI's output, then tells you exactly where it landed. In a workflow that generates a folder's worth of deliverables per run - images, captions, a styles export, a document - this is the node that hands the customer (or your own archive) one tidy .zip instead of a scatter of files.
It's deliberately thin. It doesn't gather anything itself; the pack's ZIP nodes before it decide what goes in the archive, and Save ZIP only decides where it's written and what it's called. Think of it as the "file this batch" step: everything upstream collects, this node ships.
The controls
zip- the archive to write, from ZIP Add or Open ZIP. It's written exactly as it stands, so any naming or structure inside was decided upstream.root- which folder the file lands in: ComfyUI's ownoutputortemp, or any folder you added underpaths.allow_writeinconfig.yaml.filename_prefix- start of the name.archivegivesarchive_0001.zip.filename_delimiter- between prefix and number (_or-).filename_number_padding- digits padded: 4 givesarchive_0001.zip; 0 writesarchive.zipwith no number, which replaces a file already there rather than incrementing.filename_suffix- extra text after the number and before.zip;_finalgivesarchive_0001_final.zip.
Outputs
zip_path is the full path of the archive written - wire it into a report node or a log so the run records where its deliverable went. file_count is how many files the archive holds, which doubles as a sanity check: if you expected 40 images and it says 3, whatever you fed the ZIP upstream wasn't what you thought.
How it fits
A typical graph: collect your per-run outputs (Number Range drives the loop, Image Save writes frames) → gather the file list → ZIP Add builds the archive on the wire → Save ZIP writes it out. If you want multiple zips per run (one per subject, say), run the collection per-loop and let filename_number_padding keep each write from clobbering the last - set it to 0 only when you deliberately want one archive that overwrites itself each run.
Installing
Save ZIP ships in 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 after; needs ComfyUI 0.14.0+ and Python 3.10+. Nothing extra installs and nothing downloads - ZIP writing uses Python's own archive support, consistent with v3's zero-dependency stance.
One containment note, same as the pack's other writers: the file must land in a folder the pack may write to (output, temp, or a paths.allow_write entry). If you need archives on another drive for delivery, add that folder to paths.allow_write and restart rather than fighting the boundary.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| zip | ZIP | The archive to write, from ZIP Add or Open ZIP. It is written exactly as it stands. | |
| 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 | archive | Start of the file name, before the delimiter and the number. 'archive' gives archive_0001.zip. Eg: renders |
| filename_delimiter | STRING | _ | What sits between the prefix and the number. '_' gives archive_0001.zip and '-' gives archive-0001.zip. Eg: _ |
| filename_number_padding | INT | 40–9 | Digits the number is padded to, so 4 gives 'archive_0001.zip'. 0 writes 'archive.zip' with no number, which replaces a file of that name already in the folder. |
| filename_suffixopt | STRING | Added after the number and before '.zip'. Empty adds nothing. Eg: _final |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| zip_path | STRING | The full path of the archive that was written. |
| file_count | INT | How many files the written archive holds. |