EXPORT (JOV) π½
Save GIFs, GIFSKI and stills without leaving your graph
- πΎ
EXPORT (JOV) π½ is the node you reach for when the default "Save Image" isn't enough and you want your frames out as an animation. It's the save-to-disk workhorse of Jovimetrix - feed it a stack of images and it writes them as a GIF, a GIFSKI-encoded GIF, or a plain PNG/JPG sequence. For anything that produces frames over time - an animated workflow, a morphing latent loop, a batch of variations - this is the clean exit ramp.
The name is a small lie: it doesn't call any API and it needs no key. It's just a smarter Save Image. ComfyUI's built-in saver writes one file; this one treats your batch as a timeline. That's the entire reason it exists.
How it works
Every node in Jovimetrix treats a batch of images like a list, and EXPORT leans into that. Give it N frames and it either stamps them all as stills (png, jpg) or stitches the whole batch into one looping animation. The GIF path uses Pillow under the hood; pick gifski in FORMAT and it shells out to the gifski encoder, which gives you dramatically better-looking GIFs at the same size - noticeably smoother gradients and no banding. That's the option I'd actually reach for if the output's going anywhere public.
The inputs that matter
Most of the wiring is self-explanatory, but three fields do the real work:
- πΎ (Pixel Data) - your image or mask batch. Jovimetrix inputs accept RGBA, RGB, or a raw MASK, so you can export masks directly if you want.
- FORMAT -
gif,png, orjpg.gifandgifskiare animation modes; the others write one file per frame. - π€ (output directory) - defaults to your ComfyUI output folder. Set it to a real path and it creates it for you.
Then the polish knobs: PREFIX (the filename base, defaults to jovi), OVERWRITE (when off, it auto-appends a counter so it never clobbers an existing file - handy when you re-run a queue a lot), QUALITY and MOTION (gifski quality and motion quality, both 1β100), ποΈ (FPS, default 24), π (loop count, 0 = loop forever), and OPT (optimization on the plain GIF path).
Note the node is a true output node - no output ports. It just saves and tells you where. If you want the frames back and saved, branch the same image stream into both this node and something like a VAE Decode + preview.
Installing it
EXPORT ships inside Jovimetrix, so it's the pack install:
# ComfyUI Manager: search "Jovimetrix" and install from the manager database
# or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Amorano/Jovimetrix.git
cd Jovimetrix
pip install -r requirements.txt
Then restart ComfyUI. The requirements pull in opencv-contrib-python, matplotlib, Pillow, numpy, and two git-installed dependencies (cozy_comfyui / cozy_comfy) - the first install takes a minute, and if your pip grumbles about the git URLs, make sure you're on a network that can reach GitHub.
Troubleshooting
- Nothing lands in my folder - check the π€ path. It defaults to ComfyUI's output dir; if you've moved your install, that default may point somewhere surprising. And on Windows, the brief's
/tmp/...style default is just the placeholder for "your output dir." - GIF comes out huge or banded - switch FORMAT to
gifskiif the binary is available. If gifski mode silently produces nothing, that's usually thegifskiexecutable missing from PATH. - Jovimetrix shows a stale version of this node - see the pack README's warning about 1.7.48 vs 2.x; this node's fine on either, but update the whole pack deliberately.
One last tip: because EXPORT is a NOT_IDEMPOTENT node, ComfyUI re-runs it whenever anything upstream changes - which is exactly what you want for animation frames, and mildly annoying if you only wanted a quick preview. Use a regular preview node for drafts, EXPORT for the final cut.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| πΎopt | IMAGE,MASK | Pixel Data (RGBA, RGB or Grayscale) | |
| π€opt | STRING | /tmp/ComfyUI/output | Pass through another route node to pre-populate the outputs. |
| FORMATopt | COMBO | gif | Pass through another route node to pre-populate the outputs. |
| PREFIXopt | STRING | jovi | Pass through another route node to pre-populate the outputs. |
| OVERWRITEopt | BOOLEAN | false | Pass through another route node to pre-populate the outputs. |
| OPTopt | BOOLEAN | false | Pass through another route node to pre-populate the outputs. |
| QUALITYopt | INT | 901β100 | Pass through another route node to pre-populate the outputs. |
| MOTIONopt | INT | 1001β100 | Pass through another route node to pre-populate the outputs. |
| ποΈopt | INT | 241β60 | Pass through another route node to pre-populate the outputs. |
| πopt | INT | 0 | Pass through another route node to pre-populate the outputs. |
Outputs (0)
No outputs