UGC-Style Video Prompts
Core principle
Video models are decent at motion but worse than image models at solving "doesn't look AI" from zero — skin, lighting, and identity drift across many frames in ways a single still doesn't. Don't text-to-video a UGC clip from scratch. Generate the anchor still first (with the ugc-photo-prompts skill, or reuse one already in the media library), then animate it. The still already solved realism; the video model only has to solve movement and speech, which is what it's actually good at.
The pipeline
- Anchor still. Already exists in the media library, or generate one with
ugc-photo-prompts. This locks subject identity, wardrobe, product, lighting, and skin texture before any motion is added.
- Motion prompt. Describe only what changes from that frame — camera behavior, body motion, speech. Don't redescribe the subject/setting; the still already carries that.
- Model pick. Based on whether the beat needs synced dialogue, multiple combined references, or just clean simple motion — see the table below.
- One clip = one beat. A full UGC ad is a sequence of short jump-cut beats (hook, demo, reaction, CTA), not one continuous shot. Generate each beat as its own clip off the same anchor (or a small consistent set of anchors), then cut them together on the timeline.
- Lock the voice across beats. Same problem as appearance drift, different mechanism — describe the voice explicitly in every beat's prompt (or pin it with a
referenceAudioMediaRefs clip on Seedance) so the speaker doesn't sound like a different person from one cut to the next.
Motion-prompt formula
The still already did slots 1–4 and 6–8 from the photo formula. This is just what's added for motion:
- Seed reference. State plainly that this animates the provided still — most models infer this from
startFrameMediaRef/referenceImageMediaRefs alone, but naming it keeps the prompt focused on change, not redescription.
- Camera behavior. Default to handheld micro-shake or a static phone propped on a surface — not a smooth gimbal move or a dolly/crane. "Smooth cinematic camera move" is as strong an AI tell in video as studio lighting is in stills.
- Subject motion. Small, continuous, natural movement — a weight shift, a blink, hair moving, a hand gesture mid-sentence. Avoid big choreographed actions unless the beat specifically calls for one (e.g., the demo beat).
- Speech, if any. Put the exact line in quotes, written the way someone actually talks — contractions, a small pause, not ad copy. "okay wait this actually smells amazing" reads as real; "Introducing our revolutionary new formula" doesn't, regardless of delivery. If this speaker appears in more than one beat, describe the voice itself — and always include all four: pitch, tone, accent, and pace, not just one or two. "A warm, slightly raspy voice" alone is incomplete; "a warm, friendly tone, medium-pitched, neutral American accent, relaxed conversational pace" is the actual bar. Reuse that exact wording verbatim in every beat's prompt — each
generate_video call has no memory of any other, so the same anchor face will get a different voice per clip unless all four are pinned down explicitly every time. Seedance can do better than words: pass the rendered audio from beat one as a referenceAudioMediaRefs input on later beats to lock the actual voice rather than approximate it in text.
- Duration matched to the beat. Pick the shortest duration the model offers that fits one beat (often 4–6s) rather than padding a single clip to cover multiple actions — multi-action clips are where motion starts looking choreographed.
- Negative motion cues. Add: no smooth gimbal stabilization, no cinematic camera move, no professional production polish, no overly choreographed motion, no studio lighting. Carry over the standing negative list from
ugc-photo-prompts for the visual frame itself.
Model selection
Grounded in this project's actual model catalog and observed behavior, including real failures — not just the catalog spec sheet.
Default to Grok Imagine Video or Kling V3 for most beats. Between those two: Kling for anything needing a longer or more nuanced line, Grok when a quick draft is enough.
| Model |
Best for |
Notes |
| Grok Imagine Video |
Default pick for most beats |
Renders synced dialogue audio with accurate lip-sync in this project's tests. Caps at 720p — fine for most UGC use, not a 4k hero asset. |
| Kling V3 / Kling O3 |
Default pick, especially longer/dialogue-heavy beats |
Renders synced dialogue audio automatically when the prompt has a quoted line — confirmed repeatedly in this project. O3 allows more references (7 vs 3) if anchoring more than one element. Up to 4k, 3–15s, 16:9/9:16/1:1. |
| Seedance 2 / Seedance 2 Mini |
Beats combining multiple elements — person + product + a reference audio style |
Never default to 1080p/4k on Seedance 2 — it's expensive. If a beat doesn't specifically need that resolution, use Seedance 2 Mini (720p cap) instead, and if full Seedance 2 at 1080p/4k seems warranted, tell the user it costs significantly more and let them opt in manually rather than generating it by default. Most flexible model otherwise: up to 9 image refs, 3 video refs, 3 audio refs, 12 total combined. |
| Veo 3.1 / Veo 3.1 Fast |
Avoid as a default — use only if the user names it specifically |
Fails with a content-checker error often in this project (multiple failures across unrelated prompts/anchors in testing here) — unpredictable enough that it's not a safe default pick even though output quality is good when it works. |
Hailuo 2.3 Pro and other catalog models are available but not part of the default rotation — only reach for them if the user asks by name.
Running this inside Palmier Pro
- Gate.
get_timeline — if canGenerate is false, ask the user to sign in/subscribe. list_models({ type: "video" }) before every generate so model ids/caps match the live catalog. Propose model + duration + aspect + prompt; wait for confirmation (paid, not undoable).
- Get the anchor.
get_media for an existing still; otherwise run ugc-photo-prompts first.
- Match the canvas. Use project width/height/fps for
aspectRatio and beat duration.
- Generate.
generate_video with startFrameMediaRef = anchor still (image-to-video). For Seedance multi-element beats use referenceImageMediaRefs / referenceAudioMediaRefs / referenceVideoMediaRefs and refer to them in the prompt as @Image1, @Audio1, etc. Apply the motion-prompt formula above. Optional folder: "UGC/Beats".
- Verify. Async — ready when
get_media({ ids: [placeholder] }) has no generationStatus (absence = ready). On failed, report and ask before retry. Don't busy-poll.
- Assemble the beats.
add_clips({
entries: [
{ mediaRef: BEAT1, startFrame: 0 },
{ mediaRef: BEAT2, startFrame: END1 }, // or use insert_clips to ripple
]
})
Tighten with split_clips + ripple_delete_ranges / remove_words — there is no split_clip singular.
- Voiceover-only alternative. Pure b-roll + VO →
generate_audio (TTS) instead of a dialogue video model.
Worked example
Continuing the skincare-serum still from ugc-photo-prompts: animate it on Kling V3 with a spoken hook line — "Starting from this image: she glances down at the bottle in her hand, then looks back up at the camera with a small grin and says, in a warm, friendly tone, mid-pitched voice, neutral American accent, relaxed conversational pace, 'okay wait, this actually smells amazing,' a slight handheld shake throughout, no cinematic camera move, no smooth gimbal, no studio lighting, no professional production polish." That's the hook beat. The demo beat (her actually applying it) and a CTA beat would each be separate, shorter clips off the same anchor — and the full voice description ("a warm, friendly tone, mid-pitched voice, neutral American accent, relaxed conversational pace") gets repeated verbatim in both, not just implied by reusing the same face.
Guardrails
- Build fictional, generic personas — don't generate a specific real, identifiable person without their consent, and don't use this to recreate a named public figure's likeness.
- Keep wardrobe/pose/action choices brand-safe and non-sexualizing by default; only go further if the user explicitly asks for it.
1---2name: ugc-video-prompts3description: Generate ultra-realistic UGC/influencer-style video clips inside Palmier Pro — talking selfies, product demos, candid lifestyle motion — using the proven still-then-animate pipeline instead of cold text-to-video. Drives Palmier Pro's generate_video, get_timeline, and get_media tools directly, with model selection grounded in this project's actual capabilities (dialogue/audio support, reference limits, resolution). Use whenever the user wants UGC-style video, influencer clips, talking-to-camera ad creative, "make a video of [a person/product]," or animating a still into motion — even if they don't say "UGC" explicitly. Pairs with the ugc-photo-prompts skill, which should run first to produce the anchor still.4---56# UGC-Style Video Prompts78## Core principle910Video models are decent at motion but worse than image models at solving "doesn't look AI" from zero — skin, lighting, and identity drift across many frames in ways a single still doesn't. Don't text-to-video a UGC clip from scratch. **Generate the anchor still first** (with the `ugc-photo-prompts` skill, or reuse one already in the media library), **then animate it.** The still already solved realism; the video model only has to solve movement and speech, which is what it's actually good at.1112## The pipeline13141. **Anchor still.** Already exists in the media library, or generate one with `ugc-photo-prompts`. This locks subject identity, wardrobe, product, lighting, and skin texture before any motion is added.152. **Motion prompt.** Describe only what changes from that frame — camera behavior, body motion, speech. Don't redescribe the subject/setting; the still already carries that.163. **Model pick.** Based on whether the beat needs synced dialogue, multiple combined references, or just clean simple motion — see the table below.174. **One clip = one beat.** A full UGC ad is a sequence of short jump-cut beats (hook, demo, reaction, CTA), not one continuous shot. Generate each beat as its own clip off the same anchor (or a small consistent set of anchors), then cut them together on the timeline.185. **Lock the voice across beats.** Same problem as appearance drift, different mechanism — describe the voice explicitly in every beat's prompt (or pin it with a `referenceAudioMediaRefs` clip on Seedance) so the speaker doesn't sound like a different person from one cut to the next.1920## Motion-prompt formula2122The still already did slots 1–4 and 6–8 from the photo formula. This is just what's added for motion:23241. **Seed reference.** State plainly that this animates the provided still — most models infer this from `startFrameMediaRef`/`referenceImageMediaRefs` alone, but naming it keeps the prompt focused on *change*, not redescription.252. **Camera behavior.** Default to handheld micro-shake or a static phone propped on a surface — not a smooth gimbal move or a dolly/crane. "Smooth cinematic camera move" is as strong an AI tell in video as studio lighting is in stills.263. **Subject motion.** Small, continuous, natural movement — a weight shift, a blink, hair moving, a hand gesture mid-sentence. Avoid big choreographed actions unless the beat specifically calls for one (e.g., the demo beat).274. **Speech, if any.** Put the *exact* line in quotes, written the way someone actually talks — contractions, a small pause, not ad copy. "okay wait this actually smells amazing" reads as real; "Introducing our revolutionary new formula" doesn't, regardless of delivery. **If this speaker appears in more than one beat, describe the voice itself — and always include all four: pitch, tone, accent, and pace, not just one or two.** "A warm, slightly raspy voice" alone is incomplete; "a warm, friendly tone, medium-pitched, neutral American accent, relaxed conversational pace" is the actual bar. Reuse that exact wording verbatim in every beat's prompt — each `generate_video` call has no memory of any other, so the same anchor face will get a *different* voice per clip unless all four are pinned down explicitly every time. Seedance can do better than words: pass the rendered audio from beat one as a `referenceAudioMediaRefs` input on later beats to lock the actual voice rather than approximate it in text.285. **Duration matched to the beat.** Pick the shortest duration the model offers that fits one beat (often 4–6s) rather than padding a single clip to cover multiple actions — multi-action clips are where motion starts looking choreographed.296. **Negative motion cues.** Add: no smooth gimbal stabilization, no cinematic camera move, no professional production polish, no overly choreographed motion, no studio lighting. Carry over the standing negative list from `ugc-photo-prompts` for the visual frame itself.3031## Model selection3233Grounded in this project's actual model catalog and observed behavior, including real failures — not just the catalog spec sheet.3435**Default to Grok Imagine Video or Kling V3 for most beats.** Between those two: Kling for anything needing a longer or more nuanced line, Grok when a quick draft is enough.3637| Model | Best for | Notes |38|---|---|---|39| **Grok Imagine Video** | Default pick for most beats | Renders synced dialogue audio with accurate lip-sync in this project's tests. Caps at 720p — fine for most UGC use, not a 4k hero asset. |40| **Kling V3 / Kling O3** | Default pick, especially longer/dialogue-heavy beats | Renders synced dialogue audio automatically when the prompt has a quoted line — confirmed repeatedly in this project. O3 allows more references (7 vs 3) if anchoring more than one element. Up to 4k, 3–15s, 16:9/9:16/1:1. |41| **Seedance 2 / Seedance 2 Mini** | Beats combining multiple elements — person + product + a reference audio style | **Never default to 1080p/4k on Seedance 2 — it's expensive. If a beat doesn't specifically need that resolution, use Seedance 2 Mini (720p cap) instead, and if full Seedance 2 at 1080p/4k seems warranted, tell the user it costs significantly more and let them opt in manually rather than generating it by default.** Most flexible model otherwise: up to 9 image refs, 3 video refs, 3 audio refs, 12 total combined. |42| **Veo 3.1 / Veo 3.1 Fast** | Avoid as a default — use only if the user names it specifically | Fails with a content-checker error often in this project (multiple failures across unrelated prompts/anchors in testing here) — unpredictable enough that it's not a safe default pick even though output quality is good when it works. |4344Hailuo 2.3 Pro and other catalog models are available but not part of the default rotation — only reach for them if the user asks by name.4546## Running this inside Palmier Pro47481. **Gate.** `get_timeline` — if `canGenerate` is false, ask the user to sign in/subscribe. `list_models({ type: "video" })` before every generate so model ids/caps match the live catalog. Propose model + duration + aspect + prompt; wait for confirmation (paid, not undoable).492. **Get the anchor.** `get_media` for an existing still; otherwise run `ugc-photo-prompts` first.503. **Match the canvas.** Use project width/height/fps for `aspectRatio` and beat duration.514. **Generate.** `generate_video` with `startFrameMediaRef` = anchor still (image-to-video). For Seedance multi-element beats use `referenceImageMediaRefs` / `referenceAudioMediaRefs` / `referenceVideoMediaRefs` and refer to them in the prompt as `@Image1`, `@Audio1`, etc. Apply the motion-prompt formula above. Optional `folder: "UGC/Beats"`.525. **Verify.** Async — ready when `get_media({ ids: [placeholder] })` has **no** `generationStatus` (absence = ready). On `failed`, report and ask before retry. Don't busy-poll.536. **Assemble the beats.**54 ```55 add_clips({56 entries: [57 { mediaRef: BEAT1, startFrame: 0 },58 { mediaRef: BEAT2, startFrame: END1 }, // or use insert_clips to ripple59 ]60 })61 ```62 Tighten with `split_clips` + `ripple_delete_ranges` / `remove_words` — there is no `split_clip` singular.637. **Voiceover-only alternative.** Pure b-roll + VO → `generate_audio` (TTS) instead of a dialogue video model.6465## Worked example6667Continuing the skincare-serum still from `ugc-photo-prompts`: animate it on Kling V3 with a spoken hook line — *"Starting from this image: she glances down at the bottle in her hand, then looks back up at the camera with a small grin and says, in a warm, friendly tone, mid-pitched voice, neutral American accent, relaxed conversational pace, 'okay wait, this actually smells amazing,' a slight handheld shake throughout, no cinematic camera move, no smooth gimbal, no studio lighting, no professional production polish."* That's the hook beat. The demo beat (her actually applying it) and a CTA beat would each be separate, shorter clips off the same anchor — and the full voice description ("a warm, friendly tone, mid-pitched voice, neutral American accent, relaxed conversational pace") gets repeated verbatim in both, not just implied by reusing the same face.6869## Guardrails7071- Build fictional, generic personas — don't generate a specific real, identifiable person without their consent, and don't use this to recreate a named public figure's likeness.72- Keep wardrobe/pose/action choices brand-safe and non-sexualizing by default; only go further if the user explicitly asks for it.