Spaces:
Sleeping
A newer version of the Gradio SDK is available: 6.19.0
Phantom Grid β Demo Video Script & Production Reference
Purpose: A complete, hand-off-ready reference for an editor/agent to assemble a ~90β120 second demo video for Phantom Grid (the local, browser-based London investigation game) and its new first-run tutorial.
This document is the single source of truth for the video. It lists every shot, what asset to use, exactly what voiceover/on-screen text goes with it, and β where a static screenshot is not enough β a clearly marked
[CAPTURE NEEDED]placeholder with precise instructions for recording the missing footage.
1. Format & delivery specs
| Field | Value |
|---|---|
| Target length | 90β120 s (trailer-paced) |
| Resolution | 1920Γ1080, 30 fps (screenshots were captured at 1680Γ945 @2x β crop/scale to fit) |
| Aspect | 16:9 |
| Output | docs/demo/phantom_grid_demo.mp4 (H.264, ~10β12 Mbps), plus a 1080Γ1080 square cut for social if time allows |
| Captions | Burn-in optional; also export an .srt from the voiceover script in Β§6 |
| Audio | One music bed + light UI SFX from the game; voiceover optional (script provided) |
Tone: noir detective / "Lantern Watch Bureau" period-dossier framing. Warm gold on deep teal-green (the game's own palette). Confident, brisk, a little mysterious.
Brand palette (for lower-thirds / titles):
- Gold text
#ffe39a, accent gold#d9ae50 - Crimson accent
#d4513e/#a73a29 - Deep background
#071f21, panel border#9a6926 - Display font: a serif close to Georgia / "Cinzel" for titles; UI text is system serif.
2. Assets already captured (ready to use)
All under ui/web/static/assets/tutorial/. Real frames
from the running game, 1680Γ945 @2x (β3360Γ1890 px):
| File | Shows | Best used for |
|---|---|---|
01_board_overview.png |
Full game board: Wanted poster, units, map, notepad, turn counter | Establishing shot / "the board" |
02_briefing.png |
Case briefing dossier (crime, suspect, last-seen trail) | "Every case starts with a briefing" |
03_map_layers.png |
Map on the Taxi transport layer | Transport layers / routes |
04_tactics_tray.png |
The 5 tactics with unit counts (Roadblock, Junction Lockdown, Patrol Unit, Search Team, Lookout Board) | Tactics explainer |
06_notice.png |
"Issue Public Notice" composer dialog | Public-notice mechanic |
07_witness_interview.png |
Witness interview panel (profile, statement, chat input, voice controls) | Witness interview |
08_witnesses_map.png |
Map in Witness Mode covered with witness pins | "Read the city" / leads |
Note:
05_placed_tactic.pngwas intentionally removed; the tactics story is told better with the tray (04) plus the[CAPTURE NEEDED]drag clip (Shot 6).
To re-capture or refresh any still: run the project app + AI backend, then
tools/shotenv/Scripts/python.exe tools/capture_tutorial_shots.py
(see tools/capture_tutorial_shots.py). Output lands
back in assets/tutorial/.
3. How to capture the MISSING footage ([CAPTURE NEEDED])
The demo needs motion that stills can't convey. Two ways to record:
Option A β Playwright video (deterministic, no narrator cursor):
Playwright can record a context to webm. Reuse the working selectors/flows in
tools/capture_tutorial_shots.py. Minimal recorder:
# tools/record_clips.py (to be written by the video agent)
from playwright.sync_api import sync_playwright
with sync_playwright() as pw:
b = pw.chromium.launch(headless=False) # headed = smoother cursor
ctx = b.new_context(viewport={"width":1680,"height":945},
record_video_dir="docs/demo/clips",
record_video_size={"width":1680,"height":945})
page = ctx.new_page()
page.goto("http://127.0.0.1:7860")
# ...drive the exact interaction for the shot (see per-shot notes below)...
ctx.close(); b.close() # video is flushed on context close
Prerequisites (same as the screenshot tool): the app is running at
http://127.0.0.1:7860 and the AI backend reports healthy
(GET /api/omni/status β "ready": true). Starting a case and advancing turns
requires the local model to be up.
Option B β OBS / native screen capture: record a real play session at 1080p, 30 fps, hiding the OS cursor trail. Use this for anything with audio (the witness voice reply).
Selector cheat-sheet (verified working):
- Start a case from the ready overlay:
#setupStartButton(force-click; it pulses) - Dismiss briefing:
#beginInvestigationButton - Layer tabs: buttons in
#layerTabs(text "Normal/Taxi/Bus/Subway") - Tactics in tray:
#tacticTray > *; drag onto#mapCanvas - Lookout board placement opens
#noticeDialog; publish with#raiseLookoutButton - Witness Mode toggle:
#witnessModeButton; pins in#witnessLayer [data-witness-id] - Advance a turn:
#advanceButton - Tutorial: auto-opens first run; replay via
#helpButton; nav#tutorialNext/#tutorialBack
4. Shot list (the actual edit, in order)
Legend: π’ = asset ready Β· π΄ = [CAPTURE NEEDED]
| # | Len | Visual | On-screen text | Source |
|---|---|---|---|---|
| 1 | 0:00β0:06 | Title card: logo "PHANTOM GRID" over a slow push-in on the board, vignette | PHANTOM GRID / "A London manhunt, played on your desk." | π΄ [CAPTURE NEEDED: title animation] built over 01_board_overview.png (Ken Burns zoom 100%β108%) |
| 2 | 0:06β0:14 | The case briefing dossier reveals (cards slide/stamp in) | "Every case opens with a dossier." | π’ 02_briefing.png (animate the three cards in; or π΄ record the real reveal β see Shot notes) |
| 3 | 0:14β0:22 | Full board establishing; subtle callouts pop on Wanted / Map / Turn counter | "You're the Commissioner. Catch the thief before time runs out." | π’ 01_board_overview.png + motion-graphic callout arrows |
| 4 | 0:22β0:32 | Map layers switching NormalβTaxiβBusβSubway | "The suspect can only move along the transport grid." | π΄ [CAPTURE NEEDED: layer-switch clip] (fallback still: 03_map_layers.png) |
| 5 | 0:32β0:40 | Witness Mode: city fills with witness pins | "Sightings light up across the city β some true, some false." | π’ 08_witnesses_map.png (push-in) or π΄ record the toggle |
| 6 | 0:40β0:50 | Dragging a tactic chip from the tray onto a junction; pin lands | "Deploy your units: roadblocks, patrols, search teams." | π΄ [CAPTURE NEEDED: tactic drag clip] + cutaway to π’ 04_tactics_tray.png |
| 7 | 0:50β0:58 | Issue Public Notice dialog; type wording; Publish | "Issue a public appeal to draw out fresh leads." | π’ 06_notice.png or π΄ record the type+publish |
| 8 | 0:58β1:12 | Witness interview: type a question, AI witness replies (ideally with voice audio) | "Interview witnesses β ask what they saw, where it went, when." | π΄ [CAPTURE NEEDED: live interview clip w/ audio] (fallback still: 07_witness_interview.png) |
| 9 | 1:12β1:20 | Advance Turn β suspect moves; tension beat; a Search Team triggers the catch | "Close the net. One move too slow and they vanish." | π΄ [CAPTURE NEEDED: advance-turn + win/lose moment] |
| 10 | 1:20β1:30 | The first-run tutorial flips through 2β3 slides | "New here? A built-in tutorial walks you through it." | π΄ [CAPTURE NEEDED: tutorial slide flips] (stills available as fallback: the 7 tutorial slides render the assets in Β§2) |
| 11 | 1:30β1:40 | End card: logo + setup line + URL | "Runs locally. Your case, your machine." / 127.0.0.1:7860 |
π΄ [CAPTURE NEEDED: end card] |
Trim to 90 s by dropping Shots 7 and 10 and tightening 8β9. Extend to 2 min by letting the interview (Shot 8) breathe with real audio.
5. Per-shot capture notes for [CAPTURE NEEDED] items
- Shot 1 / 3 (title + callouts): pure motion-graphics over the ready still
01_board_overview.png. No new game capture required. - Shot 2 (briefing reveal, optional live): start a case via
#setupStartButton; the briefing#caseIntroDialoganimates open. Record ~3 s, then it can be sped up. - Shot 4 (layer switch): after
#beginInvestigationButton, click the#layerTabsbuttons in order with ~1 s between. Record the map area (.map-shell). - Shot 6 (tactic drag): mouse-down on a
#tacticTraychip, move over#mapCanvasto a junction, mouse-up. Headed mode (Option A) shows the cursor; or use OBS. Capture the "pin lands + event ticker confirms" beat (~3β4 s). - Shot 8 (interview, highest value): open a witness (
#witnessLayer [data-witness-id]β interview dialog), type a question in#witnessMessage, hit Send, wait for the AI reply to render in#witnessTranscript. If demonstrating voice, enable voice output in Settings and use OBS (Option B) so the audio reply is recorded. Note: surfacing an interviewable witness depends on crowd density β if pins show "crowd too dense", advance a turn or two, or (dev-only) raisePHANTOM_GRID_INDIVIDUAL_WITNESS_THRESHOLDto make all reports interviewable for the recording, then revert. - Shot 9 (advance + outcome): press
#advanceButtonto show the turn tick and suspect movement. For the win moment, place asearch_teamon the suspect's likely junction and advance; the case ends and the story reveal becomes available. Capture the result banner /#storyDialogopening as the payoff. (A loss/"vanished" beat also works for tension β director's choice.) - Shot 10 (tutorial flips): fresh browser (clears
localStorageso it auto-opens), or click#helpButton. Record clicking#tutorialNextthrough 2β3 slides; the dots and "1/7 β¦ Start Playing" progression read well on camera. - Shot 11 (end card): motion-graphics card; reuse logo + palette from Β§1.
6. Voiceover script (timed to Β§4)
Keep delivery measured; ~135 wpm. Lines map 1:1 to the shot numbers.
- "London. A thief is loose on the grid β and you're the one they sent to catch him."
- "Every case begins with a dossier: the crime, the suspect, the last place they were seen."
- "You're the Commissioner. Read the trail, and move before the clock runs out."
- "Your quarry can only travel the transport grid β taxi, bus, and underground lines."
- "Across the city, sightings surface. Some are real. Some are decoys."
- "Deploy your units β roadblocks, patrols, and search teams β onto the junctions that matter."
- "Post a public notice, and the right words will draw out fresh witnesses."
- "Then question them. What did they see? Which way did it go? Every answer narrows the net."
- "Advance the turn⦠and hope you've closed the gap. One move too slow, and he's gone."
- "New to the Bureau? A built-in tutorial walks you through your first case."
- "Phantom Grid. It runs entirely on your machine. Open the file. Start the hunt."
7. Music & SFX
- Music: one cinematic-noir/spy bed, ~110β120 bpm, builds at Shot 8β9. License-clear.
- SFX (from the game where possible): the app emits cues such as
lookout_raise,witness_popup,blockade_set,map_select,turn_advanceβ pull matching beats for pin-drops, notice-publish, tactic-place, and turn-tick. A soft "stamp" on the briefing card and a low "snare/impact" on the catch (Shot 9).
8. Pre-flight checklist for the video agent
- App running at
http://127.0.0.1:7860;GET /api/omni/statusβready: true. - Confirm the 7 stills in Β§2 exist; re-run
tools/capture_tutorial_shots.pyif stale. - Record the 6
[CAPTURE NEEDED]clips (Shots 1/3 are graphics-only) βdocs/demo/clips/. - Build the edit per Β§4; lay voiceover (Β§6) and music/SFX (Β§7).
- Export
docs/demo/phantom_grid_demo.mp4(1080p) +.srt. - If a dev-only setting was changed for Shot 8, revert it (check
.env).