Local Save Image
Your Images, in Your Downloads Folder — Not the Server's
- images
- IMAGE
Stock ComfyUI has exactly one place your generated images go: the server's output/ folder, sitting wherever the process runs. If that server is your own desktop, that's fine - you know where to look. But a huge chunk of ComfyUI these days runs somewhere else: a rented GPU box, a homelab in the other room, a friend's machine you SSH into. And suddenly "save" means "dig through a remote filesystem to fetch a file." The Local Save Image node from yhayano-ponotech/comfyui-save-image-local exists to kill that step: run your workflow, and the image pops into your browser's Downloads folder, wherever you happen to be sitting.
It's a small, single-purpose pack - the kind that makes up the long tail of the ComfyUI custom-node ecosystem the ecosystem essay in our KB describes: thousands of tiny extensions, each solving one annoyance. This one solves the "save to the machine I'm actually on" annoyance.
How it works
The mechanism is the interesting part, because the node never writes a file to the server at all. Drop it in a workflow and the Python side does this:
- Takes your
IMAGEtensor (it handles whole batches, not just single images). - Converts each frame to a Pillow image, then base64-encodes it.
- Pushes the base64 blob over the websocket to the frontend via
PromptServer.instance.send_sync("local_save_data", ...). - The pack's small JS extension (in
js/local_save.js) catches that message, turns the base64 back into a Blob, and fires a normal browser download.
So "local" means your local machine, not the server's. That also tells you the trade-offs, which I'll get to.
The inputs that matter
There are only three, all required:
- images - the
IMAGEtensor, straight off yourVAE Decode. - prefix - filename prefix, defaults to
generated. Files come out as{prefix}_{timestamp}_{serial}.{ext}, e.g.generated_20250115_112814_001.png. The timestamp is stamped once per execution, and the serial number counts images inside the batch, so a batch of four gives you..._001through..._004. - file_format -
PNGorJPEG. JPEG is fixed at quality 95 and, being JPEG, silently drops any alpha channel. If your image has transparency, stay on PNG.
It also returns the IMAGE unchanged - unusual for an output node - so you can save a mid-pipeline result and keep wiring downstream without a second output branch.
Installing it
It's on the Comfy Registry (publisher yas-ponotech), so the easy route is ComfyUI Manager: search "Local Save Image" or "ComfyUI Local Save Node" and install. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/yhayano-ponotech/comfyui-save-image-local
Then restart ComfyUI. No model files, no extra pip packages - pyproject.toml lists zero dependencies, and everything it touches (torch, Pillow, numpy) ships with stock ComfyUI. This is about as frictionless as a custom node gets.
Where people get burned
Because the download happens in the frontend, a few things bite:
- The browser has to be open and attached. If you run a workflow headless (API-only, or a queue while the tab is closed), the websocket message has no listener and your images silently vanish - they were never written anywhere. This node is for interactive use, not automation.
- Browsers gate multiple downloads. A batch of 20 images will usually trigger a "let this site download multiple files?" prompt the first time. That's your browser, not the node.
- Base64 is ~33% fatter than the raw bytes. A big batch of high-res PNGs means a chunky websocket transfer and real memory pressure on the browser tab. Keep batches sensible.
- The README's clone URL is a placeholder (
your-username/comfyui_local_save.git) - a copy-paste artifact. Use the real repo above.
Honest take: if your ComfyUI runs on your own desktop, the stock Save Image node already does what you need. Reach for this one when your workflow lives somewhere remote - that's the single case it's genuinely built for.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| prefix | STRING | generated | — |
| file_format | COMBO | PNG | 2 options: PNG, JPEG |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |