---
name: motion-design
description: Motion graphics over a Kenerate video or image. Animated kinetic typography (words pop, slide or flicker on), subtitle, lower third (name / role), call-to-action pill and an end logo sting, rendered frame by frame with Pillow and encoded with ffmpeg. Presets bold-pop, minimal and neon. Use when the user wants titles, text animation, a lower third, a logo reveal / sting, an intro or outro, or "After Effects style" motion design on a clip, background or brand gradient.
compatibility: Needs the Kenerate MCP server for backgrounds and logos, and Python 3.9+ with Pillow and ffmpeg for rendering.
metadata:
  author: kenerate
  version: "1.0"
  kenerate-tools: "generate_video generate_image remove_background generate_music estimate_cost wait_for_generation"
---

# Motion design (kinetic type, lower thirds, logo sting)

Kenerate makes the background footage and the logo. `scripts/motion.py` animates the graphics on top, locally and
for free. Rules: [references/KENERATE.md](references/KENERATE.md) (models and voices: [references/MODELS.md](references/MODELS.md), or the free `pick_model` / `pick_voice` tools).

## Ask the user
- Title (2-6 words animate best), optional subtitle, lower third `Name|Role`, CTA ("Shop now"), logo and tagline for the end sting.
- Look: `bold-pop` (accent sticker, words pop in), `minimal` (fades, thin rule, scrim), or `neon` (glow, flicker). Accent colour (brand hex).
- Format (9:16 / 16:9 / 1:1 / 4:5) and length (default: the background clip's length, else 6 s).

## 1. Background and logo (Kenerate)
- Background clip: `generate_video(prompt="<slow camera move over an abstract / branded scene>, empty centre for text, no text", aspect_ratio=<format>, duration=6, model="kenerate/wan-3.0", resolution="720p", audio=false)`.
  Run `estimate_cost` with the same arguments first. A still works too: `generate_image(..., aspect_ratio=<format>)`.
  Or skip Kenerate entirely: `--bg "gradient:#0F172A,#7C3AED"` or `--bg "#111111"`.
- Logo: the user's file, or `generate_image(prompt='Logo for "<name>": ..., flat vector, plain white background', model="kenerate/gpt-image-2.5-sunburst", aspect_ratio="1:1")` (or `kenerate/recraft-v4.1`),
  then `remove_background(image_url=logo, mode="cutout")` for a transparent PNG (kind `"remove-bg"`).
- Sound: none by default. Ask first (music? keep the clip's native audio? silent?). Music only on a yes:
  `generate_music(..., engine="elevenlabs-music-v2.5", instrumental=true, seconds=<length>)` → `--music`.
- Wait for each job and keep `urls[0]`.

## 2. Render (local)
```
python <skill-dir>/scripts/motion.py --bg "<clip or image url | #hex | gradient:#a,#b>" \
  --title "SUMMER DROP" --subtitle "New flavours, same kick" \
  --lower-third "Maya Lin|Head Roaster" --cta "Shop now" \
  --logo "<transparent logo url>" --tagline "brewandbloom.com" \
  --preset bold-pop --accent "#FFD60A" --aspect 9:16 --preview \
  --out kenerate-out/motion-design/<project>_9x16.mp4
```
- Timeline: title in at 0.25 s (staggered per word), subtitle after it, lower third at ~20% of the length, CTA at
  ~45%, everything out before the sting, and the logo sting in the last ~1.8 s (background dims, logo springs in, a ring flashes, tagline).
- `--sting none` skips the sting; `--duration` sets the length; `--font path.ttf` (brand font) or
  `--font-family "Bebas Neue"` (free OFL font, downloaded once) sets the title font;
  `--music` replaces the clip's sound; `--preview` saves a 5-frame contact sheet (`*_preview.jpg`). Show it to the user.
- To make a set: run it once per preset or per aspect with different `--out` names.

## Progress and output
4 steps: fetch → layout → `Rendering N frames + encoding` (percent per frame) → check. `RESULT_JSON.output.path` is the
video, and `preview` is the contact sheet.

## If something fails
- Text too long → it auto-shrinks to fit 3 lines. Suggest a shorter title if it got small (`title font Npx` in the log).
- A background clip that failed on Kenerate is refunded. Retry on approval, or use a gradient background for free.
- Missing fonts on Linux: install `fonts-dejavu` or pass `--font`.

## Limits
Rendering is CPU-bound: about 1-3 s per second of 1080p video. Keep pieces to 30 s or less and use `--res 720` for drafts.
