Zip Output Folder
Zip your whole output folder without touching a terminal
- full_path
- filename_only
You're on a RunPod box or a Colab notebook, you've generated 200 images over an afternoon, and now you face the worst part of cloud ComfyUI: downloading them one at a time through a file manager. Zip Output Folder is the node for that exact moment. It lives at the end of your workflow, and when you hit Queue, it walks your whole output/ folder and tucks every file into a single timestamped zip you grab once. Nothing else in this pack - it's a one-node, no-dependency utility, which is honestly refreshing.
It's worth being clear about the trade before you install it: if you're comfortable with SSH, zip -r on a shell does the identical job in seconds. This node is for the "everything happens in the browser" crowd - no terminal, no docker exec, just a node that runs like any other. That's a genuinely real use case on ephemeral cloud instances, where your disk evaporates the moment you stop paying for it.
How it works
Read the source and there's no magic. On every execution the node asks ComfyUI where output/ lives (folder_paths.get_output_directory()), walks it recursively with rglob("*"), and writes everything into a ZIP_DEFLATED archive named output_YYYYMMDD_HHMMSS.zip. That's it - standard library zipfile, no model files, no extra deps.
Three deliberate details in there:
- Zip-of-zip prevention. The writer skips any
.zipit finds, and skips the archive it's currently writing, so you never get a zip inside a zip. If the node's naming scheme is the only zip source in your folder, you're safe by default. - It zips everything, not just images. Subfolders from Save Image's
filename_prefix(see the file-save docs in the KB) get nested into the archive preserving their relative paths, and any loose non-image files come along too. Great if your output folder is clean, annoying if you've dumped random stuff in there - see below. - The timestamp name. That's what makes
filename_onlyuseful: you can construct a direct download URL or drag the one file out of the RunPod file browser instead of fifty thumbnails.
The two inputs
The info_schema is minimal, and one of them is a trap:
seed- functionally does nothing. It's not read anywhere in the zip logic; it exists to break ComfyUI's node cache. Because the node has noIS_CHANGEDmethod, ComfyUI skips re-running it when its inputs look unchanged - and an unchanged seed looks unchanged. Leave the seed'scontrol_after_generateon randomize (the default) so every queue makes a fresh archive. If you flip it to fixed to "lock" things, the node silently returns last run's zip path.clear_previous_zips(defaulttrue) - before making the new zip, it deletes every.zipin your output folder. Not just ones it made. If you keep other archives in there, set this tofalseor watch them vanish. It's the disk-space-saver for capacity-limited pods, and it works - but it's a shotgun, not a scalpel.
Outputs
Two STRINGs: full_path (the absolute path on the server, e.g. /workspace/ComfyUI/output/output_20260823_153000.zip) and filename_only (output_20260823_153000.zip). Wire either into a text-display node for convenience, but honestly most people just read them off the console or the file browser. The zip lands in output/ either way.
Install
Via ComfyUI Manager, search "ComfyUI-ZipOutput" and install. Or the manual way:
cd ComfyUI/custom_nodes/
git clone https://github.com/fudosanit/ComfyUI-ZipOutput.git
Then restart ComfyUI. There are no dependencies beyond Python's stdlib, so that's the whole install - no torch extras, no requirements.txt to fight.
Gotchas
- Timing matters. The zip captures whatever is on disk when the node runs, so place it after your Save Image nodes and give the queue a chance to finish writing. Images from a later batch won't be in it.
- The seed cache trap from above is the #1 way people think this node is broken. Keep the seed randomized.
- The zip deletion is ruthless when
clear_previous_zipsis on. If you're mid-batch and want an archive per run, turn it off - the zip-of-zip exclusion still protects you from nesting.
It's not clever, it's not overhyped, and it won't impress anyone. But on a rented box with a finite disk, it's the difference between grabbing one file and spending an hour in a file browser. That's the whole pitch.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 00–18446744073709550000 | — |
| clear_previous_zips | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| full_path | STRING | — |
| filename_only | STRING | — |