John Wilson

Firelight

A YouTube channel of sleep stories. A host named Nora welcomes you, then tells a calm story set in one place. The story runs about 30 minutes, then that place's sound fills a three-hour video.

I built the software that makes them. Three new episodes a week, Sunday, Tuesday and Thursday at 7:00pm PT.

what it does

You open a video and Nora welcomes you. Then she tells a calm third-person story in one place, in one kind of weather, with a few named people. There is no plot spike and no lesson.

The spoken story is about 30 minutes. That place's ambient sound fills the rest, so the video runs three hours. Every one on the channel runs 3:00:01.

Ten public episodes are up, from Hale Inn on 17 September 2026 to Pellan Orchard on 8 October 2026. Watch them on Firelight Sleep Stories (opens in a new tab).

how it's made

Each episode takes this path.

  1. researchClaude Opus 5.5 writes the brief
  2. writeClaude Opus 5.5, spoken text then stills
  3. gateI read the whole draft and edit it
  4. assetsKokoro speaks and Qwen-Image draws, on Modal GPUs
  5. reviewGrok checks every still, then I mark the frames reviewed
  6. shipa local render, a private draft, then I set the time

I read the whole draft and edit it before anything is rendered. A map I write by hand ties story phrases to ambient sound beds. Times come from spoken phrases, never from the clock.

Uploads go up as a private draft, with the synthetic-media disclosure set. I set the public time myself. Nothing publishes on its own.

The detail: Kokoro, a voice model, speaks the text. Qwen-Image draws the stills. Both run on Modal GPUs that shut down when idle. Thumbnails come from Grok Imagine. The render is local, 10-bit HEVC on a Mac.

getting the stills right

Each episode needs about 46 frames. A vision model checks every frame against its shot and regenerates the misses for up to three rounds. Every flag and the reason go into a ledger. I add a check when the same miss keeps showing up, so the miss rate drops over time.

Episode 010 flagged 23.9% of frames in the first round. It took five review passes. The last two stubborn stills went to Grok Imagine. I mark the stills reviewed before the episode can ship.

That episode's spoken story ends at 31:42, then night ambience fills the rest. The draft has about 3,115 words, 43 story stills and 3 intro stills. On 7 October 2026 it took about two and a half hours from a locked slate to a private upload. Research to first draft took about 21 minutes.

cutting the writer down

On 8 October 2026 I cut the writer down. The old run sent about 5,200 words of instructions, with 97 things not to do. It spent about 64,000 thinking tokens to write about 6,000 words, and the prose came back with repeating tics.

The new writer is one call for the prose and one call that picks the stills. The prompt is about 350 words, plus the notes for that place. Claude Opus 5.5 is the only writer now.

I deleted the outline, the polish pass, the critic and ten extra checks. That day the scripts lost about 4,100 lines, net, across 37 changes saved to the code (commits). I kept a way to roll the change back.

I preferred the lean rebuild of episode 010 by ear. The new drafts sit next to the old ones for the same episode, and I judge them by listening. Episode 011 will be the first full episode on it. No lean-writer episode has shipped yet.

On 7 October I also changed the voice. It is now a blend of two Kokoro voices, chosen by a blind A/B. The first ten episodes used one voice.

limits

The writer change has not shipped in a public episode yet. I judge the writing by ear. The stills review still needs me at the end: a vision model does the checking, and I mark the set reviewed.

Ten public episodes so far. I set every public time by hand.

more

Sessionwire
The product, year by year.
Call rebuild
How Call rebuild changed Sessionwire's calls in July 2026.
Triage
How Triage finds why something broke, and how I tested it.
Search
How Search finds people and music from a description.
Remote control
How Remote control lets you run someone else's computer in a Sessionwire call.