Tony Morinello

All work

Practical AI · Communication

TheOff-Ramp

An alternate-history series, from research to published video, on a pipeline I built.

Role
Sole designer and developer; runs the social accounts
Built with
Python, Remotion, React, TypeScript, Astro, AI APIs

Visit the site

Walkthrough: The Off-Ramp, silent, 4 steps
From the Lincoln episode: Ford's Theatre, then a card reading The guard stays at his post, April 14, 1865, captioned Here's the off-ramp.

The Off-Ramp is an alternate-history series. Each episode starts from one real moment, changes one thing, and follows the new timeline through a narrated video, short clips, an article and social posts. I built the production pipeline, the video templates and the website, and I run the YouTube, TikTok and X accounts.

The problem

One episode turns into a YouTube video, a vertical cut, three shorts, carousel decks, a thumbnail and covers, an article, an X thread and a newsletter draft. All of them have to tell the same story. Narration and generated video are paid per call, so a rerun shouldn’t pay again for work that already exists. The timeline itself has to stay inside what the historical record shows was possible.

What I built

Each episode is a folder with one manifest, episode.json, that every stage reads and writes. Its status moves through twelve states, only forward, and every paid call is logged to the episode’s costs.

The text stages run as slash commands and subagents in Claude Code. A premise is scored, then researched into a verified fact sheet, drawing on a shared base of facts for each era. A council of eight AI personas (among them a realist, an economist and a contrarian) argues it over three rounds, and a moderator writes the timeline from what held up. Drafting produces the video script, the article, an X thread, a newsletter, metadata, a shot list and three carousel decks. A separate reviewer, which didn’t write any of them, checks the drafts against the drafting rules.

The media stages are a Python command-line tool. It narrates each scene through ElevenLabs and uses the character timings to set captions and scene lengths. Footage comes from public-domain archives, including the Internet Archive, Wikimedia Commons and the Library of Congress; AI scenes go through fal.ai, with a still as the fallback. Remotion renders a watermarked preview, then the finals, the thumbnail and the vertical covers. The website is an Astro site, and its posts are generated from each episode’s drafts. I post every release by hand.

Key decisions

Three gates that only I can pass

The pipeline stops three times for me. First I approve, edit or send back the timeline. Then I pick the title and hook and sign off the episode’s two AI-generated hero shots. Last, I watch the preview before the finals render. No code advances a gate. The judgment calls stay with a person, and an episode waits at each gate until I get to it.

A council instead of one draft

Eight personas with different points of view argue each premise over three rounds and test every turn against the record. A moderator then writes the timeline from what survived. The aim is a timeline that held up when opposed views tried to break it. It takes more model work than a single draft would, and the moderator’s synthesis is the one step I run on the strongest model available.

Stop before spending

Every stage checks the status and the existing outputs first, so a rerun skips finished work, and a rewritten line re-narrates only its own scene. If the vertical cut runs more than 15 percent over its target length, production stops before spending on assets and lists the longest scenes, while the fix is still a text edit. The cost is a manual loop, in which I trim the script and run it again.

A closer look

In the Lincoln episode, Ford’s Theatre gives way to a card that reads “The guard stays at his post,” dated April 14, 1865. That one change starts the new timeline.

The same pipeline cuts a vertical version of the episode and renders its YouTube thumbnail, “What if Lincoln lived?”

On the left is the watermarked preview I watch at the third gate. On the right is the final render of the same moment.

Each episode also gets an article on the website. This one is open at its section on the divergence point.

How I checked it

The pipeline has a Python test suite of 28 files, and several of its tests exist because a real release went wrong. Reused hero clips once held their last frame for up to fifteen seconds in nine releases, because a still from the middle of each scene looked fine. Now every render runs ffmpeg’s freeze detection, and a footage scene that holds one frame for a second or more fails the check. In another case a missing publish number stopped a release after every final had rendered, and recovering cost three full render passes. That check now runs before rendering starts.

A lint command checks each episode for missing pieces, such as hero shots and segments. The script that writes blog posts rejects drafts containing em dashes, en dashes or the current year. A post goes up only after I review the generated page and push it.