Nodes/ComfyUI-FrameFX/Edge FX Source Images
ComfyUI Node

Edge FX Source Images

Edge FX without the VRAM diet plan — the push/retract timeline helper

By mgfxer·Created 2 years ago·Updated 2 years ago· 25
Edge FX Source Images
  • image_stream
  • first_timeline
  • second_timeline
  • first_text_output
  • second_text_output
  • total_frames
num_images4
hold_length5
transition_length20
padding_frames0
push0
retract0

If your GPU can't run the full Edge-FX workflow without eating the desk, this is the node the pack's author built for you. Edge FX Source Images is the FrameFX workaround for the "lower ram" ipadapter option in the Edge-FX animation workflow - the one you reach for when a two-ipadapter setup is out of reach and you're barely keeping the whole thing in VRAM.

The honest headline, straight from the README: if you can run the two-ipadapter solution, use it, and you'll almost never need push and retract. This node exists for the people who can't.

What it does

It's a Mask Sequence Helper with a twist. The core job is the same: take a stream of images and expand each one into a timeline of held frames followed by transition frames, building two offset timelines that form a looping slideshow. Then it adds push and retract, which nudge the first cycle's hold length forward or backward in time.

Why would you want that? In a resource-starved Edge-FX setup, the effect can drift out of sync with the transition timeline. Push increases the hold on the first frame (keeping the initial image visible longer); retract shortens it. It's a resync knob, not a creative flourish - set push or retract a few frames and the effect lines back up with where the transition actually lands.

The inputs that matter

  • image_stream - your batch of images (IMAGE). Each one becomes a held segment.
  • num_images - how many of those to use. Defaults to 4.
  • hold_length (default 5) and transition_length (default 20) - the FrameFX timing skeleton in its standard 1:4 hold-to-transition ratio.
  • padding_frames - tail frames appended after the loop.
  • push and retract - the whole reason this node exists. Adjust the first cycle's hold length.

The outputs

The node returns two full image timelines plus their weight schedules:

  • first_timeline and second_timeline - the two offset image sequences (IMAGE).
  • first_text_output and second_text_output - mask definitions in frame:(weight), format, so timeline one fades out while timeline two fades in. These are the strings you feed into the mask/weight text input downstream.
  • total_frames - total including padding, for matching your sampler frame count.

Installing it

Standard FrameFX install - ComfyUI Manager, search ComfyUI-FrameFX, install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/mgfxer/ComfyUI-FrameFX

Pure Python, no dependencies beyond what ComfyUI ships, no model downloads.

One thing to check: this node class was added to the pack after its first release - there's literally a commit fixing the __init__.py to load it. If you installed FrameFX a while ago and don't see "Edge FX Source Images" in the menu, update the pack and restart.

Where people get burned

The push/retract values are frame counts, and they only adjust the first cycle's hold. Worth knowing: total_frames is computed from the unadjusted hold length, so once you push or retract by more than a frame or two, the actual timelines run longer than the counter claims - trust the timeline, or keep push/retract small. And if your sync problem shows up on the second or third cycle rather than the first, push/retract is the wrong tool; that's a transition_length problem. And remember the README's own advice: this is the lower-RAM path. If you can run the two-ipadapter setup, this node is usually unnecessary - the option existing doesn't mean you should use it.

Categoryadvanced

Inputs (7)

NameTypeDefaultDescription
image_streamIMAGE
num_imagesINT4
hold_lengthINT5
transition_lengthINT20
padding_framesINT0
pushINT0
retractINT0

Outputs (5)

NameTypeDescription
first_timelineIMAGE
second_timelineIMAGE
first_text_outputSTRING
second_text_outputSTRING
total_framesINT