π§ FrameSave (Dehypnotic)
Preview every frame, save only the ones you picked
- images
FrameSave (Dehypnotic) is the "look before you save" node for image sequences. You feed it a batch of frames from an animation workflow, it renders them into a clickable, full-brightness gallery where you can scrub, zoom, and select exactly which frames you want - then it saves only those to a real folder. If you've ever rendered 240 frames of an AnimateDiff or video pass and only wanted 40 of them, this is the node that stops you from doing that by hand.
The default Save Image behavior in ComfyUI is all-or-nothing: every frame in the batch lands on disk, and you sort it out later. That's fine for stills and wasteful for animation. FrameSave splits the job in two - a fast temp render for looking, then a deliberate save for keeping - which is a much saner way to work with a long sequence.
How it works
On every execution the node clears temp/dehypnotic_frame_save, applies your frame range and step filters, and writes the surviving frames as fast PNGs (compression level 1, no slow optimize pass) to that temp folder. A 500px gallery shows them at full brightness - the brightness matters, because dark animation frames are nearly impossible to judge at a glance. Clicking a frame or Shift-clicking a range toggles selection with mint-green borders, and double-click zooms to full resolution.
The actual save happens through an HTTP endpoint: when you hit the save button, the frontend asks the node's server-side handler to copy the selected frames from temp to your target file_path. That path is validated against a whitelist - by default you can only write under ComfyUI/output/ - which is the same security posture the whole pack takes for its save nodes.
Inputs and outputs
images(requiredIMAGE) - the frame batch. That's the only mandatory input.file_path(optional) - the destination folder. Empty means ComfyUI'soutput/.start_frame(default 1) - first frame to include, 1-indexed.end_frame(default 0) - last frame;0means "all remaining frames."frame_step(default 1) - interval, so3keeps frames 1, 4, 7β¦
There are no outputs - it's a pure output node; everything it does is in the UI and on disk.
Installing it
ComfyUI Manager: search "Dehypnotic", install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Dehypnotic/ComfyUI-Dehypnotic
Then restart. If you have any of the author's old split repos installed (comfyui-aspect-ratio-advanced, comfyui-numbered-text, comfyui-range-to-string, comfyui-dehypnotic-save-nodes), delete them first - they conflict with this merged pack. No requirements.txt and no models; FrameSave runs on numpy, torch, and Pillow, all already present.
If you want to save outside ComfyUI/output/, you need the whitelist file. Create dehypnotic_save_allowed_paths.json - the README and node description both suggest ComfyUI/user/config/ so updates don't overwrite it - containing:
{ "allowed_roots": ["D:/ImageExports", "E:/TeamShare/Images"] }
A whitelisted root allows that folder and everything below it; whitelist a deeper path if you want it tighter.
Common issues
- "Can't save there" errors. The whitelist is doing its job. Add the root to
dehypnotic_save_allowed_paths.json, put the file somewhere that survives updates, and restart. - Frames missing that you expected. The filters are 1-indexed and inclusive on the start.
start_frame=2skips the first frame, andend_frame=0means "everything to the end" - it's not a literal zero frame. - Don't put anything in the temp folder yourself. It's emptied on every run.
- The gallery shows frames but nothing saves when you click. Check you've actually got frames selected - the default selection is none on first view, on purpose, so a stray click doesn't dump 200 files.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| file_pathopt | STRING | β | |
| start_frameopt | INT | 11β999999 | β |
| end_frameopt | INT | 00β999999 | β |
| frame_stepopt | INT | 11β999999 | β |
Outputs (0)
No outputs