A documentary YouTube series on Illinois Valley history. John's voice. Real historical footage + AI-generated assets. Six episodes. Each one bleeds into the next.
Visual through-line: same river, same rock, different people. Every civilization built on the bones of the last one. This is John's actual home — that's the emotional engine.
Not trivia — genuine reframes. Grand Village held 20,000 people and most people drive past it every day. Ottawa hosted the first Lincoln-Douglas debate. The canal that took 12 years to build was obsolete within a decade. These aren't interesting facts — they're the reason someone keeps watching.
| # | Title | Core Story | Bleeds Into |
|---|---|---|---|
| 1 | The Natives ✅ | Grand Village — 20K people, Hopewell, Illiniwek rise and collapse | "The land was open" |
| 2 | The Settlers 🔄 | Irish dig the canal, Ottawa founded, Lincoln debates in the square | "They handed it to industry" |
| 3 | The Industry | Civil War backdrop, Matthiessen builds a town, Depression breaks it | "The decline begins" |
| 4 | The Depression | The valley goes quiet — what that actually looked like here | "Then the world went to war again" |
| 5 | The War & The Decline | WWII raises it one last time, manufacturing leaves, clock factory closes | "What's left?" |
| 6 | The Valley Now | Full arc recap. Same river. Same rock. What comes next? | — |
Runtime: 5:23 | Chapters: 6 + closing | VO: John's voice, noise-cleaned | YouTube: Published ↗
Structure pattern: Each chapter = one narrative punch. One central "huh" moment. Piano at 0.07 — never competes, never ramps. Every chapter is standalone, then concatted.
| Tool | Version / Detail |
|---|---|
| Machine | Mac mini · Darwin arm64 · Ottawa IL |
| Python | 3.14 (python3) |
| ffmpeg | Homebrew — no freetype/libass → NO drawtext filter |
| Title cards | Pillow-generated PNGs only. Font: Georgia.ttf |
| Whisper | Base model — local, free. Ground truth for all VO timing. |
| Working dir | forgotten-valley/episode-1/ or settlers/ |
| Tmp | /tmp/chN_build/ — always recreate clean |
Resolution: 1920×1080 Frame rate: 24fps constant Video codec: libx264, preset=fast, crf=18 Pixel format: yuv420p Audio: aac 192k 48kHz Flags: -movflags +faststart
zoom_end = 1.04 MAX. Never higher. Performance killer above this.
def kb(src, out, seconds, zoom_start=1.0, zoom_end=1.04):
frames = int(seconds * 24)
zr = zoom_end - zoom_start
vf = (f"scale=2400:1350:force_original_aspect_ratio=increase,"
f"crop=2400:1350,"
f"zoompan=z='min({zoom_start}+({zr:.4f}/{frames})*on,{zoom_end:.4f})'"
f":x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d={frames}:s=1920x1080:fps=24,"
f"format=yuv420p")
def clip_vid(src, out, ss, t):
subprocess.run(['ffmpeg','-ss',str(ss),'-i',str(src),'-t',str(t),
'-vf','scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080,format=yuv420p',
'-r','24','-c:v','libx264','-preset','fast','-crf','18','-an','-y',str(out)],
capture_output=True, check=True, timeout=60)
VO: aac 192k 48kHz, volume=1.0 Piano: 0.07 pre-processed — DO NOT apply additional volume filter Mix: amix=inputs=2:duration=longest:normalize=0
zoom_end above 1.04 on stills
zoompan on video clips
use dee-bennett-marker.jpg — corrupt file
drawtext filter — ffmpeg has no freetype
timeout=300 for stills, timeout=60 for clips
ONE build process at a time — kill python3 first
Stop and report. Never substitute an asset.
Handle with -loop 1 -r 24 -i in ffmpeg
50/50 Rule: Half real archival material (LOC, ISHL, Wikimedia), half AI-generated for local gaps where archive material doesn't exist.
Public domain pre-1928 photos at loc.gov/photos. HABS architectural documentation for canal locks and infrastructure. Brady studio portraits for Lincoln, Douglas, Marquette.
Never name the subject in a prompt. "Sandstone canyon walls, river below, golden hour" — NOT "Starved Rock." "19th century settlement near limestone bluffs" — NOT "Ottawa, Illinois."
Model selection: Nano Banana Pro for photorealistic. Soul Cinema for painterly/cinematic. Kling 3.0 for video morphs (keyframe to keyframe, 5 seconds, locked start/end frames).
img2img workflow for historical maps + Ottawa aerial. Use Google Earth export as the base image — strips modernity more cleanly than a pure text prompt.
Whisper is ground truth. After John records VO, run Whisper base model → transcript with timestamps → that's the shot list foundation. Not the script file. Not an approximation.
Recording rule: Smart Recorder (Splendio) → clean WAV. NOT the default Android recorder (3GPP/AMR = unusable). Record as ONE continuous take when possible. Dramatic pause needed: two takes joined with silence in ffmpeg.
AUDIO/chapters/chN-vo-final.mp3 Piano overlaid during assembly VO offset = 5s for Ch1 (title card), 0s for all subsequent chapters Each chapter is built standalone → concatted in final assembly
The brief is the product, not the build. If the brief is wrong, the build is wrong. A locked brief contains:
| # | Requirement |
|---|---|
| 1 | Asset registry with exact file paths — no guessing, no relative paths |
| 2 | Shot list with absolute timestamps — not approximate, exact seconds from Whisper |
| 3 | Each segment mapped to a specific VO line or word — not "around here" |
| 4 | Duration per segment derived directly from Whisper output |
| 5 | Fallback instruction for any asset that might be missing |
Sub-agent gets the locked brief. I write the brief. Sub-agent builds. No improvisation on assets or durations without checking.
| Item | Status | Detail |
|---|---|---|
| Script v5 | LOCKED | 2026-03-15. ~520 words, 4–4.5 min narration, 5–6 min total. |
| Cold Open | LOCKED | cold-open-locked.mp4 — 47 seconds. Locked 2026-03-31. |
| Ch1 VO | FILED | audio/ch1-john-v1.wav — 36.1 seconds. John's voice. Approved. |
| Remotion Canal Map v3 | LOCKED | Indiana Jones red dotted line on 1855 LOC railway map. Approved. |
| Remotion Debate Scene | LOCKED | Lincoln portrait, word-by-word captions, stat counters. Built. |
| Remotion Railroad vs Canal | LOCKED | Blue canal drawn, red railroad cuts across. Built. |
| Ottawa 1830 Oil Painting | LOCKED | Nano Banana Pro img2img from Google Earth. Approved. |
| Kling Ottawa Morph | LOCKED 🔥 | 5s wilderness → modern city. Approved. |
Ottawa streetscape 1840s-1860s · Frontier wagon train · 1830 Ottawa platted aerial · Irish canal workers camp · Industrial era (Ep3 bleed)
Washington Square Ottawa today · I&M Canal trail (local) · 1830 Ottawa plat map (LaSalle County records) · I&M Canal full route map (LOC pull)
Ep1 proved this. Each chapter is its own build. Once locked, it's locked. Don't touch it.
| # | Step | Owner |
|---|---|---|
| 1 | Whisper the VO → exact timestamps | Archie |
| 2 | Map VO beats to shot list from script | Archie |
| 3 | Confirm every asset on disk — source or generate what's missing | Archie |
| 4 | Write the locked BUILD-BRIEF — complete, no gaps | Archie |
| 5 | Spawn sub-agent to build | Archie |
| 6 | Watch. Give notes. | John |
| 7 | Surgical fixes only — not rebuilds | Archie |
| 8 | Lock it. Move to next chapter. | John |