Dynamic Motion Design
Create polished motion design videos with Seedance-ready prompts.
About
Dynamic Motion Design is an image-to-video ComfyUI workflow that turns static UI screenshots and brand assets into polished motion design clips. It uses GeminiNode or GeminiNanoBanana2 to convert your brief and references into a single Seedance-ready motion prompt, then feeds that prompt—along with your uploaded images—into ByteDance2ReferenceNode to generate the actual animation. You can monitor progress with PreviewImage and PreviewAny, and export the result with SaveVideo.
The workflow is organized into three groups for clarity: Generate Seedance Motion Designer Prompt (LLM-driven prompt crafting), Generate UI Frames (quick previews and frame checks), and Generate Video (final render and export).
What you provide
- Reading the workflow
Runs in ComfyUI. This workflow can't run on this page. Open it in Comfy Cloud with everything loaded, or download it for your own ComfyUI.
Try in CloudInside the workflow
A read-only preview of the node graph. Open it in Comfy Cloud or download it to edit the nodes.
Loading the graph
Open full-size workflow preview- Author
- ComfyUI
Requires custom nodes
- Reading the workflow
Use this workflow from code
Generated from the workflow graph and inputs when possible; stored examples are shown otherwise. Review credentials and endpoints before running code, which may incur charges.
What you need
- Runs on
- Comfy Cloud
- Key
- COMFY_API_KEY
Needs a paid Cloud plan and credits.
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"150": {
"class_type": "ByteDance2ReferenceNode",
"inputs": {
"model": "Seedance 2.0 Fast",
"model.auto_downscale": False,
"model.auto_upscale": False,
"model.duration": 7,
"model.generate_audio": True,
"model.prompt": [
"177",
0
],
"model.ratio": "16:9",
"model.reference_images.image_1": [
"189:10",
0
],
"model.reference_images.image_2": [
"189:15",
0
],
"model.reference_images.image_3": [
"189:26",
0
],
"model.reference_images.image_4": [
"189:30",
0
],
"model.resolution": "720p",
"seed": 1468536166,
"watermark": False
},
"_meta": {
"title": "ByteDance Seedance 2.5 Reference to Video (Legacy)"
}
},
"151": {
"class_type": "GeminiNode",
"inputs": {
"images": [
"189:137",
0
],
"model": "gemini-3-1-pro",
"prompt": "7 second duration, product launch",
"seed": 445440905297116,
"system_prompt": "You are a Seedance Prompt Architect specializing in motion design videos. Convert every user request into a single polished Seedance-ready video generation prompt.\n\nAlways return only the final prompt. Do not include explanations, greetings, headings, markdown commentary, analysis, alternatives, questions, or notes. Do not use emojis.\n\nIf the user provides minimal detail, infer sensible creative defaults. Use a 7 to 15 second duration unless the user specifies otherwise. Use 16:9 for cinematic or brand films, 9:16 for social/mobile videos, and 1:1 only when requested or clearly implied.\n\nWhen images are provided, treat them as visual references. Preserve the subject, composition, colors, materials, logo placement, typography style, product shape, and identity-relevant details. Clearly distinguish between character identity references, product references, texture references, and storyboard/composition references.\n\nWrite prompts with strong motion design direction: kinetic typography, graphic transitions, particle systems, morphing shapes, fluid simulations, glass, chrome, fabric, paper, liquid, smoke, light trails, UI motion, parallax, depth layers, camera choreography, rhythmic cuts, easing, anticipation, follow-through, overshoot, inertia, and seamless transformation logic.\n\nStructure the prompt as one coherent generation prompt containing: duration, aspect ratio, visual style, subject, scene, motion system, time-coded sequence, camera movement, lighting, material behavior, transitions, sound design when useful, and constraints.\n\nUse precise time-coded beats for multi-shot videos. Each beat must have one dominant visual action, clear camera behavior, and a physical or graphic transition into the next beat. Prioritize motion clarity over visual clutter.\n\nMake motion feel designed, not random. Specify animation principles such as smooth acceleration, elastic easing, magnetic snapping, layered parallax, orbital motion, synchronized pulses, frame-filling reveals, match cuts, masked wipes, morph transitions, and final hero-frame resolution.\n\nFor brand, product, UI, and logo videos, maintain product geometry and visual identity. Avoid distorted labels, invented text, random logos, illegible typography, melted packaging, off-brand colors, and uncontrolled camera chaos.\n\nFor abstract motion design, define the visual system: palette, materials, shapes, spatial rules, movement rhythm, transformation mechanism, density curve, and ending composition.\n\nFor loops, explicitly make the final frame return to the first-frame composition with matching object positions, lighting, scale, and motion direction.\n\nEnd every prompt with relevant negative constraints: no subtitles unless requested, no random text, no watermark, no malformed typography, no flicker, no jitter, no distorted geometry, no inconsistent lighting, no unintended logos, no visual noise, no identity drift, no extra objects, and no chaotic cuts."
},
"_meta": {
"title": "Google Gemini"
}
},
"176": {
"class_type": "SaveVideo",
"inputs": {
"codec": "auto",
"filename_prefix": "video/ComfyUI",
"format": "auto",
"format.codec": "auto",
"video": [
"150",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"177": {
"class_type": "PreviewAny",
"inputs": {
"source": [
"151",
0
]
},
"_meta": {
"title": "Preview as Text"
}
},
"190": {
"class_type": "GeminiNanoBanana2",
"inputs": {
"aspect_ratio": "16:9",
"images": [
"208",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": [
"191",
0
],
"resolution": "4K",
"response_modalities": "IMAGE",
"seed": 137159869185568,
"system_prompt": "You are an expert image-generation engine. You must ALWAYS produce an image.\nInterpret all user input—regardless of format, intent, or abstraction—as literal visual directives for image composition.\nIf a prompt is conversational or lacks specific visual details, you must creatively invent a concrete visual scenario that depicts the concept.\nPrioritize generating the visual representation above any text, formatting, or conversational requests.",
"thinking_level": "HIGH"
},
"_meta": {
"title": "Nano Banana 2"
}
},
"191": {
"class_type": "PreviewAny",
"inputs": {
"source": [
"192",
0
]
},
"_meta": {
"title": "Preview as Text"
}
},
"192": {
"class_type": "GeminiNode",
"inputs": {
"images": [
"208",
0
],
"model": "gemini-3-1-pro",
"prompt": "",
"seed": 744635533672075,
"system_prompt": "You are a high-end UI motion design prompt engine for landing page visuals, always reenforce the original product shape.\n\nYour sole job is to transform any user input into one polished, production-ready prompt for a short motion design clip featuring premium UI graphics for a landing page.\n\nAlways treat the user’s input as a request for a landing-page-ready UI motion visual.\n\nReturn prompt only.\nDo not explain.\nDo not ask questions.\nDo not provide options.\nDo not use headings.\nDo not output analysis.\nDo not output negative prompts unless explicitly requested.\n\nCore objective:\nGenerate one excellent prompt for visually refined UI graphics intended for short motion clips on a landing page. The result should feel premium, modern, clear, minimal, conversion-oriented, and suitable for high-end SaaS, AI, fintech, productivity, or digital product branding.\n\nDefault visual constraints:\n\n* 2x2 grid\n* no gutters\n* 0px frame\n\nThis layout should be treated as the default composition unless the user explicitly overrides it.\n\nVisual priorities:\n\n* premium UI design\n* clean composition\n* strong visual hierarchy\n* crisp interface elements\n* elegant spacing\n* believable product UI\n* minimal clutter\n* high readability\n* modern motion-design sensibility\n* landing-page-ready polish\n* visually cohesive graphic treatment\n\nMotion direction:\nAssume the graphic is intended for a short motion design clip, typically 3–12 seconds, with subtle, smooth, premium animation language. Even when generating a still-image prompt, the visual should imply motion-design readiness and modular animation potential.\n\nPreferred qualities:\n\n* sleek\n* intentional\n* minimal\n* editorial\n* premium\n* futuristic but usable\n* product-focused\n* visually bold but controlled\n\nAvoid:\n\n* mockup screens\n* device frames\n* bezels\n* browser windows unless explicitly requested\n* clutter\n* generic dashboards\n* floating random icons\n* tiny illegible text\n* chaotic layout\n* overdesigned neon effects\n* excessive glow\n* stock-like visuals\n* cheap UI\n* decorative elements without function\n\nPrompt behavior:\nAlways output one strong final prompt that is directly usable in an image or video generation model.\nThe prompt should clearly describe:\n\n* composition\n* style\n* UI density\n* layout behavior\n* motion-design feel\n* lighting and finish\n* overall brand tone\n\nDefault assumptions when the user is vague:\n\n* premium landing page visual\n* short motion-design clip\n* modular UI graphic system\n* 2x2 grid composition\n* no gutters\n* 0px frame\n* no screen\n* modern product-brand aesthetic\n* clean background\n* high-end commercial polish\n\nThe output must always be a single prompt only.\n"
},
"_meta": {
"title": "Google Gemini"
}
},
"194": {
"class_type": "PreviewImage",
"inputs": {
"images": [
"189:137",
0
]
},
"_meta": {
"title": "Preview Image"
}
},
"208": {
"class_type": "LoadImage",
"inputs": {
"image": "86b1c162b1fba87aa0c95c45ebc536c6d5db163e34a7348518ede58ccc0ef7d5.jpg"
},
"_meta": {
"title": "Load Image"
}
},
"189:10": {
"class_type": "ImageCropV2",
"inputs": {
"crop_region": [
"189:12",
0
],
"image": [
"190",
0
]
},
"_meta": {
"title": "Crop Image"
}
},
"189:12": {
"class_type": "PrimitiveBoundingBox",
"inputs": {
"height": [
"189:13",
1
],
"width": [
"189:7",
1
],
"x": 0,
"y": 0
},
"_meta": {
"title": "Bounding Box"
}
},
"189:13": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a/b",
"values.a": [
"189:8",
1
],
"values.b": [
"189:9",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"189:137": {
"class_type": "BatchImagesNode",
"inputs": {
"images.image0": [
"189:10",
0
],
"images.image1": [
"189:26",
0
],
"images.image2": [
"189:15",
0
],
"images.image3": [
"189:30",
0
]
},
"_meta": {
"title": "Batch Images"
}
},
"189:15": {
"class_type": "ImageCropV2",
"inputs": {
"crop_region": [
"189:16",
0
],
"image": [
"190",
0
]
},
"_meta": {
"title": "Crop Image"
}
},
"189:16": {
"class_type": "PrimitiveBoundingBox",
"inputs": {
"height": [
"189:13",
1
],
"width": [
"189:7",
1
],
"x": 0,
"y": [
"189:13",
1
]
},
"_meta": {
"title": "Bounding Box"
}
},
"189:25": {
"class_type": "PrimitiveBoundingBox",
"inputs": {
"height": [
"189:13",
1
],
"width": [
"189:7",
1
],
"x": [
"189:7",
1
],
"y": 0
},
"_meta": {
"title": "Bounding Box"
}
},
"189:26": {
"class_type": "ImageCropV2",
"inputs": {
"crop_region": [
"189:25",
0
],
"image": [
"190",
0
]
},
"_meta": {
"title": "Crop Image"
}
},
"189:30": {
"class_type": "ImageCropV2",
"inputs": {
"crop_region": [
"189:32",
0
],
"image": [
"190",
0
]
},
"_meta": {
"title": "Crop Image"
}
},
"189:32": {
"class_type": "PrimitiveBoundingBox",
"inputs": {
"height": [
"189:13",
1
],
"width": [
"189:7",
1
],
"x": [
"189:7",
1
],
"y": [
"189:13",
1
]
},
"_meta": {
"title": "Bounding Box"
}
},
"189:7": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a/b",
"values.a": [
"189:8",
0
],
"values.b": [
"189:9",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"189:8": {
"class_type": "GetImageSize",
"inputs": {
"image": [
"190",
0
]
},
"_meta": {
"title": "Get Image Size"
}
},
"189:9": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 2
},
"_meta": {
"title": "Int"
}
}
})
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)Questions & answers
A Seedance-ready prompt is a concise, structured text description tailored for the Seedance Motion Designer. The workflow uses GeminiNode or GeminiNanoBanana2 to turn your brief and visual references into a clear, unambiguous prompt that emphasizes motion intent (camera moves, pacing, focal elements). This improves consistency and reduces trial-and-error when driving ByteDance2ReferenceNode or exporting the prompt for Seedance.
ByteDance2ReferenceNode is the image-to-video engine that interprets your Seedance prompt alongside the uploaded base image and any style/brand references. It generates the animated sequence based on those inputs and its parameters (e.g., resolution, motion strength, duration/frame count, and seed).
Use GeminiNode if you have network access and want the full cloud LLM for richer prompt synthesis. Use GeminiNanoBanana2 if you prefer a local, lightweight option or need to work offline. Both produce Seedance-ready prompts; choose based on connectivity and resource constraints.
Start with a clean, high-resolution base image. Add clear brand/style references that match your desired look. Keep the Seedance prompt brief and directive—specify camera moves, focal elements, pacing, and transitions. In ByteDance2ReferenceNode, iterate on motion strength, duration/frame count, and seed. Use the Generate UI Frames previews to validate composition before rendering the final video.