Protoface Wan 3.0 · Image to Video
Animate That Still You Just Spent an Hour On
- video
- files
- run id
This is the no-frills one: Wan 3.0, image-to-video, the base tier. You have a still you like and you want it to move. The node takes your IMAGE tensor, sends it up, and hands back a video you can keep working on locally.
Why spend on this instead of running Wan 2.2
Because local Wan 2.2 is the last open Wan and it shows its age in one specific way: length. The KB's account of life on 2.2 is a catalog of workarounds - 81-frame windows, VACE joins, SVI error-recycling LoRAs - all built to get past a five-second box. Reported timings back that up: 25 to 30 minutes for a five-second 720p clip on a 5090, before you've added anything to it. A 2–30 second single generation with native audio is a different product, not a better checkpoint.
Wan 3.0 base versus Wan 3.0 Prime is a straightforward quality tier - same controls, same operations, Prime being the higher-quality model. Reach for base while you're still deciding what the shot is; move to Prime for the take you keep.
How it works
The pack is a catalog plus an adapter, not a Wan implementation. At startup it reads a bundled JSON catalog of model/task schemas and generates a native ComfyUI V3 node for each pair - this one is alibaba/wan-3.0 × video.animate. On queue: your image is encoded to PNG, uploaded if it's new (content-hash cached), the payload is validated against the schema before submission, the job is polled with a progress bar, and the result is downloaded into a private state directory and decoded into a native VIDEO object.
The request is journaled before it leaves - account, scope, node id, generation_id, model, schema fingerprint and a payload hash. That's the mechanism behind "requeue unchanged and it resumes instead of re-billing you".
Controls
prompt describes motion. The image already establishes who and what; your prompt should be verbs - how the hair moves, where the camera drifts, what the light does.
image is a mode-picking field, not a bare socket. Set it to Image and connect anything producing an IMAGE - a Load Image, or the output of a local Qwen/FLUX generation, or a composited frame from your own graph. Set it to References to feed a Protoface Asset Reference. Batch tensors are rejected on purpose.
last_image turns this into keyframe interpolation: give it an end frame and the model bridges. Both frames want matching framing and light.
duration 2–30 (default 5), resolution 480p/720p/1080p (default 720p), enable_audio on by default, enable_prompt_expansion off by default, aspect_ratio optional (Default adapts to your source image), seed optional with -1 as random.
Outputs
video - a list of native VIDEO results, so downstream nodes map over it. files - the original file for Protoface Save File. run id - a string for Protoface Resume Run and for anything you'd need to report later.
Install
cd ComfyUI/custom_nodes
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git protoface
python -m pip install -r protoface/requirements.txt
Manager alternative: Extensions/Manager → search Protoface → install protoface-nodes → restart → reload the browser. Requires ComfyUI 0.41.0+ and Python 3.10+; installs httpx, jsonschema, Pillow, av. No model files, no GPU requirement for the inference itself. Then click Protoface bottom-right and enter your key - memory-only, so it needs re-entering after a restart.
If your ComfyUI is headless, set the key in the environment and remember that request_scope is required there - the UI assigns it silently, scripts don't.
A workflow that actually uses this thing
The pattern I'd build: generate a still locally (cheap, unlimited, no upload), pass it into image here, animate once at 480p to test the motion, then requeue the same prompt at 720p with a fresh generation_id. The 480p trial and the 720p keeper are separate paid jobs - that's fine and expected - but they share one frame, so the composition you liked doesn't change between them.
From there, feed video into a local frame-interpolation pass, or into FLUX.3 Video · Extend if you want the shot to keep going.
Where people get burned
Silence instead of an error. Missing credits or a bad key typically looks like a node that just doesn't produce. Check the Protoface settings dialog first, and confirm it's pointed at https://api.protoface.com.
A batch into image. "expects one asset; split the image/audio batch first" - drop the batch_size to 1 or split the batch with an ImageFromBatch.
Retrying by incrementing generation_id. That's a new request, not a retry. Leave it fixed and requeue, or Resume Run with the run id.
Deleting ~/.cache/protoface-comfyui while something is unresolved. The deduplication and recovery journal lives there; deleting it can turn one charge into two.
Expecting a refund on interrupt. Cancellation is best effort and explicitly doesn't promise one.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The positive prompt for the generation. | |
| image | COMBO | A public URL, a data URI, or an asset id. | |
| resolution | COMBO | 720p | The resolution of the generated video. |
| duration | INT | 52–30 | The duration of the generated media in seconds (2-30s). |
| aspect_ratio | COMBO | The aspect ratio of the generated video. If not specified, it is adapted to the input image. | |
| enable_audio | BOOLEAN | true | Whether to include audio in the generated video. |
| enable_prompt_expansion | BOOLEAN | false | If set to true, the prompt optimizer will be enabled. |
| last_image | COMBO | A public URL, a data URI, or an asset id. | |
| seed | COMBO | The random seed to use for the generation. -1 means a random seed will be used. | |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |