Viral Video Script
Write the words for a short-form video (reel / TikTok / Short) so the human
brain can't scroll past it. The formula is distilled from Tuan Le's talk "What
Getting 3 Billion Views Taught Me About Human Psychology" — six psychological
principles plus a story skeleton. It works for "boring" products (instant ramen,
SaaS, phone plans) precisely because it sells how brains work, not the product.
The deliverable is a script, not a video. Its outputs drop straight into this
repo's pipeline: the clean narration track feeds voice-clone
/ avatar-reel-composer.
The formula (six principles)
Apply ALL six. They are not a menu.
Familiarity beats originality (mere-exposure effect). Don't invent a
format — steal a proven one (reaction, challenge, "walk up to a stranger",
office tour, "how much do you pay for rent", "hey chef, make me something").
The brain watches what it already recognizes and has liked before. Originality
reads as confusion, and confusion is the fastest path to a scroll.
The curiosity gap hook. The first ~2 seconds open a gap between what the
viewer knows and what they want to know — an itch they can't leave unscratched.
Never lead with the product; the instant a brain tags content as an ad, it
scrolls. Trigger curiosity, disbelief, or identity recognition instead. The
product appears naturally once they're already watching.
Sell identity, not the product (Means-End Chain). Every product has three
layers: (1) attributes = what it is, (2) functional consequences = what it does,
(3) psychological value = what it means to the viewer's identity/emotions.
Most brands talk layer 1. Talk layer 3. ("Supplement" → healthier body → energy
& mood → "I feel in control of my body and my life.") When you speak to identity,
the viewer feels understood, not sold to — and the brain stops flagging the ad.
The credential shortcut (authority bias). The brain takes shortcuts; the
biggest is authority. Put a credential in the first ~2 seconds ("Thai chef",
"Harvard student", "engineer who sold his company", a real kitchen + chef's
outfit). It buys instant trust before the viewer evaluates anything.
Build in shareability (social currency). People don't share what they like
— they share what makes them look good (smart, funny, in-the-know) to their
friends. You are the wingman: make the sharer look like they have great taste.
The premise must be explainable in one sentence; if they can't describe it
fast, they won't share it. Drivers that spread: humor, surprise, awe. (Sadness
and anger get views but don't spread the same way.)
The story skeleton (narrative transportation). Inside a story, critical
thinking slows and emotion takes over — the best state for the brand to appear.
Every script follows: Hook → Problem → Story → Payoff. Editing rules: cut any
frame that isn't delivering new info, keep clips a few seconds each (every cut
resets the brain's attention clock), always burn in captions (dual
audio+visual processing boosts retention), zero dead space.
North star: the product is almost irrelevant. What matters is whether you
understand the person watching — what catches their attention and what makes them
share. Put people first.
Inputs to gather (ask only what's missing)
| Input |
Needed for |
Example |
| Product / brand / topic |
the subject |
"Buldak instant ramen" |
| Audience |
identity layer (#3), tone |
"spice-loving Gen Z snackers" |
| Platform |
pacing / length |
tiktok | reels | shorts |
| Language |
the spoken copy |
es | en (default: match the user) |
| Target length |
beat budget |
~30s (default 25–40s) |
| Credential available |
the authority hook (#4) |
"Korean street-food chef" |
| A format to steal (optional) |
#1 — else propose 2–3 |
"spicy-challenge reaction" |
If a credential or stealable format is missing, propose options rather than
skipping the principle.
Workflow
- [ ] 1. Gather inputs (above). Propose a format-to-steal + credential if absent.
- [ ] 2. Scaffold the beat sheet JSON.
- [ ] 3. Fill every field, writing the spoken copy beat-by-beat in the formula's voice.
- [ ] 4. Validate against the formula. Fix every FAIL, weigh each WARN.
- [ ] 5. Render the shooting script (.md) + narration track (.txt).
- [ ] 6. Hand off (read aloud / send to voice-clone / avatar-reel-composer).
Step 2 — scaffold (writes <out>/<slug>.script.json pre-structured with the formula):
python3 .cursor/skills/viral-video-script/scripts/scaffold.py buldak-spicy \
--product "Buldak instant ramen" --language en --platform tiktok --seconds 32 \
--out scripts_out/
Step 3 — write. Edit the JSON. The hard rules the validator enforces:
format_steal, credential, identity_value, shareable_premise are all non-empty.
beats contains hook → problem → story → payoff in that order.
hook.spoken is ≤ ~14 words (≈2s) and must not contain the product name.
shareable_premise is ONE sentence, ≤ ~20 words.
share_trigger ∈ {humor, surprise, awe}.
captions: true, cut_every_seconds ≤ 4, total spoken copy fits target_seconds.
Step 4 — validate (re-run until it passes; treat WARN as review notes):
python3 .cursor/skills/viral-video-script/scripts/check_script.py scripts_out/buldak-spicy.script.json
Step 5 — render (writes <slug>.script.md + <slug>.narration.txt next to the JSON):
python3 .cursor/skills/viral-video-script/scripts/render_script.py scripts_out/buldak-spicy.script.json
Writing the spoken copy (per beat)
- Hook (≈2s): the curiosity gap + the credential, NOT the product. Use the
stolen format's recognizable opener. One short line.
- Problem (≈4–6s): the tension the viewer already feels — framed at the
identity layer, not the product layer.
- Story (≈15–25s): the recognizable format plays out; the product enters
naturally as part of the story, never as a pitch.
- Payoff (≈5–8s): resolve the gap + the identity reward, then the lightest
possible product/CTA. End on the feeling, not the feature.
Keep sentences short and spoken (this is read aloud / lip-synced). Mark on-screen
action and caption text per beat; assume a cut every 2–4s.
Output files
<slug>.script.json # the beat sheet (source of truth; edit this)
<slug>.script.md # human shooting script: beats, timing, VO, on-screen, captions, notes
<slug>.narration.txt # clean spoken VO only — feed to voice-clone / narrate.py
Handoff into this repo's pipeline
The narration track is what the avatar speaks:
# clone/say in an avatar's voice, or compose a full reel from the script
python3 .cursor/skills/voice-clone/scripts/... # TTS the narration.txt
python3 .cursor/skills/avatar-reel-composer/scripts/compose_reel.py <storyboard.json> --finish
For B-roll-only or found-footage shots referenced in the script, see
broll-generator and broll-finder.
Anti-patterns
- Leading with the product in the hook (instant ad-flag → scroll). #2.
- Inventing a format instead of stealing a proven one. #1.
- Selling features (layer 1) instead of identity (layer 3). #3.
- A premise you can't say in one sentence → unshareable. #5.
- Relying on sadness/anger for reach — gets views, doesn't spread. #5.
- Long takes, no captions, dead space → the brain tunes out. #6.
Additional resources
- The psychology behind each principle + the original case studies: REFERENCE.md
- Full worked example scripts (EN + ES): examples.md
1---2name: viral-video-script3description: Write short-form video scripts / dialogue that follow Tuan Le's "3 billion views" viral formula — the six psychological principles (familiarity / format-steal, curiosity-gap hook, identity over product via the Means-End Chain, the credential / authority shortcut, built-in shareability, and the Hook→Problem→Story→Payoff story skeleton with fast cuts + captions). Produces a beat sheet (JSON), a shooting script (Markdown) and a clean narration track (txt) ready to feed voice-clone / avatar-reel-composer. Use when the user wants to write a script, dialogue, hook, or voice-over for a reel / short / TikTok, make a brand or product go viral, repurpose a boring product into engaging content, or mentions "guion", "guión", "script para un reel", "diálogo", "hook viral", "voz en off", or the viral / psychology content formula.4---56# Viral Video Script78Write the **words** for a short-form video (reel / TikTok / Short) so the human9brain can't scroll past it. The formula is distilled from Tuan Le's talk *"What10Getting 3 Billion Views Taught Me About Human Psychology"* — six psychological11principles plus a story skeleton. It works for "boring" products (instant ramen,12SaaS, phone plans) precisely because it sells how brains work, not the product.1314The deliverable is a script, not a video. Its outputs drop straight into this15repo's pipeline: the clean narration track feeds [`voice-clone`](../voice-clone/SKILL.md)16/ [`avatar-reel-composer`](../avatar-reel-composer/SKILL.md).1718## The formula (six principles)1920Apply ALL six. They are not a menu.21221. **Familiarity beats originality** *(mere-exposure effect)*. Don't invent a23 format — **steal a proven one** (reaction, challenge, "walk up to a stranger",24 office tour, "how much do you pay for rent", "hey chef, make me something").25 The brain watches what it already recognizes and has liked before. Originality26 reads as *confusion*, and confusion is the fastest path to a scroll.27282. **The curiosity gap hook**. The first ~2 seconds open a gap between what the29 viewer knows and what they want to know — an itch they can't leave unscratched.30 **Never lead with the product**; the instant a brain tags content as an ad, it31 scrolls. Trigger curiosity, disbelief, or identity recognition instead. The32 product appears *naturally* once they're already watching.33343. **Sell identity, not the product** *(Means-End Chain)*. Every product has three35 layers: (1) attributes = what it is, (2) functional consequences = what it does,36 (3) **psychological value = what it means to the viewer's identity/emotions**.37 Most brands talk layer 1. Talk layer 3. ("Supplement" → healthier body → energy38 & mood → *"I feel in control of my body and my life."*) When you speak to identity,39 the viewer feels understood, not sold to — and the brain stops flagging the ad.40414. **The credential shortcut** *(authority bias)*. The brain takes shortcuts; the42 biggest is authority. Put a credential in the first ~2 seconds ("Thai chef",43 "Harvard student", "engineer who sold his company", a real kitchen + chef's44 outfit). It buys instant trust *before* the viewer evaluates anything.45465. **Build in shareability** *(social currency)*. People don't share what they like47 — they share what makes **them** look good (smart, funny, in-the-know) to their48 friends. You are the **wingman**: make the sharer look like they have great taste.49 The premise must be explainable in **one sentence**; if they can't describe it50 fast, they won't share it. Drivers that spread: **humor, surprise, awe**. (Sadness51 and anger get views but don't spread the same way.)52536. **The story skeleton** *(narrative transportation)*. Inside a story, critical54 thinking slows and emotion takes over — the best state for the brand to appear.55 Every script follows: **Hook → Problem → Story → Payoff**. Editing rules: cut any56 frame that isn't delivering new info, keep clips a few seconds each (every cut57 resets the brain's attention clock), **always burn in captions** (dual58 audio+visual processing boosts retention), zero dead space.5960> North star: the product is almost irrelevant. What matters is whether you61> understand the person watching — what catches their attention and what makes them62> share. Put **people first**.6364## Inputs to gather (ask only what's missing)6566| Input | Needed for | Example |67|---|---|---|68| Product / brand / topic | the subject | "Buldak instant ramen" |69| Audience | identity layer (#3), tone | "spice-loving Gen Z snackers" |70| Platform | pacing / length | `tiktok` \| `reels` \| `shorts` |71| Language | the spoken copy | `es` \| `en` (default: match the user) |72| Target length | beat budget | ~30s (default 25–40s) |73| Credential available | the authority hook (#4) | "Korean street-food chef" |74| A format to steal (optional) | #1 — else propose 2–3 | "spicy-challenge reaction" |7576If a credential or stealable format is missing, **propose options** rather than77skipping the principle.7879## Workflow8081```82- [ ] 1. Gather inputs (above). Propose a format-to-steal + credential if absent.83- [ ] 2. Scaffold the beat sheet JSON.84- [ ] 3. Fill every field, writing the spoken copy beat-by-beat in the formula's voice.85- [ ] 4. Validate against the formula. Fix every FAIL, weigh each WARN.86- [ ] 5. Render the shooting script (.md) + narration track (.txt).87- [ ] 6. Hand off (read aloud / send to voice-clone / avatar-reel-composer).88```8990**Step 2 — scaffold** (writes `<out>/<slug>.script.json` pre-structured with the formula):9192```bash93python3 .cursor/skills/viral-video-script/scripts/scaffold.py buldak-spicy \94 --product "Buldak instant ramen" --language en --platform tiktok --seconds 32 \95 --out scripts_out/96```9798**Step 3 — write.** Edit the JSON. The hard rules the validator enforces:99- `format_steal`, `credential`, `identity_value`, `shareable_premise` are all non-empty.100- `beats` contains `hook → problem → story → payoff` in that order.101- `hook.spoken` is ≤ ~14 words (≈2s) and **must not contain the product name**.102- `shareable_premise` is ONE sentence, ≤ ~20 words.103- `share_trigger` ∈ {humor, surprise, awe}.104- `captions: true`, `cut_every_seconds` ≤ 4, total spoken copy fits `target_seconds`.105106**Step 4 — validate** (re-run until it passes; treat WARN as review notes):107108```bash109python3 .cursor/skills/viral-video-script/scripts/check_script.py scripts_out/buldak-spicy.script.json110```111112**Step 5 — render** (writes `<slug>.script.md` + `<slug>.narration.txt` next to the JSON):113114```bash115python3 .cursor/skills/viral-video-script/scripts/render_script.py scripts_out/buldak-spicy.script.json116```117118## Writing the spoken copy (per beat)119120- **Hook (≈2s):** the curiosity gap + the credential, NOT the product. Use the121 stolen format's recognizable opener. One short line.122- **Problem (≈4–6s):** the tension the viewer already feels — framed at the123 identity layer, not the product layer.124- **Story (≈15–25s):** the recognizable format plays out; the product enters125 *naturally* as part of the story, never as a pitch.126- **Payoff (≈5–8s):** resolve the gap + the identity reward, then the lightest127 possible product/CTA. End on the feeling, not the feature.128129Keep sentences short and spoken (this is read aloud / lip-synced). Mark on-screen130action and caption text per beat; assume a cut every 2–4s.131132## Output files133134```135<slug>.script.json # the beat sheet (source of truth; edit this)136<slug>.script.md # human shooting script: beats, timing, VO, on-screen, captions, notes137<slug>.narration.txt # clean spoken VO only — feed to voice-clone / narrate.py138```139140## Handoff into this repo's pipeline141142The narration track is what the avatar speaks:143144```bash145# clone/say in an avatar's voice, or compose a full reel from the script146python3 .cursor/skills/voice-clone/scripts/... # TTS the narration.txt147python3 .cursor/skills/avatar-reel-composer/scripts/compose_reel.py <storyboard.json> --finish148```149150For B-roll-only or found-footage shots referenced in the script, see151[`broll-generator`](../broll-generator/SKILL.md) and [`broll-finder`](../broll-finder/SKILL.md).152153## Anti-patterns1541551. **Leading with the product** in the hook (instant ad-flag → scroll). #2.1562. **Inventing** a format instead of stealing a proven one. #1.1573. Selling **features** (layer 1) instead of **identity** (layer 3). #3.1584. A premise you can't say in one sentence → unshareable. #5.1595. Relying on sadness/anger for reach — gets views, doesn't spread. #5.1606. Long takes, no captions, dead space → the brain tunes out. #6.161162## Additional resources163164- The psychology behind each principle + the original case studies: [REFERENCE.md](REFERENCE.md)165- Full worked example scripts (EN + ES): [examples.md](examples.md)