SaveAnimatedGIF
Save that animation without leaving the graph — a dedicated GIF node, warts included
- images
SaveAnimatedGIF is a terminal node: you feed it the image batch that your sampler, video model, or frame-upscaler just produced, and it writes one looping animated GIF into your ComfyUI output folder. No outputs, no chained downstream nodes - it's the last thing in the graph, doing one job. It comes from a two-node pack (this one plus SaveAnimatedWEBPRevise) by MakkiShizu, a utility that started life as a pull request to ComfyUI core.
So when do you actually reach for it? When the thing you want to share is a GIF specifically - Discord, forums, image boards, docs. Core ComfyUI's animated saver was stripped to WEBP-only in the newer IO-schema refactor, and VideoHelperSuite's video node can emit GIFs but, as one r/StableDiffusion user put it, with no quality controls to speak of. This is the "I just want a GIF" lever. It's also the pack's claim to fame in the only real community mention it has: someone pointing another user at it as the quality-conscious alternative to VHS.
How it works
The mechanism is boring in the best way. Each IMAGE tensor in your batch gets multiplied by 255 and clamped to bytes, so every frame becomes a PIL image. Then frame zero is saved with save_all=True, the rest passed as append_images, and the timing comes from your fps: each frame gets 1000/fps milliseconds. loop=0 means it repeats forever. The file lands in ComfyUI/output as {filename_prefix}_{00001}_.gif, with a counter that auto-increments so you never clobber an earlier save.
One nice touch inherited from the core save nodes: it stuffs the prompt and the workflow into the GIF's EXIF metadata, so "workflow included" survives on GIFs you share - drag one back in and the graph rebuilds. That's a real courtesy if you post workflows.
The inputs that actually matter
images- the IMAGE batch; every frame becomes a GIF frame. Point it at your VAE-decoded frames.fps(default 6) - sets frame duration. 6 is that choppy silent-film look; 12–15 reads as motion; anything under 2 is basically a slideshow.filename_prefix(defaultComfyUI) - rename it or your output folder fills withComfyUI_00001_.gifuntil you can't tell anything apart.
The other two are honest-to-goodness decoys here. lossless (default true) and method (default/fastest/slowest) both come from the WEBP node this was forked from, and on the GIF path they're computed and then ignored - Pillow doesn't even read them when saving GIF. method especially is never passed to the save call at all. Don't touch them, and don't feel bad about it.
Also, GIF is a 256-color format, so gradients band and colors shift. That's the container talking, not a bug here.
Installing it
Install via ComfyUI Manager - search "SaveAnimatedGIF" (pack title ComfyUI-SaveAnimatedGIF) - or, if you prefer the terminal:
cd ComfyUI/custom_nodes
git clone https://github.com/MakkiShizu/ComfyUI-SaveAnimatedGIF
# restart ComfyUI
Good news: zero heavy dependencies and no model files. It only uses Pillow and numpy, which ComfyUI already ships, so install is genuinely one step.
The awkward news: as of this writing that GitHub repo returns 404 - the author's account is still active, but the repo was deleted or made private. So right now, both Manager and git clone will fail until it's republished. If you already have it installed, it keeps working - it's a local copy and nothing phones home. Can't install it? You're not missing a superpower: the code it runs is preserved in ComfyUI's PR archive (ComfyNodePRs/PR-ComfyUI-SaveAnimatedGIF-…), and a core Save Animated WEBP or VHS node gets you 95% of the way.
Common issues
- "Nothing showed up." It's an output node - you must wire an image batch into
images. The file goes toComfyUI/output, and the node preview shows the result. - Banding on smooth gradients. Inherent to GIF's palette. For smoother output, save WEBP instead (the pack's other node) or accept the 256-color tax.
- Node breaks after a ComfyUI update. This is the real, evergreen failure mode for legacy-style save nodes - the
validate_inputs() takes 3 positional arguments but 4 were givencomplaint is a known one on core's WEBP node after updates. This pack is unmaintained and just as exposed; if a future ComfyUI breaks it, the fix is usually to find a maintained equivalent, not to wait for a patch.
It's a tiny, honest utility: one job, no surprises, no dependencies. Install it while the repo is up, use it when a GIF is the deliverable, and don't overthink the two inputs that quietly do nothing.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| filename_prefix | STRING | ComfyUI | — |
| fps | FLOAT | 6.000.01–1000 | — |
| lossless | BOOLEAN | true | — |
| method | COMBO | 3 options: default, fastest, slowest |
Outputs (0)
No outputs