Sports Telestrator — Style Prompt

The TV football analysis segment: play the clip at full speed, rewind, freeze it, and draw on the broadcast picture — rings under players' feet, marker arrows for the ball, a red patch for the space nobody covered — then play on, switch angles, count the frames, and flatten the pitch into a board. Real match footage is the ground; every line is drawn on top of it and moves with it. A studio show's packaging (sting, corner bug, score bar, a yellow wipe) holds it together. 16:9. References (grammar only): touch-screen analysis segments in televised football (the "telestrator" pundit's board), and explainer channels that annotate real match footage. Never copy a broadcaster's or channel's logo, fonts, colours, idents or graphics, and never name them in the film.

1. Essence, and what it is not

  1. Watch it, then take it apart. Every piece of action is seen moving before it is explained. A freeze always follows play; the explanation never comes first.
  2. One freeze, one finding. Each freeze says one thing (the ball wasn't cleared; nobody stepped out; he struck it from outside the box) with one label and at most two groups of lines. The same few seconds of footage are reused, each pass going one layer deeper.
  3. Drawn on the real picture. Rings sit under feet, arrows follow the ball's real path, the box line is traced over the real line. Nothing floats in an abstract diagram until the film deliberately flattens the pitch.
  4. Data counted from the footage. Times come from frame counts (a stopwatch that runs on source frames), distances from the pitch markings (a perspective transform). What the footage can't measure (ball speed, sprint distance) is not stated.
  5. Studio energy. Bright marker lines, a white flash and a punch on every freeze, the music stopping with the picture.

Not Visual Investigation (that is restrained, synchronised multi-camera evidence where the timeline is the protagonist; this is a pundit's show with packaging and enthusiasm). Not a highlight reel (no montage of goals to music; each clip is analysed). Not Data Storytelling or an infographic: charts are not the film; the top-down board appears once, as a summary, and is reached by flattening the real picture.

2. Frame and layout (1920×1080)

3. Editing grammar

4. Colour identity (the one rule that matters)

Role Colour
The team/player we follow, the ball, main marker lines #FFD400 fluorescent yellow
Opponents (rings, block arrows, link lines) #3FD8FF cyan
Space (a patch nobody covers) #FF3B30 red, fill 0.34–0.38 + dashed edge
Pitch lines traced, neutral marks, stamps #F4F1E8 chalk
Show board #0C1411 ink green-black
Label / bug background rgba(8,12,14,0.9); opaque #080C0E where it covers a logo

One colour, one identity, throughout the film: a label's left bar takes the colour of what it names. Change the hues if the show needs to, never the three roles.

5. Type

6. Motion and drawing

7. Grade and image quality

8. Sound palette

9. Native moves (and how the code does them)

  1. Freeze and draw — a freeze segment = one source frame + flash + punch + desaturate + spotlight; overlays drawn by progress (overlayAnalysis(), overlayG1() in demo/index.html).
  2. Tracked ring — hand keyframes of the feet point in source pixels every ~3–6 frames, linearly interpolated (TRK, at()); check them with ?dbg=1, which paints every tracked point in magenta.
  3. Frame-counting stopwatch — starts at the receiving frame and counts source frames ÷ fps; stops and turns yellow on the strike (stopwatch()).
  4. Score-bar flip on the goal frame, one entry per goal (GOALS, scoreAt(), bugScore()).
  5. Packaging over watermarks — corner bug and score bar positioned from the logo and URL coordinates, drawn from frame 1 (bugTop(), bugScore()).
  6. Dual-angle freeze — two windows, each its own clip and frame range, both reaching their freeze frame on the same beat; overlays drawn in each window's source coordinates (splitView(), overlayG2()).
  7. Perspective flatten into a shot map — for each shot, mark 6–8 known pitch points in its own frame (box and six-yard corners, where the penalty arc meets the box line; FIFA dimensions) and fit a ground-plane homography by least squares (demo/tools/homography.py reads tools/pitch.json, writes assets/pitch.json; residuals ≤ 6 px are fine). The strike frame is then drawn as a mesh of triangles in pitch coordinates (1.5 m cells), each vertex moving from its image position to its board position, each triangle affine-mapped (drawTri()); the picture fades out as the chalk board takes over, and the other shots' feet points, converted with their own frames' matrices, drop onto the same board (shotMap()). The broadcaster's URL is painted out of the source frame first, because the flatten drags it into the middle of the screen.
  8. Data card — the counted numbers re-stated on a board page: label left, big yellow number right, red marker circle on the key one (notes()).
  9. Commentary transcript — original-language words with timecodes and a translation, in a small box during live play; inaudible words become an ellipsis, never a guess (transcript()).

10. Material

  1. Ask the user first whether they have their own footage (club or academy video, their own camera, a licensed broadcast clip), line-ups, event data or photos, and the rights to use them. Their material comes first.
  2. Where to look (judge every file on its own page):
  3. Wikimedia Commons (search "goal", the match, the player): many clips are cut from broadcasters' own YouTube uploads under CC BY. Fine: CC0, public domain, CC BY. Not used: CC BY-SA, "no known restrictions", unclear licences.
  4. A broadcaster's or club's own YouTube channel when its video page says Creative Commons Attribution license (reuse allowed): check that the channel is the rights holder's official, verified channel (not a re-upload or a fan mirror), save the evidence (channel id, verification, licence field, date checked), and download the native resolution, not an AI-upscaled stream. Third-party re-uploads, fan mirrors, colourised or "restored" versions are never used.
  5. Facts (scores, minutes, how a goal was scored): the league's or broadcaster's own match page or video description, then established newspapers; quote them in FACTS.md. When sources disagree, use the official list and leave the disputed detail out.
  6. Photos of players: Commons (CC BY / CC0); state the year when the photo isn't from the match.
  7. Before downloading, tell the user what you will fetch, from where and under which licence. 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 into SOURCES.jsonl and writes SOURCES.md; demo/tools/fetch_sources.sh shows how a verified YouTube CC BY source is fetched with uvx yt-dlp. Wikimedia rate-limits bursts (HTTP 429): one request at a time.
  8. People on screen: players, referees and staff in the event are fine; never slow down or freeze on an identifiable spectator.

11. Engine

Canvas 2D, one page: window.render(t) is async and deterministic, frames load on demand from JPEG sequences (one folder per clip, 90-frame cache). timeline.json (segments with clip and source frame range, voice lines) drives the page, tools/mix.py and tools/cues.py. window.TEXTS(t) reports the text that must be read, for readcheck.mjs. core/render/video.mjs renders at 30 fps.

12. Pitfalls

13. Variation space

The agent decides per film: the sport (football, basketball pick-and-roll with screens drawn as bars, tennis rallies with landing zones, F1 overtakes with racing lines — anything with a wide camera that shows the whole play), the moments, the show's fictional name and colours (keeping the three roles), how many freezes.


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