Enhanced Save Node
Save a PNG and FTP it to a server, with zero extra dependencies
- images
Enhanced Save Node is the built-in ComfyUI SaveImage node with two jobs bolted on: it names files with a human-readable timestamp, and it can push the finished PNG to an FTP server. That's it. One file, no dependencies, no models. It exists because the author - HebelHuber (Lukas Kiefer) - wanted his outputs to land on a web server automatically, and it does exactly that.
Reach for this when your ComfyUI box isn't a cozy desktop app but a headless machine that's supposed to be doing something with its output. Auto-publishing a gallery, dumping renders into a WordPress media library over FTP, wiring generation into a script that watches a folder. The "upload my result somewhere" instinct is real - people keep building nicer versions of it (the 2025 "ComfyUI Save/Load Extended" pack on r/comfyui covers S3, Drive, and a dozen more backends) - but for a bare FTP push, this is the minimal, dependency-free option. If you just want timestamped filenames and no FTP at all, it does that too.
How it works
The node is a near-copy of core ComfyUI's save_images - same path logic, same compress_level=4, same embedding of the full workflow JSON into the PNG metadata. So whatever you generate through it is still a proper "drag back into ComfyUI and the whole graph reconstructs" file, which matters in a community where "workflow included" is the norm. What's new is downstream:
- Files are named
{prefix}_{YYYY-MM-DD-HH-MM-SS}.pnginstead of the stock counter-style_00001_. - If
uploadis on, a background thread takes the saved file andstorbinarys it to your FTP server using Python's built-inftplib. Nothing new to install - it's all stdlib.
The inputs that matter
Six fields, all in the required block, and only a few you'll actually touch:
- images - your IMAGE tensor. Wire it from the VAE Decode or whatever's at the end of your chain.
- upload - defaults to true. This is the trap: leave it on with no server configured and every save spawns a thread that fails to connect. Flip it off if you only want timestamped names.
- url, username, password - the FTP endpoint and credentials. The defaults are literally
URL,USERNAME,PASSWORD, so they will never accidentally connect. - filename_prefix - prepended to the timestamp; default
ComfyUI. - verbose - prints upload progress to the console instead of saying nothing.
There are no outputs and no optional inputs. It's an output node - a dead end in the graph that hands its results to the filesystem (and optionally a server).
Installing it
No README ships with the repo, no requirements.txt, no model files - the only thing that installs is __init__.py, and it imports nothing ComfyUI doesn't already ship. Via ComfyUI Manager, search "comfyui-enhanced-save-node". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/HebelHuber/comfyui-enhanced-save-node
Then restart ComfyUI. That's the whole ceremony.
Where people get burned
- Plain FTP only. The code uses
ftplib.FTP, which is unencrypted FTP. No SFTP, no FTPS, no cloud SDKs. If your host only offers SFTP, this node will never connect - that's not a bug in your config. - Failures are silent-ish. Uploads run in a daemon thread after the file is saved, so the queue reports success, the image is on disk, and the FTP error is just a traceback in the console. If you need certainty that the upload landed, keep
verboseon and watch the log. - Same-second collisions. The timestamp is second-resolution. Two saves with the same prefix in the same second overwrite each other, where the stock counter node wouldn't. Fine for most use, but know it's there.
If your pipeline needs a progress bar and a dozen cloud backends, go with the big modern pack. If you need "save this PNG and push it to my server with zero moving parts," this is it.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| username | STRING | USERNAME | — |
| password | STRING | PASSWORD | — |
| url | STRING | URL | — |
| upload | BOOLEAN | true | — |
| verbose | BOOLEAN | true | — |
| filename_prefix | STRING | ComfyUI | — |
Outputs (0)
No outputs