Animate (A-Roll)

Animate first frames into A-roll talking head clips.

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/animate, including the files SKILL.md points to.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit TheMattBerman/scrollclaw/animate#main ~/.claude/skills/animate

For one project only, change the path to .claude/skills/animate. This skill also uses -script.md, output-log.md — copying SKILL.md alone won't be enough. See the folder on GitHub.

Claude (web or desktop app)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Animate (A-Roll)

Show the full text160 lines
namedescriptionmetadata
scrollclaw-animateAnimate first frames into A-roll talking head clips. Uses Sora 2 via fal.ai (primary) with Kling 3 auto-fallback when Sora is unavailable or sunset. openclaw: emoji: "🎥 user-invocable: true triggers: - "animate clip - "sora animate - "generate clip - "a-roll - "talking head clip - "sora video - "kling animate - "kling a-roll

Animate (A-Roll)

Turns first frames into talking head clips with synced lip movement and audio. Image-to-video is the default — text-to-video is the fallback.

Fallback chain: Sora 2 (fal.ai) -> Kling 3 (fal.ai) -> Kling 3 (Replicate). Use --provider kling to skip Sora entirely (for when Sora is sunset).

Prerequisites

  • First frame approved (from /first-frame)
  • Script with [A-ROLL] segments tagged (from /persona)

Motion Prompting

Read references/motion-prompting.md for the structured prompt format. Use labeled fields — not prose paragraphs:

  • Camera — handheld energy, micro-shake, slight reframe
  • Subject — keep generic (first frame defines appearance). Detailed facial descriptions trigger content safety filters
  • Dialogue — include actual script lines. Sora generates synced lip movement + audio
  • Audio — describe the RESULT not the gear. "Clean natural podcast audio, voice close and present, subtle room tone" works. Naming specific mics doesn't.
  • Environment & light — practical light, deep focus, real-world setting
  • Style & mood — iPhone selfie-camera realism, not cinematic

Generation

USE THE SCRIPTS. DO NOT construct API calls manually. Scripts handle provider routing, field names, polling, downloading, and error handling.

# Image-to-video (RECOMMENDED — first frame locks the face)
bash scripts/generate-clip.sh \
  --provider fal \
  --image workspace/campaigns/<slug>/frames/frame1.png \
  --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
  --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
  --log-file workspace/campaigns/<slug>/output-log.md \
  --label a-roll-01 \
  --seconds 8 --aspect-ratio portrait

# Text-to-video (fallback — no first frame)
bash scripts/generate-clip.sh \
  --provider fal \
  --prompt-file workspace/campaigns/<slug>/scene-prompt.txt \
  --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
  --log-file workspace/campaigns/<slug>/output-log.md \
  --label a-roll-01 \
  --seconds 8 --aspect-ratio portrait

# Kling direct (skip Sora — use when Sora is sunset)
bash scripts/generate-clip.sh \
  --provider kling \
  --image workspace/campaigns/<slug>/frames/frame1.png \
  --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
  --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
  --log-file workspace/campaigns/<slug>/output-log.md \
  --label a-roll-01 \
  --seconds 8 --aspect-ratio portrait

# Replicate Sora (legacy — may stop working when Sora is sunset)
bash scripts/generate-clip.sh \
  --provider replicate \
  --image workspace/campaigns/<slug>/frames/frame1.png \
  --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
  --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
  --log-file workspace/campaigns/<slug>/output-log.md \
  --label a-roll-01 \
  --seconds 8 --aspect-ratio portrait

API Reference

Read references/sora-api.md for endpoint details, queue workflow, field names, and duration options. Sora fal.ai supports 4/8/12/16/20s. Kling supports 3-15s (durations >15s are auto-clamped). Replicate Sora is limited to 4/8/12.

Content Filter Handling

Sora's content filter runs AFTER generation — can fail at 99%. If blocked:

  • Soften the motion prompt (keep first frame)
  • Remove any potentially sensitive descriptions
  • Retry with adjusted prompt
  • Or use --provider kling — Kling has no content safety filter

Key Findings

  • Include actual script in Dialogue field — Sora generates synced lip movement
  • For podcast audio: describe the RESULT, not the gear
  • Keep Subject descriptions generic — the first frame already defines appearance
  • fal.ai is primary provider; Kling 3 is auto-fallback when Sora fails or is sunset
  • Use --provider kling to skip Sora entirely

Brand Memory Integration

Reads
File Purpose
workspace/campaigns/<slug>/frames/frame1.png Canonical face — fed to Sora i2v to lock creator identity
workspace/campaigns/<slug>/scripts/<format>-script.md A-roll segments, dialogue, shot timing
workspace/campaigns/<slug>/creators/creator-<name>.md Creator energy/vibe reference for motion prompting
workspace/creators/creator-<name>.md Fallback if no campaign-specific profile exists
Writes
File Notes
workspace/campaigns/<slug>/clips/a-roll-01.mp4 One file per A-roll segment
workspace/campaigns/<slug>/output-log.md Motion prompt, model, duration, provider (append-only)
Context loading
🎥 Animate context loaded:
  ✓ First frame: workspace/campaigns/ridge-q1/frames/frame1.png
  ✓ Script: talking-head (A-roll segments: 3)
  ✓ Creator: Maya
  ✓ Campaign: ridge-q1

Contract

Input
  • Required: approved frame1.png plus a script with [A-ROLL] segments
  • Optional: creator profile details, alternate prompt file, fallback provider
  • Format: workspace image and markdown files plus motion prompt text
  • Source: /first-frame, /persona, and references/motion-prompting.md
Output
  • Produces: one A-roll clip per [A-ROLL] segment plus append-only generation logs
  • Format: MP4 files in workspace/campaigns/<slug>/clips/ and rows in output-log.md
  • Default behavior: use Sora image-to-video with the approved first frame; use text-to-video only as a fallback when no usable frame exists
  • Downstream use: /b-roll and /assemble
Validation
  • Pre-conditions: first frame is approved, script is tagged correctly, and the prompt includes the actual dialogue
  • Post-conditions: local MP4 is saved, creator identity holds, and lip movement/audio feel believable enough to cut into a final video
  • Failure checks: reroll or adjust the prompt if content filters fail, the hands/face break realism, or the clip is too synthetic to pass downstream

Output

  • A-roll clips (MP4) in workspace/campaigns/<slug>/clips/
  • Each clip named a-roll-<segment>.mp4 corresponding to an [A-ROLL] script segment
  • Generation params logged to workspace/campaigns/<slug>/output-log.md

Next Step

A-roll done → run /b-roll for environment shots, or /assemble if no B-roll needed.

1---
2name: scrollclaw-animate
3description: "Animate first frames into A-roll talking head clips. Uses Sora 2 via fal.ai (primary) with Kling 3 auto-fallback when Sora is unavailable or sunset."
4metadata:
5 openclaw:
6 emoji: "🎥"
7 user-invocable: true
8 triggers:
9 - "animate clip"
10 - "sora animate"
11 - "generate clip"
12 - "a-roll"
13 - "talking head clip"
14 - "sora video"
15 - "kling animate"
16 - "kling a-roll"
17---
18 
19# Animate (A-Roll)
20 
21Turns first frames into talking head clips with synced lip movement and audio. Image-to-video is the default — text-to-video is the fallback.
22 
23**Fallback chain:** Sora 2 (fal.ai) -> Kling 3 (fal.ai) -> Kling 3 (Replicate). Use `--provider kling` to skip Sora entirely (for when Sora is sunset).
24 
25## Prerequisites
26 
27- First frame approved (from `/first-frame`)
28- Script with `[A-ROLL]` segments tagged (from `/persona`)
29 
30## Motion Prompting
31 
32Read `references/motion-prompting.md` for the structured prompt format. Use labeled fields — not prose paragraphs:
33 
34- **Camera** — handheld energy, micro-shake, slight reframe
35- **Subject** — keep generic (first frame defines appearance). Detailed facial descriptions trigger content safety filters
36- **Dialogue** — include actual script lines. Sora generates synced lip movement + audio
37- **Audio** — describe the RESULT not the gear. "Clean natural podcast audio, voice close and present, subtle room tone" works. Naming specific mics doesn't.
38- **Environment & light** — practical light, deep focus, real-world setting
39- **Style & mood** — iPhone selfie-camera realism, not cinematic
40 
41## Generation
42 
43**USE THE SCRIPTS. DO NOT construct API calls manually.** Scripts handle provider routing, field names, polling, downloading, and error handling.
44 
45```bash
46# Image-to-video (RECOMMENDED — first frame locks the face)
47bash scripts/generate-clip.sh \
48 --provider fal \
49 --image workspace/campaigns/<slug>/frames/frame1.png \
50 --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
51 --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
52 --log-file workspace/campaigns/<slug>/output-log.md \
53 --label a-roll-01 \
54 --seconds 8 --aspect-ratio portrait
55 
56# Text-to-video (fallback — no first frame)
57bash scripts/generate-clip.sh \
58 --provider fal \
59 --prompt-file workspace/campaigns/<slug>/scene-prompt.txt \
60 --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
61 --log-file workspace/campaigns/<slug>/output-log.md \
62 --label a-roll-01 \
63 --seconds 8 --aspect-ratio portrait
64 
65# Kling direct (skip Sora — use when Sora is sunset)
66bash scripts/generate-clip.sh \
67 --provider kling \
68 --image workspace/campaigns/<slug>/frames/frame1.png \
69 --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
70 --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
71 --log-file workspace/campaigns/<slug>/output-log.md \
72 --label a-roll-01 \
73 --seconds 8 --aspect-ratio portrait
74 
75# Replicate Sora (legacy — may stop working when Sora is sunset)
76bash scripts/generate-clip.sh \
77 --provider replicate \
78 --image workspace/campaigns/<slug>/frames/frame1.png \
79 --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
80 --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
81 --log-file workspace/campaigns/<slug>/output-log.md \
82 --label a-roll-01 \
83 --seconds 8 --aspect-ratio portrait
84```
85 
86## API Reference
87 
88Read `references/sora-api.md` for endpoint details, queue workflow, field names, and duration options. Sora fal.ai supports 4/8/12/16/20s. Kling supports 3-15s (durations >15s are auto-clamped). Replicate Sora is limited to 4/8/12.
89 
90## Content Filter Handling
91 
92Sora's content filter runs AFTER generation — can fail at 99%. If blocked:
93- Soften the motion prompt (keep first frame)
94- Remove any potentially sensitive descriptions
95- Retry with adjusted prompt
96- Or use `--provider kling` — Kling has no content safety filter
97 
98## Key Findings
99 
100- Include actual script in Dialogue field — Sora generates synced lip movement
101- For podcast audio: describe the RESULT, not the gear
102- Keep Subject descriptions generic — the first frame already defines appearance
103- fal.ai is primary provider; Kling 3 is auto-fallback when Sora fails or is sunset
104- Use `--provider kling` to skip Sora entirely
105 
106## Brand Memory Integration
107 
108### Reads
109| File | Purpose |
110|------|---------|
111| `workspace/campaigns/<slug>/frames/frame1.png` | Canonical face — fed to Sora i2v to lock creator identity |
112| `workspace/campaigns/<slug>/scripts/<format>-script.md` | A-roll segments, dialogue, shot timing |
113| `workspace/campaigns/<slug>/creators/creator-<name>.md` | Creator energy/vibe reference for motion prompting |
114| `workspace/creators/creator-<name>.md` | Fallback if no campaign-specific profile exists |
115 
116### Writes
117| File | Notes |
118|------|-------|
119| `workspace/campaigns/<slug>/clips/a-roll-01.mp4` | One file per A-roll segment |
120| `workspace/campaigns/<slug>/output-log.md` | Motion prompt, model, duration, provider (append-only) |
121 
122### Context loading
123 
124```
125🎥 Animate context loaded:
126 ✓ First frame: workspace/campaigns/ridge-q1/frames/frame1.png
127 ✓ Script: talking-head (A-roll segments: 3)
128 ✓ Creator: Maya
129 ✓ Campaign: ridge-q1
130```
131 
132## Contract
133 
134### Input
135- Required: approved `frame1.png` plus a script with `[A-ROLL]` segments
136- Optional: creator profile details, alternate prompt file, fallback provider
137- Format: workspace image and markdown files plus motion prompt text
138- Source: `/first-frame`, `/persona`, and `references/motion-prompting.md`
139 
140### Output
141- Produces: one A-roll clip per `[A-ROLL]` segment plus append-only generation logs
142- Format: MP4 files in `workspace/campaigns/<slug>/clips/` and rows in `output-log.md`
143- Default behavior: use Sora image-to-video with the approved first frame; use text-to-video only as a fallback when no usable frame exists
144- Downstream use: `/b-roll` and `/assemble`
145 
146### Validation
147- Pre-conditions: first frame is approved, script is tagged correctly, and the prompt includes the actual dialogue
148- Post-conditions: local MP4 is saved, creator identity holds, and lip movement/audio feel believable enough to cut into a final video
149- Failure checks: reroll or adjust the prompt if content filters fail, the hands/face break realism, or the clip is too synthetic to pass downstream
150 
151## Output
152 
153- A-roll clips (MP4) in `workspace/campaigns/<slug>/clips/`
154- Each clip named `a-roll-<segment>.mp4` corresponding to an `[A-ROLL]` script segment
155- Generation params logged to `workspace/campaigns/<slug>/output-log.md`
156 
157## Next Step
158 
159A-roll done → run `/b-roll` for environment shots, or `/assemble` if no B-roll needed.
160 

Discussion

Alternatives

Also in Video productionSee all 320 in Content creator →