WanSCAILToVideo
Motion transfer without the stick figure
- positive
- negative
- vae
- pose_video
- pose_video_mask
- reference_image
- reference_image_mask
- clip_vision_output
- previous_frames
- positive
- negative
- latent
- video_frame_offset
SCAIL-2 is the motion-transfer model that ditched the skeleton, and WanSCAILToVideo is how you drive it in ComfyUI. The whole pitch in one sentence, from the workflow author: older motion transfer (Wan Animate, SCAIL-1) squeezed a driving video down to a stick figure first, and "the things that get lost in that conversion, like depth and contact, are exactly the things that matter." SCAIL-2 skips the pose skeleton entirely - you feed it a reference image, a driving video, and colored per-identity masks, and it transfers the motion directly.
That's why it does things stick-figure pipelines couldn't: multiple characters moving together, non-human subjects, even cross-identity replacement where you swap who's doing the moving. It shipped straight into ComfyUI core via Kijai's PR - no custom node pack, which was rare enough that the announcement thread's top comment was basically "this deserves a better announcement."
How it works
The node builds the conditioning stack for a SCAIL-2 generation: it encodes the pose video into a latent (downscaled to half resolution), attaches the reference image's CLIP vision features, and writes the whole thing plus an empty latent for sampling.
The inputs that matter, in rough order of "will you actually set this":
- reference_image - the subject. First image is the primary identity; extra batch images become additional views.
- pose_video - the driving video.
- pose_video_mask / reference_image_mask - SCAIL-2's colored per-identity SAM3 masks. This is the input people fumble: each identity needs its own consistent color across both masks, and you generate them with the SCAIL-2 Colored Mask node (which renders SAM3 tracks into exactly this format).
- replacement_mode - false = Animation Mode (black mask background), true = Replacement Mode (white background). Wrong mode, wrong result.
- pose_strength / pose_start / pose_end - how hard and over which sampling steps the pose conditioning applies.
- video_frame_offset / previous_frames / previous_frame_count - the chunking plumbing. Native context is 81 frames; longer videos are generated in chunks and stitched, and these three fields chain chunks together.
Outputs: positive/negative, latent for the sampler, and video_frame_offset to wire into the next chunk.
Where people get burned
- The masks. SCAIL-2 quality lives or dies on the colored masks being right - correct colors, correct black/white background per mode. Get this wrong and the model either ignores an identity or merges two.
- Chunking confusion. It's trained at 81-frame chunks with a 76-frame step, and
previous_frame_countdefaults to 5 anchored tail frames. Follow the offsets from chunk to chunk and identity drift mostly disappears; skip the plumbing and you get it anyway. - Identity drift is real across long takes. The honest community answer when someone wanted to fix it with a character LoRA: a LoRA defeats the point - if you want that much control, use VACE or Animate instead.
- Check the anatomy. SCAIL-2 showcase threads are famous for +hundreds scores and top comments about terrifying proportions. It's flexible, not flawless.
Ships with ComfyUI core, marked experimental, and needs SCAIL-2 model files (the Comfy-Org/SCAIL-2 scaled/MXFP8 weights are the sane download, not the 65GB raw repo).
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| width | INT | 51232–16384 | — |
| height | INT | 89632–16384 | — |
| length | INT | 811–16384 | — |
| batch_size | INT | 11–4096 | — |
| pose_strength | FLOAT | 1.000–10 | Strength of the pose latent. |
| pose_start | FLOAT | 0.000–1 | Start step of the pose conditioning. |
| pose_end | FLOAT | 1.000–1 | End step of the pose conditioning. |
| video_frame_offset | INT | 00–16384 | Cumulative output frame this chunk begins at. Wire from the previous chunk's video_frame_offset output. |
| previous_frame_count | INT | 51–16384 | Tail frames of previous_frames to anchor. SCAIL-2 trained at 5 (81-frame chunks, 76-frame step). |
| pose_videoopt | IMAGE | Video used for pose conditioning. Will be downscaled to half the resolution of the main video. | |
| pose_video_maskopt | IMAGE | SCAIL-2 only. Colored per-identity SAM3 mask video at the same resolution as pose_video. | |
| replacement_modeopt | BOOLEAN | false | SCAIL-2 only. False = Animation Mode (pose_video_mask should have black background). True = Replacement Mode (pose_video_mask should have white background). |
| reference_imageopt | IMAGE | Reference image. The first image is the primary reference (composite all identities onto it). SCAIL-2: extra batch images are used as additional views (back view, close-up, occluded background), each needing a matching reference_image_mask in that identity's color. | |
| reference_image_maskopt | IMAGE | SCAIL-2 only. Colored reference mask, batch matching reference_image (first = primary reference mask, rest = identity masks for the additional reference_image). | |
| clip_vision_outputopt | CLIP_VISION_OUTPUT | CLIP vision features for conditioning. Model is trained with stretch resize to aspect ratio. | |
| previous_framesopt | IMAGE | SCAIL-2 only. Full decoded output of the previous chunk. Only the last previous_frame_count are used as the extension anchor. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | Empty latent of the generation size. |
| video_frame_offset | INT | Adjusted offset + length. Wire into the next chunk. |