Save Anything (SG11)
Save Anything (SG11) really means 'save an image, and only the first one'
- image
Let's be honest about the name up front: "Save Anything" saves images. That's it. No video, no JSON, no API calls, no keys. What it does do - and what the built-in SaveImage doesn't - is let you pick the exact filename, folder, and one of five formats, then write a file there. That's a small niche, but it's a real one, and it's the whole pack: a single node from a one-repo author who publishes in Chinese and lists a WeChat contact in the README. No community reputation to lean on, no drama. Just a utility.
What it actually does
The node (SG11_SaveAnything) takes an IMAGE tensor, clamps it to 0–1, scales to 0–255, converts to uint8, and hands it to Pillow to write. The save settings are actually thought-out: JPEG at quality 95 with 4:4:4 subsampling (no chroma smear), WebP at quality 90, PNG at compress level 6 with optimize on. For a node whose README is four bullet points, the quality choices are the most surprising thing in it - JPEG output genuinely looks good.
Here's the first trap, straight from the source: if len(image.shape) == 4: image = image[0]. Feed it a batch of four frames and it saves the first one and silently drops the other three. No batch loop, no error. If you're saving animated output or a batch of variations, this node is wrong for the job.
The second trap is that it never auto-increments. The filename is whatever string you type, every run overwrites whatever was there before. Core SaveImage appends a counter and embeds your workflow JSON into the PNG so "workflow included" culture survives the round-trip. This node writes a bare pixel file with no metadata. If you're sharing results, drag-and-drop reconstruction won't work on them.
The inputs that matter
All four inputs are required, and they're all plain widgets on the node - no wiring beyond the image itself:
- image - the only real input. Wire anything that outputs an IMAGE: a VAE decode, an upscaler, a
Load Image. - filename - string, default
output. Whatever you type, including no padding or counter. - save_dir - string, default
outputs. This is relative to ComfyUI's working directory, sooutputslands inComfyUI/outputs. Note it does not respect ComfyUI's output-directory setting or its auto-subfolder logic - it's a rawos.path.join. Start ComfyUI from a different folder and your files go somewhere else. Absolute paths work fine. - format - PNG, JPEG, WEBP, BMP, TIFF. The niche. Core ComfyUI gives you PNG and JPEG; WebP (much smaller files for photos), BMP and TIFF need a pack like this.
Installing it
ComfyUI Manager: search "Save Anything (SG11)" or "ComfyUI-SaveAnything-SG11" and install. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/SongGuo11/ComfyUI-SaveAnything-SG11
Then restart ComfyUI. The requirements.txt lists only torch, Pillow, and numpy - every one of those is already in any working ComfyUI environment, so there's no dependency install to babysit. That's about as painless as custom nodes get.
When to reach for it
Honestly, for most people the answer is "never": SaveImage is better for everyday saving because it auto-names, dedupes, and preserves your workflow. But this node earns its spot in two scenarios. First, when you need a file at a known, fixed path - a game pipeline, an API that watches a folder, a script that re-reads the same filename every run. Deterministic output paths are a feature there, not a bug. Second, when WebP or TIFF is the deliverable and you don't want to install a bigger suite like WAS for one format. That's the whole pitch: five formats, one predictable file, no surprises except the batch thing. Don't feed it a batch, and it won't bite.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| filename | STRING | output | — |
| image | IMAGE | — | |
| save_dir | STRING | outputs | — |
| format | COMBO | PNG | 5 options: PNG, JPEG, WEBP, BMP, TIFF |
Outputs (0)
No outputs