The spec for the “Under the Hood” video series was approved with a single decision left open. Every episode is built, not edited: Playwright captures the screens, Remotion composes the frames, and a narration track reads a script written once and reused for captions and a companion article. The only thing undecided was the voice. A bake-off was scheduled between a clone of my own voice and a premium API voice, to be picked by ear.

Later the same day I deleted the bake-off, the API option, the clone, and the entire idea of a generated voice. Not deferred. Removed.

Why the voice was different

Most of this site is built with AI in the loop, openly. The articles go through an agent workflow, the visualiser is AI-assisted, the album was produced with Suno. I am not squeamish about the tools. But a narrating voice is not a tool output in the same way a rendered frame is. It represents a person, and on this project that person is me.

So the rule that fell out was simple. The narrating voice of Captain Random content is mine, or it is nothing. A synthetic stand-in is not acceptable even as a temporary placeholder while I get around to recording, because a plausible fake of my voice saying my words is exactly the thing I would not want shipped under my name. Text on screen is the honest placeholder. It says what the narration says without pretending to be a person who has not spoken yet.

What replaced it

Episodes now ship text-first. On-screen narration text drives the composition, timed by a deterministic reading-speed model rather than an audio track. When I record my own voice later, it swaps in through a defined path: record against the finished video, re-derive the timing from the recording, normalise, re-render. That path is not an upgrade from the text version. It is the voice, arriving when it is real.

Cutting the AI feature made the system better

The part I did not expect is that removing generated narration simplified everything downstream. A reading-speed clock is deterministic in a way audio alignment is not, so the timing is reproducible from the script alone. There are no TTS engines to run, no API keys to hold, no per-episode inference cost. The script is still written to be spoken, so the eventual recording session is a read-through rather than a rewrite. Fewer moving parts, a stricter clock, zero cost, and the single-source script survives intact.

There is even a clause that got easier. The original spec called generated-narration disclosure non-negotiable, on the correct instinct that if a machine speaks in a video you have to say so. With no generated voice, there is nothing to disclose. The honest version needed no disclaimer, because it was not imitating anything.

The honest version of the origin

I will not tidy up how the decision arrived. It started from a terminology tangle: I had been reading “TTS” as text on screen rather than text to speech, and untangling that is what surfaced the choice. The mix-up landed on the design I should have picked deliberately. That happens, and the fix is to keep the better design and be honest about the route to it, not to backfill a cleaner story.

The line

The point is not that AI stays out of the pipeline. It is threaded through nearly every part of this site. The line is narrower than that. Some outputs stand in for you personally, and a voice is one of them. For those, the honest placeholder is absence, shown plainly as text, rather than a convincing substitute wearing your name. Everything else, the tools can build.

All writing