DESIGN.md@plugins/motion-launch-videos/skills/motion-captions/templates · git:20260929.c594fcb · 2026-09-29 · sha256 ec0d795cadd0649e

DESIGN.md@plugins/motion-launch-videos/skills/motion-captions/templates git:20260929.c594fcbA

Immutable. This exact content never changes and is served at /api/v1/blob/ec0d795cadd0649e.

# Design: <film>

The spec the film is built from. Numbers here and in the FILM config agree; when one changes, change both. Caption breaks and times come from the engine: paste the table `render.mjs layout` prints after the first build, and change the transcript's punctuation only where the speaker really paused.

## Canvas and time

- 1080 x 1920 (9:16), 60 fps, <n> s = <n x 60> frames, `loop: 'none'`.
- The voice: `assets/<file>` (<duration> s, <MP3 / WAV / OGG>), from <offset> s. The last word ends at <t> s; the film ends <0.5 to 1.5> s later.
- Transcript: <word-level JSON / SRT / VTT>, <n> words; exact / approximate word times.

## Style

- Style: <pop / karaoke / subtitles / audiogram (karaoke / pop)>, because <where it plays and what the picture is>.
- Changes to the transcript (as BRIEF.md records them): punctuation <keep / trim / strip>, case <as-is / upper>, fillers removed <none / um, uh>.
- Emphasis: <the words, and why each>. Emphasis cue: <kind and gain / none>.
- Emoji: off / <word: icon, ...>.

## Formats

- Master 9:16 (1080 x 1920). Delivered also: <1:1 (1080 x 1080) / 16:9 (1920 x 1080) / none>.
- Positions are in base pixels (9:16); with no `pin` an element keeps its offset from the centre.

| Format | Caption block (x, y, maxW, size, lines) | Brand | Speaker, progress | Safe zone |
|---|---|---|---|---|
| 9:16 | 540, <y>, 720, <size>, <lines> | y <y>, pin t | y <y>, <y>, pin b | [104, 230, 907, 1536] |
| 1:1 | | | | [104, 104, 976, 976] |
| 16:9 | | | | [104, 104, 1816, 976] |

## Palette

| Role | Hex | Used for | Contrast |
|---|---|---|---|
| bg | | the backdrop's top | |
| | | the backdrop's bottom, shapes | |
| paper | | caption fill, brand | on the stroke / box: |
| ink | | the stroke round every word (or the subtitle box) | |
| | | the current word | on the stroke: |
| | | emphasis | on the stroke: |
| dim | | small print, the speaker; words to come (karaoke) | on every backdrop role: |

## Type roles

| Role | Face | Size | Use |
|---|---|---|---|
| caption | Montserrat 800 | <size> px | the captions |
| text | Montserrat 600 | 44 px | subtitles, the speaker's name on a card |
| mono | IBM Plex Mono 500 | 26 to 28 px | small print, the speaker label |

## Captions

From `render.mjs layout` (first frame, last frame exclusive, time on screen, characters a second):

| # | Caption | Frames | On screen (s) | Chars/s |
|---|---|---|---|---|
| 0 | | | | |

## The frame

- Backdrop: <gradient from, to; shapes; image and veil>.
- Brand: <text>, small print <text>.
- Speaker: <name>. Progress bar: <y, width>.
- Audiogram card: cover <size> px at <x, y>; name and show; <n> bars, <w> x <h>.

## Sound

- Track: the voice, gain <n> dB, loudness <-16> LUFS.
- Cues: <emphasis taps / none>.

## Review stills

Written by `render.mjs stills`: frame 0, each caption with its words up, the first pop (or the pill moving), each emphasised word, the last frame, plus `stills/contact.png`.