Wan First-Middle-Last Frame to Video
Three anchors instead of two
- positive
- negative
- vae
- start_image
- middle_image
- end_image
- clip_vision_start_image
- clip_vision_middle_image
- clip_vision_end_image
- positive_high
- positive_low
- negative
- latent
Regular Wan 2.2 image-to-video gives you a start image and hopes for the best. This node gives you a start, a middle, and an end image, and pins the generation to all three. If you've ever watched an I2V clip wander off into something that doesn't resemble where you wanted it to land, that's the problem this solves - you're no longer just steering, you're bookending.
Where this fits
Wan 2.2's default I2V conditioning only really understands "start here." As the community learned fast, that's fine for a 3-5 second clip but falls apart the moment you want a shot to arrive somewhere specific - a punch connecting, a door opening, a face turning to camera. The standard workaround before nodes like this existed was last-frame chaining: generate a clip, grab its final frame, feed that in as the next clip's start image, repeat. It works, but it's sequential and drift accumulates fast.
This node is the single-node version of "anchor the middle too." It builds the conditioning for Wan 2.2's two-pass architecture (a high-noise expert for motion and composition, a low-noise expert for detail) with three separate reference points instead of one, each with its own strength dial so you decide how strictly the model has to hit each landmark. It's also the exact mechanism behind wallen0322's SVI workflow that put up the highest-scoring Wan post in the whole corpus - a 20-second continuous clip, no visible seams, 340 seconds to render. If you want to know what "good" looks like with this pack, that thread is it.
Inputs and outputs that matter
The required side is standard Wan I2V plumbing: positive and negative conditioning, a vae, plus width/height/length/batch_size (length wants to be a multiple of 4 plus 1 - 81 is the default and the safe choice).
What makes this node itself:
start_image/middle_image/end_image- all optional, all IMAGE inputs. You don't have to fill all three; leavemiddle_imageempty and you've effectively got a first/last-frame node. This is also wheremodecomes in - a combo that defaults toNORMAL; leave it there unless you're deliberately chasing a different conditioning behavior.middle_frame_ratio(default 0.5) - where in the timeline the middle image lands, as a fraction. 0.5 means dead center.high_noise_mid_strength(0.8) andlow_noise_mid_strength(0.2) - how hard the middle frame is enforced at each pass. This asymmetry is deliberate and it's straight from the author's own tuning notes: strong constraint while the high-noise pass is laying down motion and composition, loose constraint once the low-noise pass is just refining detail. This is the one setting worth reading twice - crank the low-noise value up and you'll fight the model into a flicker at the middle frame instead of a smooth pass-through.low_noise_start_strength/low_noise_end_strength(both default 1.0) - how strictly the start and end frames get held in the low-noise pass.structural_repulsion_boost(1.0-2.0, default 1.0 = off) - a motion-enhancement knob that only touches the high-noise stage. It builds a spatial gradient between adjacent reference frames so the motion between them reads as more pronounced, without touching color stability in the low-noise pass. 1.2-1.5 is the documented sweet spot; past 1.6 you're trading color stability for punchier motion.clip_vision_start_image/_middle_image/_end_image- optional CLIP Vision outputs per reference frame, for extra semantic guidance beyond the raw pixels.
Outputs: positive_high and positive_low (the two conditioning streams for the high/low-noise KSamplers), negative (pass through unchanged), and latent - the empty latent shaped for your length/width/height, ready for the first sampler.
Installing it
Through ComfyUI Manager: search "ComfyUI-Wan22FMLF" and install. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/wallen0322/ComfyUI-Wan22FMLF
Restart ComfyUI. No extra Python dependencies beyond what a Wan 2.2 workflow already needs - this is a pure conditioning/latent node, it doesn't ship its own model weights. You do need the actual Wan 2.2 I2V-A14B checkpoints (high-noise + low-noise) and a matching VAE, downloaded and pointed at the way you would for any Wan 2.2 workflow.
Common issues
Flickering right at the middle frame. This is the pack's own headline bug from before its 2025-10-31 rewrite, and the author's fix was structural - the node was rebuilt and the recommended defaults (high-noise mid strength 0.6-0.8, low-noise mid strength around 0.2, or 0 for complex scenes) are what to use if you're on an older workflow JSON. If you're pulling an example workflow off Reddit or Civitai from before that date, expect to have to re-wire it.
Resolution matters more than you'd think. The README calls out 720×1280 by name as a resolution that reliably triggers the middle-frame flicker - avoid it. Their recommended set is 480×832 / 832×480 / 576×1024 for lower-VRAM runs, or 704×1280 / 1280×704 if you have the headroom.
Speed LoRAs will fight your careful frame placement. This isn't pack-specific - it's the standing Wan 2.2 community warning: LightX2V/CausVid step-distillation LoRAs applied at full strength on both passes flatten motion and give you plastic-looking skin, which undercuts the whole point of anchoring three distinct frames. If you're using a speed LoRA, keep it to the low-noise pass at reduced strength (0.4-0.6) and leave the high-noise pass clean.
Use official, non-quantized Wan models. The README is explicit about this: quantized checkpoints degrade the frame-anchoring behavior more than they degrade ordinary I2V. If you're chasing every last drop of VRAM, this is the node where that trade-off bites hardest.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| width | INT | 83216–8192 | — |
| height | INT | 48016–8192 | — |
| length | INT | 811–8192 | — |
| batch_size | INT | 11–4096 | — |
| modeopt | COMBO | NORMAL | 2 options: NORMAL, SINGLE_PERSON |
| start_imageopt | IMAGE | — | |
| middle_imageopt | IMAGE | — | |
| end_imageopt | IMAGE | — | |
| middle_frame_ratioopt | FLOAT | 0.500–1 | — |
| high_noise_mid_strengthopt | FLOAT | 0.800–1 | — |
| low_noise_start_strengthopt | FLOAT | 1.000–1 | — |
| low_noise_mid_strengthopt | FLOAT | 0.200–1 | — |
| low_noise_end_strengthopt | FLOAT | 1.000–1 | — |
| structural_repulsion_boostopt | FLOAT | 1.001–2 | — |
| clip_vision_start_imageopt | CLIP_VISION_OUTPUT | — | |
| clip_vision_middle_imageopt | CLIP_VISION_OUTPUT | — | |
| clip_vision_end_imageopt | CLIP_VISION_OUTPUT | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive_high | CONDITIONING | — |
| positive_low | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |