---
name: hook-multiplier
description: Turn one video ad into N A/B-test variants with different 3-second hooks. Writes scroll-stopping hook lines, generates a hook visual per line with the Kenerate MCP (image or short clip), overlays the hook text, and stitches each hook onto the same ad body, plus a contact sheet and a CSV of variants. Use when the user wants hook variations, creative testing, more ad variants, a "first 3 seconds" test, or UGC-style hook swaps for TikTok / Reels / Shorts / Meta ads.
compatibility: Needs the Kenerate MCP server and Python 3.9+ with Pillow and ffmpeg.
metadata:
  author: kenerate
  version: "1.0"
  kenerate-tools: "generate_image generate_video estimate_cost wait_for_generation upload_media"
---

# Hook multiplier

Each variant keeps the same body and swaps the first ~3 seconds. Generation happens on Kenerate; `scripts/hooks.py`
builds the variants locally. 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
- The ad body: a Kenerate url, or a public link to pass to `upload_media`.
- Product / offer and audience, and how many hooks (default 5, max 20).
- Hook visuals: stills (cheap, a slow push-in is added) or short clips (more thumb-stopping, priced per second).

## 1. Write the hooks
Write N hook lines of different types: a question ("Still drinking bitter cold brew?"), a bold claim, POV, a
"stop scrolling if…", a number / stat, a contrarian take, social proof. Keep each to 3-9 words. Show the list and get a yes.

## 2. Hook visuals (Kenerate)
- Stills: `generate_image(prompt="<scene for the hook>, vertical, bold, high contrast, empty top third for text, no text", aspect_ratio="9:16", model="kenerate/gpt-image-2.5-sunburst")`
  (or `kenerate/gpt-image-2.5-flare` / `kenerate/flash` for cheap drafts). With a product, add `reference_image_urls=[product]` and `model="kenerate/nano-banana-2.1"`.
- Clips: `estimate_cost("generate_video", {"prompt": ..., "image_url": still, "duration": 3, "model": "kenerate/wan-3.0", "resolution": "720p", "aspect_ratio": "9:16", "audio": false})`
  (`kenerate/seedance-2.0` when the product must stay exact; ask before turning native audio on)
  for one clip, multiply by N, confirm, then start all N `generate_video` calls and wait for each (kind `"video"`).
- A hook can also have no visual: the text then sits over a blurred freeze of the body's first frame, which is free.

## 3. Build the variants (local)
```
python <skill-dir>/scripts/hooks.py --body "<ad body url>" \
  --hook "<hook1 image or clip url>::Still drinking bitter cold brew?" \
  --hook "<hook2 url>::POV: your 3pm slump just met its match" \
  --hook "::I tried every cold brew so you don't have to" \
  --aspect 9:16 --hook-seconds 3 --text-style bold --text-pos top --name coldbrew \
  --out-dir kenerate-out/hook-multiplier
```
- `--text-style bold` (white, outlined), `box` (black on white) or `accent` (black on `--accent`).
- `--transition cut` (default, punchy) or `fade` with `--xfade 0.2`.
- Many hooks: `--hooks-json hooks.json` = `[{"media": "...", "text": "...", "seconds": 3}]`.

## Output
`coldbrew_hook01.mp4 … hookNN.mp4`, `coldbrew_hooks_sheet.jpg` (show it to the user) and `coldbrew_hooks.csv` (file,
hook text, media, lengths) for the ad manager. Relay the `[n/5]` steps.

## If something fails
A failed hook generation is refunded. Build the other variants anyway and offer to retry just that one (or use the
free freeze-frame hook). Download errors mean the link expired: `get_generation` again.

## Limits
Hooks should be 1.5-5 s. The body is re-encoded once and reused for all variants.
