Magic Hour · Image to Video
Animate anything already in your graph, rendered on someone else's GPUs
- image
- video_path
Magic Hour · Image to Video is the sibling of the pack's Text to Video node, and for most people it's the more useful one. Image-to-video is the community-favorite video workflow for a reason: anchoring the first frame to a real image fixes most of the consistency and composition problems that pure text-to-video wanders off into. You build or load an image in ComfyUI, wire it in, describe the motion, and get back an .mp4 - rendered entirely on Magic Hour's infrastructure. No GPU, no video model checkpoints squatting on your drive, no VAE-loading incantations.
That's the pitch and it's the honest one. The closed models in the dropdown (sora-2, veo3.1, kling-3.0, seedance-*) cannot run locally at all - no weights exist to download. The free-tier models (wan-2.2, ltx-2.3, minimax-h3) are the ones you could self-host if you had the hardware. So: use this when the card is missing, or when the image deserves a frontier model's motion.
How it works
The node takes your IMAGE, uploads it to Magic Hour (PNG, via a presigned URL), submits an image-to-video job with your prompt, then blocks and polls until rendering finishes. Status comes back as queued/rendering/complete rather than a percentage, so the progress bar creeps up and hovers near 99% until the job genuinely lands - that's expected, not a hang. A 5-second clip typically takes around a minute. When it's done, the .mp4 is saved to your ComfyUI output folder as magichour_i2v_<timestamp>.mp4 and the file path is returned.
One detail worth knowing: it uses the first frame of whatever IMAGE you feed it. Feed it a single image. If you accidentally wire in a multi-frame batch (say, straight out of a video decoder), the rest is silently ignored.
The inputs that matter
- image - any IMAGE in the graph: a loaded photo, a Magic Hour generated still, an img2img pass, a ControlNet-touched render. That's the whole point of putting it in ComfyUI - the video starts from your pipeline's output, not a fresh roll of the dice.
- prompt - describe the motion, not the scene. "Camera pushes in, rain starts" beats "a rainy city."
- model - labels carry the plan you need, what the model's good at, and the implied cost per second. The free defaults are
wan-2.2(physics & camera motion) andltx-2.3(fast, good for iterating). - end_seconds - clip length. Pick any and the node snaps it to the nearest length the selected model actually accepts, with a console note. No error, just a correction.
- resolution -
480p (free)through4k (business), gated by your plan. Pick above your plan and the node steps down and retries rather than failing. - audio - flip on only for models with native audio (
minimax-h3,veo3.1-audio). - api_key - leave empty if you've exported the env var.
There's no aspect ratio dropdown here, unlike the text-to-video node - the output inherits your image's aspect. The one output is video_path (STRING), and like its sibling this is a terminal node, so it runs with nothing wired downstream. Save the path to a file-ops node, hand it to a video loader, or just grab the file from the output folder.
Installing and your first run
ComfyUI Manager: search "Magic Hour" → install. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/RhythmP28/comfyui-magic-hour
Restart ComfyUI. Only requests, pillow, and numpy - no model downloads, no torch-extra wheels.
Free API key (no card, 400 credits plus 100/day) at magichour.ai/developer. Paste it in the node field, or better, set it once so a shared workflow doesn't carry your key around:
export MAGIC_HOUR_API_KEY="your_key_here"
Where people get burned
The cost is printed to the console before each run (wan-2.2 · 5s · 480p = ~120 credits) - that's your cue to sanity-check before you let it rip on a paid model. Picking a paid model on the free plan errors clearly and names the free options. Failed jobs are auto-refunded, and out-of-credits raises an explicit error rather than a mystery 422. The dropdown model list is a snapshot that goes stale as Magic Hour rotates models.
And the thing to keep at the front of your mind: your image leaves the machine. If the still you're animating is someone's face or unreleased work, know that it's being uploaded to a server you don't control. That's inherent to this entire category of node, not a bug in this one.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| prompt | STRING | — | |
| model | COMBO | wan-2.2 · free · physics & camera motion | 13 options: wan-2.2 · free · physics & camera motion, ltx-2.3 · free · fastest, best for iterating, minimax-h3 · free · native audio, seedance-1.5 · paid · smooth, precise motion, kling-2.6 · paid · action & motion blur, kling-3.0 · paid · best cinematic, up to 4k, +7 |
| end_seconds | COMBO | 5 | 36 options: 1, 2, 3, 4, 5, 6, +30 |
| resolution | COMBO | 480p (free) | 4 options: 480p (free), 720p (creator+), 1080p (pro+), 4k (business) |
| audio | BOOLEAN | false | — |
| api_keyopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | — |