Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate short videos from a text prompt or from still images using ByteDance Seedance on Volcengine Ark. Use this skill whenever the user wants to create, generate, render, or animate a video, clip, animation, motion graphic, or product demo — including text-to-video ("a drone shot over a forest at sunrise") and image-to-video, where a still becomes the first frame, or two stills are morphed start-to-end. Prefer this skill over describing a video in text.
.claude/skills/fradser-generate-video/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -22% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-18 | ✓→✗ | ▼ Worse | 39% | 0% |
| case-19 | ✓→✗ | ▼ Worse | 49% | 0% |
Turn a text prompt — optionally anchored by a first frame, a last frame, or reference images — into a short video. The script submits an async task, polls until it finishes, and downloads the .mp4. Generation takes a few minutes, so set expectations and let it run.
uv available (self-contained uv run script; deps install on first run).export ARK_API_KEY=... in the shell, or.env file (checked in order: $PWD/.env, then ${CLAUDE_PLUGIN_ROOT}/.env), or--api-key ... on the command line.CRITICAL -- Never paste the API key into chat or commit a .env. If the key is missing, the script prints exactly how to set it — relay that instead of guessing.
--first-frame img.png. The still becomes the opening frame andthe model adds motion. This is the right mode for animating a storyboard panel or product render.
--first-frame a.png and --last-frame b.png to interpolatea transition between two stills.
--image path:reference_image (repeatable) to steer style/composition.If the user attached an image, default to image-to-video unless they clearly want a fresh scene.
Read references/prompting.md before writing a non-trivial prompt. Seedance responds well to prompts that describe the shot over time (beats like [0s-2s] … [2s-5s] …), the camera move, and what must stay fixed. For image-to-video, explicitly state which traits of the source to preserve (style, framing, colors) so the clip does not drift.
Invoke it directly (the shebang runs it through uv):
bash${CLAUDE_PLUGIN_ROOT}/skills/generate-video/scripts/generate_video.py "PROMPT" -o OUT.mp4 [flags]
Flags:
| Flag | Purpose | Default | |------|---------|---------| | -o, --output | Output .mp4 path | output.mp4 | | --first-frame | Start-frame image (image-to-video) | none | | --last-frame | End-frame image (morph start→end) | none | | --image | PATH or PATH:ROLE (first_frame/last_frame/reference_image); repeatable | none | | --ratio | Aspect ratio: 16:9, 9:16, 1:1, … | 16:9 | | --resolution | 480p / 720p / 1080p (no 2K/4K on Ark) | 720p | | --duration | seconds, 4–15 for Seedance 2.0 | 5 | | --watermark | Keep the provider watermark | off | | --no-audio | Disable native audio (2.0 generates synced audio by default) | audio on | | --seed | Integer seed for reproducibility | random | | --model | pro, fast, mini, or a raw id (else SEEDANCE_MODEL) | pro |
Models (pass the alias to --model or set SEEDANCE_MODEL):
| Alias | Model id | Use for | |-------|----------|---------| | pro (default) | doubao-seedance-2-0-260128 | full quality, up to 1080p | | fast | doubao-seedance-2-0-fast-260128 | cheaper / faster, 720p max | | mini | doubao-seedance-2-0-mini-260615 | lightest / cheapest |
The script blocks while polling (status prints to stderr). For batch work, prefer longer single runs over many tiny ones — each task has fixed overhead, and the API bills per task.
Tell the user the saved path and the settings used (duration, resolution). The output is an .mp4: reference it by path. If a task fails, relay the provider's error message and suggest a fix (often a softer prompt, a different ratio, or a valid source image).
API key, model id, AND base URL are each resolved by lib/progressive_env.py in this order, stopping at the first hit: CLI flag → process env → .env chain → built-in default.
Two consequences worth knowing:
doubao-seedance-2-0-260128; to use a different/newer Seedance build, set export SEEDANCE_MODEL=<id> (or pass --model). Confirm the exact id in the Ark console — do not assume a marketing name like "Seedance 3" maps to a literal model id.
export ARK_BASE_URL=... for another Ark region.
scripts/generate_video.py — the generator (Seedance via Ark REST, async + poll + download).references/prompting.md — prompt-writing guide and full parameter reference.${CLAUDE_PLUGIN_ROOT}/lib/progressive_env.py — shared progressive config resolver.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→fail | 12,961 | 8,444 | -35% | 1 | 1 | 0% | 2,054 | 2,029 | -1% | 0 | 0 | — |
case-01 | fail→fail | 7,827 | 11,558 | +48% | 1 | 1 | 0% | 1,100 | 2,109 | +92% | 0 | 0 | — |
case-02 | fail→fail | 14,032 | 7,165 | -49% | 1 | 1 | 0% | 2,342 | 1,717 | -27% | 0 | 0 | — |
case-03 | fail→fail | 52,232 | 10,209 | -80% | 1 | 1 | 0% | 8,232 | 1,988 | -76% | 0 | 0 | — |
case-04 | fail→pass | 13,903 | 4,116 | -70% | 1 | 1 | 0% | 2,697 | 2,103 | -22% | 0 | 0 | — |
case-05 | fail→fail | 6,112 | 10,293 | +68% | 1 | 1 | 0% | 890 | 2,272 | +155% | 0 | 0 | — |
case-06 | fail→fail | 10,712 | 7,975 | -26% | 1 | 1 | 0% | 1,481 | 2,023 | +37% | 0 | 0 | — |
case-08 | pass→pass | 9,065 | 11,941 | +32% | 1 | 1 | 0% | 1,433 | 2,019 | +41% | 0 | 0 | — |
case-09 | fail→fail | 10,369 | 11,718 | +13% | 1 | 1 | 0% | 1,772 | 1,719 | -3% | 0 | 0 | — |
case-10 | fail→fail | 7,725 | 11,014 | +43% | 1 | 1 | 0% | 1,296 | 2,021 | +56% | 0 | 0 | — |
case-11 | pass→pass | 5,986 | 2,029 | -66% | 1 | 1 | 0% | 991 | 1,584 | +60% | 0 | 0 | — |
case-12 | pass→pass | 11,143 | 4,381 | -61% | 1 | 1 | 0% | 2,065 | 2,064 | -0% | 0 | 0 | — |
case-13 | fail→fail | 8,398 | 6,642 | -21% | 1 | 1 | 0% | 1,500 | 1,684 | +12% | 0 | 0 | — |
case-14 | fail→pass | 12,467 | 3,116 | -75% | 1 | 1 | 0% | 2,054 | 1,954 | -5% | 0 | 0 | — |
case-15 | pass→pass | 4,259 | 2,536 | -40% | 1 | 1 | 0% | 687 | 1,792 | +161% | 0 | 0 | — |
case-16 | fail→pass | 9,772 | 3,181 | -67% | 1 | 1 | 0% | 1,722 | 1,890 | +10% | 0 | 0 | — |
case-17 | fail→fail | 10,174 | 10,931 | +7% | 1 | 1 | 0% | 1,475 | 2,116 | +43% | 0 | 0 | — |
case-18 | pass→fail | 12,322 | 6,843 | -44% | 1 | 1 | 0% | 1,762 | 2,457 | +39% | 0 | 0 | — |
case-19 | pass→fail | 14,004 | 10,248 | -27% | 1 | 1 | 0% | 2,093 | 3,124 | +49% | 0 | 0 | — |
case-20 | pass→pass | 7,220 | 10,533 | +46% | 1 | 1 | 0% | 1,145 | 3,032 | +165% | 0 | 0 | — |
case-21 | pass→fail | 12,524 | 3,906 | -69% | 1 | 1 | 0% | 2,172 | 1,839 | -15% | 0 | 0 | — |
case-22 | pass→pass | 10,232 | 8,429 | -18% | 1 | 1 | 0% | 1,611 | 2,700 | +68% | 0 | 0 | — |
case-23 | fail→fail | 38,331 | 10,211 | -73% | 1 | 1 | 0% | 7,652 | 1,885 | -75% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 13 counted toward the lift figure. The other 10 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of 0 percentage points is the difference between those two pass rates over the 13 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.