Save Image (SCP Upload)
Save locally AND push the PNG to your server in one step
- images
The name is only half a lie. Save Image (SCP Upload) is exactly the stock SaveImage node - it writes a numbered PNG into ComfyUI/output/ - and then, in the same breath, pushes that file to a remote server over SSH. If you render on one box but want images landing on a web root, a portfolio host, or a backup drive without manually rsync-ing after every batch, this is the drop-in replacement you're looking for. It's a niche, but it's a real one.
How it works
On every run the node converts the incoming IMAGE tensor to a PNG, saves it locally with the usual auto-incrementing {prefix}_00001.png naming, then - unless you've flipped the upload toggle off - opens an SSH connection with paramiko and transfers the file.
Fun fact: it never actually calls scp. The "SCP" is SFTP over SSH (ssh.open_sftp() + sftp.put()). Same credentials, same port 22, and honestly SFTP is the saner choice for programmatic upload anyway, so you get a misleading name with fine behavior. Before connecting it runs a DNS check and a verbose six-step play-by-play in the console - this node is chatty. Don't panic at the wall of = banners at startup; that's just how it tells you it loaded.
The two config files (this is where people trip)
Credentials and destinations live in two separate places, and both are read when ComfyUI starts:
.env- holdsSCP_HOST,SCP_PORT,SCP_USERNAME,SCP_PASSWORD. The code looks for it in the node's folder and your ComfyUI root, so the README's "put it at the ComfyUI root" advice works.config.json- in the node folder, maps profile names to remote directories. Theprofiledropdown you see in the UI is literally the keys of this file.
Edit either one and restart ComfyUI, or the node keeps running on the old values.
Inputs that matter
- images (
IMAGE, required) - wire the VAE-decoded output here. It's a batch-capable save, so a batch of 4 images becomes 4 local files and 4 uploads. - filename_prefix (
STRING, defaultComfyUI) - sets the local name (myproject_00001.png). The remote copy gets a timestamp appended (myproject_00001_20260827_153045.png), so re-running with the same prefix doesn't overwrite what's already on the server. - profile (dropdown) - which remote directory from
config.jsongets the file. - upload_enabled (
BOOLEAN, default on) - turn it off and it degrades into a plain localSaveImage. Genuinely handy when you're testing the upload path in isolation.
There are no outputs. Like SaveImage, it's a terminal output node - nothing wires out of it.
Installing it
ComfyUI Manager: search ComfyUI-SCP-nodes. Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/ComfyUI-SCP-nodes
pip install -r requirements.txt # paramiko + python-dotenv
Portable Windows installs need to point pip at python_embeded\python.exe; the repo ships install-portable.bat and install.sh for the copy-files approach. Then create .env in your ComfyUI root, edit config.json to match your server paths, and restart. Only two dependencies, no model downloads.
Where you'll get burned
- "SCP configuration incomplete" - a missing
.envor a blank field. The shipped code is password-only auth; the README's advice to switch to SSH keys literally requires editingSaveImageSCP.pyyourself. Either set a real password in.envor be ready to patch. - Profile not in the dropdown - restart after editing
config.json. If the JSON is broken, it silently falls back to a singledefault→/tmp/. - Upload fails but your render is safe - the node catches upload exceptions, prints the error, and returns the local save anyway. A down server never costs you the image.
- One metadata caveat: the PNG that lands on your server carries only the node's own small metadata block (profile, timestamp, remote filename) - not the full workflow chunk the stock node's saves carry. Don't expect to drag the server copy back onto the canvas and reconstruct the graph; the local file is your master.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| filename_prefix | STRING | ComfyUI | — |
| profile | COMBO | default | 5 options: default, portfolio, testing, production, backup |
| upload_enabledopt | BOOLEAN | true | — |
Outputs (0)
No outputs