GIF Export Gate
The one node keeping your test runs from filling output/
- images
- images
Here's the problem this node exists to solve. In ComfyUI, a Save/Combine node is an output node - the engine always runs it. So the moment you wire your frames into the final VHS_VideoCombine, every single Run writes another GIF to disk. You nudge the font size, you Run, you've got gif_00042.gif. Do that forty times while you're fumbling with text placement and you've got a folder full of garbage and no idea which one you liked.
The GIF Export Gate is the valve that stops it. It sits inline between your finished frames and the permanent saver, and by default it lets nothing through at all.
How it works
The node is deliberately dumb on the data path. In export_enabled mode it hands the exact same images batch straight back out - it doesn't resize, re-encode, or touch a pixel. It's a gate, not a filter.
When export_enabled is off, it returns an ExecutionBlocker for its output instead of the batch. That's the important bit, and it's why this node feels like magic the first time you use it: a blocked output doesn't throw an error, it tells the engine that everything downstream of this socket has nothing to consume, so those nodes get pruned from the run entirely. The permanent VHS_VideoCombine never executes. You get a normal, successful run with the preview branch intact and no new GIF on disk. See the node-plumbing layer notes for the general shape of this pattern - this is the same family as the null-output placeholder trick, just used as a deliberate wall.
The default is false, and that default is the feature. Preview-first only works if forgetting to change something fails safe.
The inputs and output that matter
There are exactly two inputs, both required:
images(IMAGE) - your finished frame batch. In the pack's bundled workflow this comes off the Text Overlay node, or from a second combine branch.export_enabled(BOOLEAN, defaultfalse) - the switch. And here's the thing you'll notice on the canvas: you don't see this widget. The pack ships a frontend extension that hides it and replaces it with a big green ✓ APPROVE & EXPORT FINAL GIF button, which sets the boolean totrue, queues one run, then flips it back tofalseso you drop straight back into preview mode.
The single output is images (IMAGE), and it goes into the permanent saver - VHS_VideoCombine with save_output on, writing to ComfyUI/output/GIFToolkit.
Install
ComfyUI Manager → search GIF Toolkit → Install → restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/oekobudde/ComfyUI-GIFToolkit.git
The pack has no pip dependencies of its own (its pyproject.toml declares an empty dependency list), but the workflow around it needs ComfyUI-VideoHelperSuite installed separately - that's where VHS_VideoCombine and the VHS_VIDEOINFO type come from. If you get "missing node types" on a GIF Toolkit workflow, VideoHelperSuite is almost always what's absent.
Common issues
"My final GIF isn't in the output folder." Working as intended. A normal Run is preview-mode: the temp combine node (save_output = false) writes a throwaway you can look at, and the gate blocks the real one. Click the approve button.
You see a plain checkbox labelled export_enabled instead of the button. The frontend extension didn't load - usually a stale browser cache after an update, or ComfyUI wasn't fully restarted. Hard-refresh, and restart ComfyUI if that doesn't do it. The checkbox does exactly the same job if you want to tick it yourself; that's not a broken install, just the ugly version.
Only one GIF appeared after approving. Right - the gate performs one export run. It isn't sticky. If you want to iterate on something else, you edit, Run the preview, look, then approve again. That's the loop the whole pack is built around, and it's a nicer one than the usual "hope the file I just overwrote was the good one."
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| export_enabled | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |