Caption News — Style Prompt

Social-video news that reads with the sound off. Real footage, photos and the source document are the ground; huge captions are the lead actor, slammed in a chunk at a time with one keyword on a yellow block. Hard cuts on a music grid, numbers that roll, a source tag that slides in whenever a figure appears, and the original document highlighted on screen before its number is believed. 16:9, built for a feed. References (grammar only): the captions-first social news of the mid-2010s (NowThis, AJ+), horizontal explainers that set big type over footage (Bloomberg Quicktake). Never copy their logos, fonts, colour ratios, idents or shots, and never name them in the film.

1. Essence, and what it is not

  1. Sound-off first. Every beat must be understood from the picture and the captions alone; the voice adds pace, not information.
  2. The caption is the shot. One Chinese line, set huge, slammed in two or three chunks, one keyword in a yellow block; one English line under it. The footage is chosen to sit under the line.
  3. Evidence on screen. Each number arrives with its source: a source tag slides in; key figures are first seen highlighted in the original document; per-shot footage credits sit in the corner like a news "Video:" tag.
  4. A hook on frame 4. The film's largest number lands in the first 0.15 s and rolls to its value.
  5. One turn. The bad-news hook is answered by a fact that changes its meaning; the rest of the film explains that turn, one new fact per shot.

Not Data Storytelling (charts are short inserts between footage, never the whole film, never a dashboard). Not a TV news package (no anchor, no lower-third ticker, no studio, no scrolling crawl). Not a keynote: no headers, no centred title-and-bullets, no page turns.

2. Frame and layout (1920×1080)

Zone Position Content
Footage full bleed video, photo, document or data card; never a vertical frame pillar-boxed in the middle
Caption card left aligned at x 120; Chinese baseline y ≈ 948, English baseline y ≈ 1014 one line per language, never wrapped
Channel bug top left, x 96 y 52, 46 px high yellow block with a fictional channel name + topic in Chinese and English small caps
Source tag under the bug, y 108, 36 px white "來源" + dark label (USDA NASS · 2026.08.03, … · 第 13 頁); only on data and document shots, slides in 0.2 s
Footage credit top right, 19 px on a 50 % dark chip 視頻 作者 · CC BY 3.0; every CC BY shot carries it
Lower third x 120, y 742, 96 px high yellow bar + label + one English line; for a place, date or speaker, never for the main sentence

Under the caption: a bottom gradient (0 → 84 % from y 560) plus a soft dark radial from the bottom-left corner; a top gradient (55 % → 0 over 200 px) under the bug and the credit. Data cards use a lighter gradient that starts at y 820. Graphics and charts sit right of centre and bleed to the frame edge; their title and source sit top left, never centred.

Vertical 9:16 is a different layout, not a crop: put the caption under a 1080×1560 footage band (horizontal sources then scale ≤ 1.5×), stack the chunks on two lines there (the one-line rule is for 16:9 subtitles), and move the bug and source tag into the top safe area.

3. Editing grammar

4. Caption card (the subtitle is the graphic)

5. Graphics

6. Grade and image quality

7. Sound palette

Layer What Level
Voice one brisk narrator (Kokoro, speed 1.1–1.17), numbers spelled out in the TTS text compressed, ≈ 8 dB over the music
Music 120 BPM pulse in sampled instruments: kit (kick on the beat, hats on off-beats), eighth-note electric bass, a sixteenth-note marimba ostinato, vibraphone off-beat chords, glockenspiel accents, staccato brass stabs on the big numbers, timpani and suspended cymbal for turns ducked ~45 % under the voice
Structure the hook hit on frame 4; a hard stop into silence before the turn (only natural sound and the question); the turn lands on a major-key brass hit; half-time and low strings for the threat; a snare build into the spike; a second short silence before the verdict; a major chord with bells on the verdict
Foley every graphic action has a sound: chunk slam (click + thump), counter rattle (a tick every 45 ms), whoosh into each card, highlighter squeak, camera shutter on the freeze, stamp thump on a big number, pops for labels, ticks as map states fill, a riser into the map push
Natural sound the subject's own location sound (here a swarm), J-cut 0.3 s before the freeze, bed under the ending not ducked below audibility

Master −14 LUFS, true peak ≤ −1 dBTP (core/render/mux.sh).

8. Native moves

  1. Frame-4 hook — kicker line, then a giant number in a yellow block rolling to its value in 0.45 s, then the unit and the subject word (hook()).
  2. Chunk slam with one yellow keyword (capCard()).
  3. Proportion by darkness — a yellow line sweeps across the footage to the percentage; what it passed goes grey and dark; the figure appears on the dark side (shotHalf()). Works for any "X % of …".
  4. The document says it — headline or sentence highlighted from PDF bbox coordinates, then the number popped as a yellow block beside the paper (paper(), shotDoc6(), shotQuote()).
  5. Freeze and question — the image stops on the viewer's question, music cut to silence (shotFreeze()).
  6. Ledger split — two counters racing side by side, the difference stamped after both settle (shotSplit()).
  7. Lit grid — three ways / three causes, each panel lighting on its word (shotGrid()).
  8. Punch and circle — 0.3 s punch-in on the culprit, a circle drawn round it, a leader to its name and its Latin name (shotSem()).
  9. Map to ground — the map pushes into a region, then a photo of that place grows out of the region's outline (shotMap()).

9. Material

  1. Ask the user first whether they have their own footage, photos, documents or data (and the rights to them). Their material comes first; the sources below are the fallback.
  2. Where to look (judge every file on its own page, not the search result):
  3. Wikimedia Commons (video and photos): read the licence on each file page. Fine: CC0, public domain, CC BY (credit author, title, licence on screen and in CREDITS). Not used: CC BY-SA, "no known restrictions", unclear licences, YouTube re-uploads, colourised or "restored" versions.
  4. U.S. federal agencies (USDA, USGS, NASA, NOAA, NARA): works of federal employees are public domain; check that the page does not credit a contractor or a third party. NASA: https://images.nasa.gov. NARA: https://catalog.archives.gov.
  5. Internet Archive: only items whose own page states public domain or a CC0/CC BY licence; U.S. works published before 1931 are public domain.
  6. Library of Congress: read each item's rights statement; "no known restrictions" is not enough.
  7. Official documents and data (reports, statistics, court filings) from the agency's own site: the source of every fact; keep FACTS.md (claim, URL, quoted wording, derived sums with their arithmetic).
  8. Map geometry: Natural Earth (public domain). Its default borders are not usable for China: DIRECTOR.md §13.
  9. Before downloading, tell the user what you will fetch, from where and under which licence, and keep within a size budget. The finder copied into this style, demo/tools/footage.py (search commons|archive|nasa, fetch, used, md), logs licence, author, page and the seconds used of each file into SOURCES.jsonl and writes SOURCES.md; demo/tools/commons-tools/peek.py previews a Commons video from thumbnails before downloading it, seg.py downloads only a segment of a long one, commons_thumb.py takes a standard-width thumbnail when the original is rate-limited. Wikimedia rate-limits bursts (HTTP 429): one request at a time with pauses.
  10. People on screen: no close-up or slow motion of an identifiable private person; public figures and people in the news event are fine. Never use generated images as footage.

10. Engine

Copy demo/ into the project and replace the content: - main.js — the page (window.render(t) draws synchronously with placeholders first, so TEXTS(t) is valid for readcheck.mjs, then loads the frames it needs and draws again). Shot functions per format; SHOTS table for cuts. - timeline.json — captions (zh with | chunks and {keyword}, en), voice start times, silences and hits; read by the page, tools/cues.py (.srt + timing check) and audio/mix.py. - tools/prep.sh — every video shot as a 30 fps JPEG sequence at its display size (crop, lanczos, unsharp, delogo); report pages; photos; the map projection (tools/map_prep.py). - audio/mix.py — sampled score from the timeline, foley from events.json, voice, natural sound, ducking. - tools/fonts.sh (OFL subsets for every character in main.js), tools/final_check.sh (loudness, black frames, speech-to-text of the final mix).

11. Pitfalls

12. Variation space

The agent decides per film: topic, the turn, which formats are spent where, footage, the channel's fictional name and colour (keep one accent colour), the title.


How our demo was made (story, shots, score, end card, build): DEMO.md. Read it after your treatment exists.