Save Image to WebDAV
Push your finished renders straight to a WebDAV server — NAS, Nextcloud, whatever
- image
- image
This is an output node with a very specific job: instead of just dropping your render into ComfyUI's output folder, it encodes the image to PNG and uploads it to a WebDAV server using your credentials. WebDAV is the old-but-everywhere protocol that Nextcloud, ownCloud, Synology's Web File Station, and most NAS boxes speak natively. If you run a Synology on your LAN or pay for a Nextcloud instance, this turns "generate, then manually sync the output folder" into "everything just lands on the server."
Let's be honest about the audience first. WebDAV save nodes barely register in the ComfyUI community - you won't find a flood of reddit threads about them. This is a niche utility for a specific kind of setup: a GPU box that generates, a phone or laptop or script that collects. If that's you, it saves you a real chore every single run.
How it works
The mechanism is refreshingly simple, and it's all in one file. The node takes your IMAGE tensor - the tooltip says "Single image or multi images," so a batch of frames is fine - converts each one to a PIL image, encodes it to PNG in memory, then does an HTTP PUT with basic auth (your username/password) to:
{webdav_url}/YYYY-MM-DD/YYYYMMDD_HHMMSS_<random 3-digit>.png
So the server side gets a tidy date-folder structure and timestamped filenames. If the PUT fails, it retries up to three times, three seconds apart. If it's still dead and you've enabled save_local_when_fail, the image is written to output/upload-fail/ instead, so you don't lose a render to a flaky connection. That's the whole pipeline - no file staging on disk, no external services.
The inputs that matter
You'll touch maybe three of these:
- webdav_url - the base URL of your server. The default is literally
http://example.com/webdav/, so the first thing you do is replace it. Most setups end with a slash; keep it that way. - webdav_username / webdav_password - plain HTTP basic auth. Change both from the
username/passwordplaceholders. - save_local_when_fail - set it to Yes while you're getting the URL right. It's your safety net.
The other two: async_upload fires the upload on a background thread, and image is the render itself. The output is also an IMAGE, passed through untouched, so you can chain it into a preview or another save node and this stays out of your way.
Installing it
No requirements.txt, no model downloads, no pip dependency dance. The code only imports requests, PIL, and numpy - all of which ComfyUI already ships with. You install via ComfyUI Manager (search "Save Image To Webdav") or:
cd ComfyUI/custom_nodes
git clone https://github.com/goldwins520/Comfyui_saveimg2webdav
then restart ComfyUI. In a world where the ecosystem's #1 complaint is dependency hell, this pack is the rare clean install. It's also tiny and fairly young - a single-commit project from May 2025 - so expect exactly what you see in the README and nothing more.
Gotchas and troubleshooting
- Your password is in your workflow file. The username and password are plaintext string inputs, so they get baked into the workflow JSON. The author's README carries an unusually blunt warning about not sharing outputs - the real leak vector is sharing a workflow that contains this node. If you share, strip the credentials first.
async_uploadreturns before the upload finishes. The queue can show "done" while a background thread is still pushing bytes. If you quit ComfyUI mid-upload, that image is gone. Keep it off unless you genuinely need the UI to not block.- Filenames are timestamps, not prompt names. Fine for archiving, mildly annoying if you wanted organized-by-prompt output.
- Use https outside your LAN. Basic auth sends your credentials with every request, so plain
http://is fine on your home network and a bad idea over the internet. - If upload fails and
save_local_when_failis off, you just get console errors. The render is not saved anywhere. That's the footgun that bites people on the first run - flip the toggle on until you trust the server.
If your workflow is "generate on one box, everything lands on the server," this is the node. Set the URL, set the credentials, and let it run.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Single image or multi images | |
| webdav_url | STRING | http://example.com/webdav/ | — |
| save_local_when_fail | BOOLEAN | false | — |
| webdav_username | STRING | username | — |
| webdav_password | STRING | password | — |
| async_upload | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |