# Script

> Writes a shoot-ready script for a Reel or TikTok from an idea, in a fixed beat format with timecodes, spoken line, on-screen text, and B-roll. Use when a video script, a screenplay, a script for a Reel, a TikTok, or a Short is needed. Foundation for /shotlist, /cut, and /caption.

- Skill: `bendemartin97/script` (Agent Skill)
- Install (CLI): `npx skillmds@latest add bendemartin97/script`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bendemartin97/script/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: bendemartin97 (https://skillmd.com/u/bendemartin97)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/bendemartin97/script

---


# Write script

This script is the single source for everything that follows: shoot plan, cut list,
subtitles, and caption are derived from it. That's why the output format is binding
and must not vary.

## Process

1. **Load context.** `BRAND.md` for the voice, `FORMATS.md` for the structure of the
   chosen format, `LEARNINGS.md` for what's worked most recently.
2. **Clarify the framework.** Platform, target length, pillar, and format. Derive
   whatever wasn't specified from the project knowledge and make the assumption
   visible above the script — don't ask, as long as a reasonable assumption is
   possible.
3. **Set the promise.** One sentence: what does the viewer get out of it after 30
   seconds? Sits as a comment line above the script and is the touchstone for every
   beat.
4. **Build beats.** Every beat carries exactly one thought. A beat that wants two
   things at once gets split.
5. **Calculate speaking duration** (see below) and derive the timecodes from it —
   don't estimate.
6. **Run the self-check** and output the result below it.

## Speaking duration

Calculate with **2.7 spoken words per second**. That's a brisk pace, typical for
social video.

- Count the word count per beat, divide by 2.7, round to half seconds.
- Add **0.3 seconds of buffer** per beat for breathing and cutting.
- Set beats without a spoken line (pure visual moments) at the planned hold time, at
  least 0.8 seconds.

If the total deviates from the target length by more than 15 percent, shorten or
extend **the content** — never by speaking faster.

> **Calibration:** after the first three videos are shot, compare the actual
> speaking duration to the calculated one and correct the value 2.7 in this file to
> your own pace. After that, the lengths will be accurate to the second.

## Output format

Exactly this structure, with no additional headings or body text in between:

```
# SCRIPT · <working title>
PROMISE: <one sentence>
META: platform=<reel|tiktok> · target=<seconds>s · calculated=<seconds>s · pillar=<name> · format=<name>

## BEAT 1 · HOOK · 00:00–00:02
VO:    "<spoken text, verbatim>"
TEXT:  <overlay, in caps as it should appear, or ->
SHOT:  <framing, movement, what's visible>
SOUND: <music change, effect, or ->

## BEAT 2 · <LABEL> · 00:02–00:09
VO:    "..."
TEXT:  ...
SHOT:  ...
SOUND: ...

## BEAT n · CTA · 00:xx–00:xx
VO:    "..."
TEXT:  ...
SHOT:  ...
SOUND: ...
```

Field rules:

- **VO** is verbatim and speakable. Read it aloud in your head: what can't be said
  in one breath gets split. No written-register phrasing, no nested clauses, no
  words that trip you up.
- **TEXT** is the on-screen overlay. Short, in caps, never identical to what's
  spoken – it complements or anchors it. Empty is better than redundant, then `-`.
- **SHOT** describes framing, movement, and subject concretely enough to shoot from
  without having to ask.
- **SOUND** only gets an entry when something happens at that point: music change,
  beat drop, effect, silence. Otherwise `-`.
- **LABEL** names the beat's function: HOOK, PROBLEM, MISTAKE 1, TWIST, PROOF,
  RESOLUTION, CTA.

### Format-specific fields

**If `FORMATS.md` describes a text carrier in the shot** – a sign, a card, a
printed document, an object with lettering –, then that's a **field of its own in
the beat**, not an aside under SHOT:

```
SIGN: <exact text, as it should appear on the carrier>
```

The text has to fit the surface and work without sound. A script that only
describes it instead of spelling it out forces reinvention later.

**Check in `FORMATS.md` whether the carrier exists on set or only gets created in
editing.** A physical prop has to be made before the shoot; an overlaid card is
created in post and can be changed until the last moment. Don't treat it as a
shoot task if it isn't one.

The same applies to any other recurring element that `FORMATS.md` names as part of
the base format. Carry it over into the schema as a named field.

## Self-check

Output after the script, each marked met or not:

- Hook under twelve words and with its own visual idea
- All format-specific fields from `FORMATS.md` are filled in, not paraphrased
- Every beat carries exactly one thought
- No TEXT field repeats its VO field verbatim
- Calculated length within 15 percent of the target
- The promise is actually delivered by the end
- The CTA matches the promise and is a single, concrete action
- Sounds like `BRAND.md` – no phrasing that could sit on just any account
- If `FORMATS.md` defines a check formula, it's satisfied point by point – it beats
  all the general rules in this instruction

Whatever isn't met gets named and fixed, not glossed over.

