Visual Investigation — our demo
One example among many. Don't reuse its story, arc, shots, props or timings.
Demo: The Hindenburg: Four Minutes, 32 Seconds (興登堡號:四分鐘與三十二秒, 60.0 s) · visual-investigation.mp4 · source in demo/
An unofficial film. Every picture, page, map and sound in it comes from real archives and public institutions (the U.S. National Archives' Universal Newsreels, the U.S. Navy and the Naval History and Heritage Command, the FBI file, the U.S. Department of Commerce accident report, the U.S. Geological Survey); none of them made or endorsed it. All facts and their sources are in demo/FACTS.md; every inference is marked on screen.
Story & structure
On 6 May 1937 the airship Hindenburg burned at the Naval Air Station, Lakehurst. The film rebuilds the last hours on one clock from five kinds of evidence. It opens on the decisive frozen frame and rewinds; then the clock narrows through three scales (minutes, seconds, days), each carried by a readout inside the picture:
- Cold open (0–2.4 s). A newsreel frame of the burst slams in with a white flash and a red circle,
18:25:00 EST; testimony, photo and report slam into a 2×2 grid; a red sync line sweeps; the fire shot rewinds under scan lines. - Title package (2.4–6.3 s). The newsreel's flight over New York, the title, a lower third (New Jersey · Lakehurst).
- The wait — minutes (6.3–12.3 s). Four radiograms land at their times (16:42 delay, 16:52 we will wait, 17:22 land now, 18:08 earliest possible), each tied by a red leader to a pin on the wind chart below; the chart carries the thunderstorm and showers as one-word bands and a red playhead with its clock running from 15:40 to 18:14.
- Position (12.3–18.6 s). A 1947 USGS map pushes in to the air station, then cuts to a plan around the mooring mast: ropes down at 18:21 on a 30° bearing, "≥ 700 ft"; the photographer's inferred view cone. A Navy photo of the ship on its mast (an earlier landing) and the approach footage, mast circled.
- Four minutes (18.6–23.8 s). "4 分鐘", 18:21 → 18:25. A ground witness saw the outer cover flutter near cell 5; a 16-cell side view draws itself and ripples there.
- Origin — seconds (23.8–31.8 s). Five sources in one board: the FBI testimony line highlighted, the frozen frame with a ×2 loupe, the Navy photo (stern circled), the newsreel's own 1937 commentary ("a burst of flame near the big tail fins") as a waveform, the report's sentence; red links converge on cells 4–5; five ✓ badges.
- 32 seconds (31.8–38.6 s). A three-column sync grid (report / photos / newsreel) under one big stopwatch. The report column is there from T+0; the Navy photo cuts in at ≈T+2; the newsreel, aligned on the impact, only starts ≈7 s after the first flame, so its column lights up then; NH 57973 replaces the photo at ≈T+26; freeze on impact, "32 秒".
- The inquiry — days (38.6–45.6 s). An FBI teletype (8 May) announces the Commerce inquiry; two columns: established (origin, 32 s, leaking hydrogen ignited) and unresolved (how it leaked, the spark — "most probable" brush discharge, sabotage — no evidence).
- People (45.6–52.4 s). The 1937 newsreel says "almost half its 99 passengers and crew"; a fact-check card corrects it from the report (97 aboard, 35 died, plus one ground crew); 97 + 1 dots, 36 turn to red rings.
- Evidence map (52.4–55.6 s). Plan, broken-axis mini timeline, side view and five thumbnails, every link converging on cells 4–5. The poster.
- End card (55.6–60.0 s).
Why it fits the style: every section is a moment where independent sources meet; one event clock runs through the film and changes scale at the cuts; the only discovery the archive can't make by itself (the newsreel started ≈7 s late) shows because the sources are laid on one clock; what the inquiry could not settle is shown as plainly as what it did.
Shots
| # | Time (s) | Layout | Sources | Native move |
|---|---|---|---|---|
| 1 | 0.0–2.4 | big freeze → 2×2 grid → rewind | newsreel 01:20, FBI p.39, Pasquarella, report | freeze & circle, sync line, rewind cold open |
| 2 | 2.4–6.3 | footage left, title + lower third right | newsreel 00:38 (New York) | title package |
| 3 | 6.3–12.3 | four radiogram cards over a wind chart with playhead | report (radiograms, weather) | telegrams on the clock, data chart with a playhead |
| 4 | 12.3–14.8 | map push-in | USGS 1947 | map → plan (1) |
| 5 | 14.8–18.6 | plan left; mast photo and approach footage right | NARA 518856, newsreel 01:03 | map → plan (2), inferred view cone |
| 6 | 18.6–23.8 | statement + quote + wide side view | report (Ward) | big readout, cover flutter |
| 7 | 23.8–31.8 | five-source board + side view | FBI p.39, newsreel 01:20, Pasquarella, newsreel sound, report | freeze/magnify, evidence → model links, ✓ badges |
| 8 | 31.8–38.6 | three-column sync grid + stopwatch | report, Pasquarella, NH 57973, newsreel 01:18–01:43 | hard sync point, columns light up as sources begin |
| 9 | 38.6–45.6 | teletype strip + known / unresolved | FBI p.13, report | two columns |
| 10 | 45.6–52.4 | claim card + fact check + dots | newsreel sound, report | then vs. record, dots for people |
| 11 | 52.4–55.6 | evidence map | all | evidence map |
| 12 | 55.6–60.0 | end card | — | — |
Cuts sit on a 0.5 s grid except where they follow the voice. Layouts fill y 60–900; subtitles sit below at y ≈ 984 / 1022; the evidence map, which has no subtitle, is centred.
Sound & score
Score from VSCO 2 CE / VCSL samples (CC0), D minor. A timpani and gran-cassa hit on the opening freeze; a low D drone from the title; a pizzicato ostinato in eighths (Dm → Dm7 → B♭ → Gm → A) through the wait and the position; a pendulum tick every 0.5 s; in the four minutes the ostinato stops, the tick gets louder and a tremolo minor second (E5/F5) builds over a heartbeat-like bass pulse, cut to silence 0.2 s before the origin hit. During the newsreel commentary only the drone stays. Five rising glockenspiel notes for the ✓ badges. The 32-second run has one tick per event second (32 ticks in 4.3 s, the first 7 faster) and a rising string swell; one deep thump on impact, then near silence. The inquiry is four slow string-and-harp chords (Dm – B♭ – Gm – A) under teletype chatter. People: one cello note. The evidence map resolves on D minor add9 with a vibraphone arpeggio; the end card ends on harp. Foley is procedural: paper, shutter, Morse, keys, rewind, pencil, thump. Voice: Kokoro am_michael, eight lines; newsreel commentary twice (3.5 s and 4.3 s). −14 LUFS, true peak about −2.4 dB (4× oversampled peak limiter in mix.py).
Palette & props
Exactly the style palette: #0B0C0E ground, #141619 panels, greyscale sources, one red #FF4A2E, paper cards #E4E0D4 for the typeset radiograms. Drawn props: the plan (mast, 700 ft ring, 30° bearing, view cone, map inset, 500 ft scale bar), the 16-cell side view (cells numbered from the stern), the wind chart, the dot matrix, the mini timeline with a broken axis.
End card
Left-aligned on the ground, held 4.4 s: "興登堡號:四分鐘與三十二秒", "THE HINDENBURG: FOUR MINUTES, 32 SECONDS", a thin rule, "視覺調查 · Visual Investigation", "LemoLab × Claude Opus 5.5", then the source lines (newsreel and sound; photos; documents; map; "unofficial film; photo times, camera positions and the film alignment are our inferences"). Four evidence thumbnails on the right. The "LemoLab × Claude Opus 5.5" sign-off belongs to this library's demo only; a user's film carries no LemoLab credit and no copy of this card.
Build notes
demo/
index.html the page: render(t), TEXTS(t) for readcheck, SUBCHECK() for subtitles; all drawing helpers
film.json sections, voice starts, original-sound clips, bilingual subtitles (page, mix and .srt read it)
audio/lines.json narration (Kokoro) audio/mix.py score, foley, original sound, voice, ducking, limiter
tools/footage.py search / fetch / licence log (writes SOURCES.jsonl, SOURCES.md)
tools/prep.sh raw/ → assets/ (newsreel frames, freezes, sound clips, FBI pages, photos, USGS crop)
tools/wave.py waveform peaks of the sound clips tools/fonts.py OFL subsets from Google Fonts
tools/cues.py film.json → audio/cues.json → .srt tools/subcheck.mjs one line per language
tools/final_asr.py speech check on the finished film, line by line
FACTS.md · SOURCES.md · SOURCES.jsonl · CREDITS · stills/styleframe.jpg
sh demo/build.sh (library set up with setup.sh deps voice music, plus ffmpeg and poppler's pdftoppm): downloads the six sources into raw/ (~92 MB), prepares frames, fetches fonts, makes and checks the voice, mixes, runs the reading check, renders 1,800 frames (5 workers), writes and checks the subtitles, masters to −14 LUFS without grain (grain is already on the sources), makes the poster (55.3 s) and the styleframe (30.9 s), and runs the speech check on the finished film.
Pitfalls tied to this demo: only one licensable moving-image source exists, so the "multi-camera" sync is film + photos + documents + sound; Hearst, Pathé and agency material is left out. Freeze at src 01:20, not 01:24: the 01:24 frame shows only smoke, the 01:20 frame has the burst over the hull edge. Keep the panels clean: no timeline band under every shot (four tracks, pins, a chapter readout: it reads as odd, and it goes empty after 45 s), no type · source · detail tag on every panel and no English twins under most labels (the small text is noise), no hatched "NO FOOTAGE" panel for the newsreel's first 7 s (an empty panel looks like an error). Spread every layout to the full height, put the subtitles at the bottom, give each source one short tag, and let the late newsreel just light up when it starts. The plan's mast is not on the 1947 map, so keep the plan separate and use the map only as a locator. A whole-film Whisper pass drifts its timestamps after the newsreel sound and loses "people died": the final speech check cuts each line out of the film. The newsreel commentary is old and noisy; it is subtitled in both languages and never carries a fact on its own.