Sunnyside logoSUNNYSIDE
HOMERESUMEPORTFOLIOGEN AI
COMFYUI WORKFLOW CASE STUDY

WAN 2.2 ANIMATE
VERTICAL VIDEO PIPELINE

A verbose production breakdown of the ComfyUI graph for aespa_karina_goodstuff_ytshort. The workflow turns an editorial source clip and selected IPA reference still into a 1088 x 1920 ProRes master using WAN 2.2 Animate, pose/face preprocessing, CLIP Vision identity conditioning, and long-window video sampling.

WORKFLOW NODES
75
ComfyUI graph objects
LINKS
74
Explicit node connections
CANVAS
1088 x 1920
Vertical short output
DURATION
360f / 12s
12 seconds x 30fps
FRAME OFFSET
f600
Nominal 20s source start
MODEL
WAN 2.2 14B
BF16 Animate checkpoint
WORKFLOW CANVAS

Embedded ComfyGUI viewer loading the production workflow JSON with the SunnysideTV v2 theme. Pan, zoom, select nodes, and open the inspector from the canvas toolbar.

Loading workflow canvas
01 / TIMELINE

FROM EDIT WINDOW TO RENDER MASTER

The workflow is built like a post-production pipeline: choose a frame window, extract motion and identity controls, load the model stack, sample in overlapping context windows, then decode and package the result.

Frame timeline
IPA20 reference
f0
f300
f600
f960
f1200
f1800
0 to 20s
Source context before current render window.
20 to 32s
Active 360-frame generation target.
81f context
2.7-second temporal window per pass.
48f overlap
1.6-second blend region between windows.
Timeline uses the 30fps offset guide embedded in the workflow notes. Active generation window is f600 to f960.
01 / VHS_LoadVideoPath

Source Window

Loads the source MOV, then uses linked constants rather than the stale node widget defaults: FPS is 30, SECONDS is 12, FRAME OFFSET is 600, and FRAME LOAD CAP is computed as a*b. That makes the active window 360 frames starting at the 20-second mark.

Output: image sequence + frame count + audio
02 / DWPreprocessor + ViTPose/YOLO

Pose And Face Plates

The control branch runs DWPreprocessor with body, hand, and face enabled at 1280 detector resolution, then a ViTPose/YOLO branch extracts face crops and bounding boxes at 832 x 480. The result gives WAN Animate both broad body motion and tighter facial framing.

Output: pose_images + face_images
03 / VHS_LoadImagePath + CLIP Vision

Reference Identity

IPA20 is loaded as a still reference, resized with Lanczos and center crop, then routed into both CLIP Vision and the WAN Animate reference image input. That creates a strong single-frame identity anchor instead of relying on text prompting.

Output: reference_image + image_embeds
04 / WAN 2.2 Animate BF16

Model Stack

The base WAN 2.2 Animate 14B BF16 model loads with SageAttention and offload_device selected. LoRA and block swap are applied as explicit downstream nodes, which keeps the base loader reusable while still patching the model for this render.

Output: conditioned video model
05 / WanVideoSampler

Sampling Window

WanVideoAnimateEmbeds receives the full 360-frame count for num_frames and frame_window_size, while WanVideoContextOptions separately defines 81-frame context windows with stride 4 and 48-frame overlap. Sampling uses linked 16 steps, shift 8, CFG 1, randomized seed, and DPM++.

Output: latent video samples
06 / WanVideoDecode + VHS_VideoCombine

Decode And Delivery

WanVideoDecode uses tiled decode settings to control memory pressure, then VideoHelperSuite writes a 30fps ProRes master with workflow metadata. The audio path is wired in the graph, but its Set/Get bridge is bypassed in this JSON and should be enabled if final audio is required.

Output: ProRes vertical master
02 / GRAPH

THE PRODUCTION GRAPH

The graph is modular and named around reusable Set/Get nodes. That lets preprocessing publish shared artifacts once, then sampling reads only the pieces it needs.

INPUT
Source MOV
Frame offset f600
360-frame cap
Audio branch
PREPROCESS
DW pose map
ViTPose face crops
Frame count set
QA proxy movies
REFERENCE
IPA still 20
Lanczos resize
CLIP Vision encode
WAN image embeds
MODELS
wan2.2 animate 14B bf16
Wan2_1 VAE bf16
LightX2V rank64 LoRA
Block swap 36
SAMPLE
UMT5 cached text embeds
81-frame context
DPM++ 16 steps
Shift 8
OUTPUT
GPU cleanup
WAN decode
30fps ProRes
Workflow metadata
Editorial Motion
01Source MOV
02VHS_LoadVideoPath
03DWPreprocessor
04Set/Get pose_images
05WanVideoAnimateEmbeds

The generated performer inherits timing, body rhythm, and camera cadence from the source clip instead of inventing motion from prompt text.

Face And Framing
01Source frames
02PoseAndFaceDetection
03Set/Get face_images
04WanVideoAnimateEmbeds

Face crops give the animation pass a higher-priority local reference for head orientation, expression continuity, and face-region stability.

Identity Reference
01IPA20 still
02ImageResizeKJv2
03CLIPVisionEncode
04Animate reference image

The single reference still anchors character design, color bias, and likeness. Center crop and average aggregation make the reference more stable but less multi-angle aware.

Model Conditioning
01WAN 2.2 14B BF16
02LightX2V rank64 LoRA
03Block swap 36
04WanVideoSampler

The base model supplies temporal synthesis, the LoRA biases image-to-video behavior, and block swap keeps the heavy model practical for a long vertical render.

03 / CONDITIONING

WHAT ACTUALLY STEERS THE IMAGE

This render is guided by a stack of visual controls. The prompt path is present but neutral, so likeness, movement, framing, and texture come from plates and embeddings rather than language.

Primary motion guide

Pose images

DWPreprocessor is enabled for body, hands, and face. This makes pose the main source of choreography and helps keep limbs from drifting between context windows.

Local identity guide

Face images

PoseAndFaceDetection emits face crops separately from pose data. That gives the model a tighter signal for facial continuity than full-frame conditioning alone.

Global identity/style guide

Reference image

IPA20 is reused in both CLIP Vision and ref_images. This doubles down on the chosen still as the identity anchor, which is useful for consistency but can pull the clip toward that pose or lighting.

Neutral semantic guide

Text embeds

UMT5 cached text encoding is present, but the prompt fields are empty in the JSON. That shifts creative control away from language and toward visual conditioning.

Available but bypassed

Background/mask

SAM2, GrowMaskWithBlur, and BlockifyMask are wired as a scaffold, but bg_images and mask are null on AnimateEmbeds. This render does not use mask protection.

04 / NODES

NODE GROUP BREAKDOWN

This audit follows the groups embedded in the ComfyUI workflow: Reference Image, Preprocessing, Models, Sampling, and SAM2 background extraction.

4 nodes

Reference Image

StringConstantMultiline
Stores the IPA20 image path. Naming the selected still in the workflow makes frame-pick experiments repeatable.
VHS_LoadImagePath
Loads the still into ComfyUI as IMAGE data without resizing at this step, preserving the source reference before normalization.
ImageResizeKJv2
Uses Lanczos, crop, center, 32 alignment, and CPU processing. Lanczos preserves edge detail; center crop keeps the character-weighted region dominant.
Set_reference_image
Publishes the normalized still so both CLIP Vision and AnimateEmbeds read the same identity source.
Creates the visual identity anchor.
12 nodes

Preprocessing

VHS_LoadVideoPath
Linked inputs override widget defaults: force_rate is 30, frame_load_cap is 360, and skip_first_frames is 600. This defines the actual edit window.
MathExpression a*b
Computes SECONDS x FPS as 12 x 30. The graph can be retimed by changing either value without touching the load node.
DWPreprocessor
Body, hand, and face toggles are enabled at 1280 detector resolution with YOLOX_L and dw-ll_ucoco. Higher detection resolution improves keypoint fidelity for vertical full-body shots.
OnnxDetectionModelLoader
Loads vitpose_h_wholebody_model.onnx and yolov10m.onnx on CUDAExecutionProvider, pushing expensive detection to GPU.
PoseAndFaceDetection
Runs at 832 x 480 and outputs pose data, face images, and bboxes. Lower control resolution reduces preprocessing cost while preserving semantic motion.
VHS_VideoCombine
Writes h264 QA previews at CRF 19 with save_output false. These previews are for inspection, not final delivery.
Turns the editorial clip into control plates.
9 nodes

Models

WanVideoModelLoader
Loads wan2.2_animate_14B_bf16 with SageAttention and offload_device. BF16 keeps range and quality higher than aggressive quantization while still reducing memory versus FP32.
WanVideoVAELoader
Loads Wan2_1_VAE_bf16. Matching BF16 model and VAE precision avoids unnecessary conversion overhead during decode.
WanVideoLoraSelectMulti
Sets LightX2V rank64 to weight 1.0 while relight and rank128 are set to 0. The active LoRA favors image-to-video motion without adding a relight bias.
WanVideoBlockSwap
Sets block swap to 36. More swapping lowers VRAM pressure but can slow iteration; this value is a production compromise for a 14B vertical render.
WanVideoTorchCompileSettings
Configures inductor compile args but leaves compile disabled in the VAE input. It is retained as an optimization switch for repeated runs.
Builds the inference stack and memory strategy.
17 nodes

Sampling

WanVideoClipVisionEncode
Uses center crop and average aggregation. With one reference image, that favors a stable whole-reference embedding over aggressive crop variation.
WanVideoAnimateEmbeds
Receives VAE, CLIP embeds, ref image, pose images, face images, width, height, num_frames, and frame_window_size. The 0.9 and 0.6 scalar values indicate strong primary visual control with a softer secondary blend.
WanVideoContextOptions
Uses uniform_standard, 81 frames, stride 4, overlap 48, and linear blending. The high overlap helps smooth transitions between long-video chunks.
WanVideoSampler
External nodes override steps and shift to 16 and 8. CFG is 1, seed is randomized, sampler is DPM++. Low CFG keeps the result from over-following empty text prompts.
easy cleanGpuUsed
Runs between sampling and decode so the decode stage has more room for tiled VAE work.
WanVideoDecode
Tiled decode is enabled with 1024 tiles and 512 overlap values, reducing the chance of VAE memory spikes on 1088 x 1920 frames.
Combines all conditioning and generates the latent video.
7 nodes

SAM2 - BG

DownloadAndLoadSAM2Model
Loads sam2.1_hiera_base_plus in video/cuda/fp16 mode, which is appropriate for temporal mask propagation when enabled.
Sam2Segmentation
Consumes the ViTPose bboxes as a segmentation hint. This lets detection drive mask placement without hand-clicked coordinates.
GrowMaskWithBlur
Expands the mask by 10 with blur enabled. That softens edges and prevents hard matte chatter around hair, hands, and clothing.
BlockifyMask
Quantizes the mask to 32px blocks. This can stabilize masks temporally but may reduce edge precision.
Set_background_image
Publishes a background plate when enabled. In this JSON the whole SAM2 group is bypassed and not connected to AnimateEmbeds.
Optional mask/background extraction branch.
05 / SETTINGS

SETTINGS THAT SHAPE THE FINAL VIDEO

These are the high-impact values in the JSON. They control format, temporal consistency, identity strength, render speed, and how much hardware pressure the graph creates.

Canvas
1088 x 1920

Preserves a 9:16 vertical short format while increasing pixel budget beyond a simple 1080-wide master. More pixels help face detail and wardrobe texture, but raise VAE decode and sampler memory cost.

Frame strategy
f600 + 360 frames @ 30fps

Targets a 12-second generation beginning at the 20-second mark. The graph computes the cap from SECONDS x FPS, so clip length can be adjusted without editing the loader node.

Context
81 frames / stride 4 / overlap 48

Creates overlapping temporal chunks of roughly 2.7 seconds. The 48-frame overlap is deliberately heavy, reducing visible seams at the cost of extra compute.

Sampler
DPM++ / 16 steps / shift 8 / CFG 1

Keeps iteration speed practical while preserving enough denoise passes for motion and texture refinement. CFG 1 makes sense for this graph because visual controls, not text, are carrying the shot.

LoRA
LightX2V rank64 weight 1.0

Distills image-to-video behavior for faster WAN animation. Relight and rank128 slots are present but set to zero, avoiding extra lighting bias and keeping the active LoRA choice easy to isolate.

Memory
BF16 + block swap 36

The model, VAE, and LoRA stay in BF16 while block swapping makes the 14B Animate stack practical on a workstation GPU. It trades runtime speed for the ability to hold a larger model and vertical frame target.

Effective values vs widget defaults

VHS_LoadVideoPath force_rate
30 via linked FPS node

The widget still shows an older value, but the connected Float node is the active source. This keeps source ingest, previews, sampler, and final ProRes aligned at 30fps.

FRAME LOAD CAP
a*b = 12*30 = 360

The graph is duration-driven. Changing SECONDS to 8 would produce 240 frames without editing any downstream node.

skip_first_frames
600

At 30fps, this selects the 20-second editorial mark. The generated take inherits the source camera and choreography from that exact segment.

AnimateEmbeds dimensions
width 1088 / height 1920

Final dimensions are passed as linked inputs, while several control nodes operate at 832 x 480. This separates high-resolution delivery from cheaper control extraction.

AnimateEmbeds frame inputs
num_frames 360 / frame_window_size 360

This matches the embedded workflow note for context-options mode: the full length is sent to AnimateEmbeds, and ContextOptions handles the actual temporal chunking.

ContextOptions
uniform_standard / 81 / 4 / 48 / linear

Uniform context sampling with linear blending reduces abrupt identity or texture jumps as the long clip advances.

CLIP Vision encode
center / average / strength-like values 1 and 0.5

The reference signal is broad and stable. It should hold character and palette, but it may not describe alternate angles as well as a multi-reference setup.

Text encoder
umt5_xxl_fp16 model, fp32 output, empty prompt

The graph keeps text conditioning available but neutral. That prevents language from fighting pose, face, and image-reference controls.

Decode
tiled decode on / 1024 / 512

Tiling protects the VAE decode stage from large-frame memory spikes. The tradeoff is potential tile-boundary risk, mitigated by overlap.

Final combine
video/ProRes standard / save metadata true

The output is a finishing-friendly intermediate rather than a social upload encode. Metadata preservation makes the render traceable.

Toolchain

ComfyUIComfyUI-WanVideoWrapperComfyUI-VideoHelperSuiteComfyUI-KJNodesWanVideo AnimateSAM2ViTPoseYOLODWPreprocessorSageAttentionUMT5 XXLCLIP Vision H
06 / DELIVERY

OUTPUT NAMING AND HANDOFF

The final ProRes combine is configured as a master render rather than a lightweight social encode. The filename prefix doubles as a compact production manifest.

Filename as render manifest
aespa_karina_goodstuff_ytshort_WA_360f_f600_ipa20_1088x1920_30fps_bswap36_BF16_dpmpp16s8sh1cfg_r64_0rl_1280oppfd0.9cf0.6fs_81co48us_np_v04c.json

The output name encodes the render recipe: source shot, frame window, IPA still, resolution, fps, memory strategy, precision, sampler, LoRA, context, and version. That makes renders easier to compare after overnight batches.

The output prefix is more useful than the stale preview filename because it is connected directly into final VHS_VideoCombine.
07 / AUDIT

PRODUCTION READOUT

The workflow is already structured like a repeatable production template. The strongest opportunities are documenting which branches are active per render and tightening the source-window checks before long overnight jobs.

ACTIVE

The graph is visual-control driven more than prompt driven.

The text encoder exists, but prompt fields are empty. Output character, timing, and staging are shaped mainly by IPA20, pose plates, face crops, context windows, and the LightX2V LoRA.

BYPASSED

The SAM2 background/mask branch is present but not feeding the sampler.

SAM2 nodes are in mode 4 and WanVideoAnimateEmbeds has null bg_images and mask inputs. The branch is useful production scaffolding, but this render is not currently using segmentation to protect or replace background regions.

CHECK

Confirm the source clip length against the f600 plus 360-frame window.

At 30fps, f600 starts at 20.0 seconds and 360 frames extend to 32.0 seconds. The source filename includes 30s, so confirm the final two seconds are available, padded, or intentionally clipped by VideoHelperSuite.

CHECK

Audio is wired but bypassed in this JSON.

VHS_LoadVideoPath outputs audio, and final VHS_VideoCombine has an audio input, but Set_input_audio and Get_input_audio are mode 4. Enable that bridge for a final master with source audio.

WATCH

Video preview metadata can be stale.

The final combine node preview filename references an older f0/ipa21/bswap35 render, while the connected filename_prefix string carries the current f600/ipa20/bswap36 name. Use connected constants as source of truth.

OUTPUT

The ProRes output is configured as a production master.

VHS_VideoCombine saves output at 30fps in video/ProRes with metadata. This is appropriate for editorial finishing, repost compression, and preserving workflow provenance.

SOURCE / COMFYUI WORKFLOW JSON / REVISION 0BACK TO DESIGN SYSTEM