Skip to content
SIGNAL BROKER FOUNDER ALPHA

The founder’s recording-to-clip workflow: how a session becomes a checked vertical clip.

How the vertical clips on the Signal Broker channel are made: a published session recording, its automatic captions for timing, frames for the Broker’s exact words, one JSON spec per clip and a short script that stacks hook, overlay close-up, full frame and captions. Commands and a real spec included.

Start from a published recording

Every clip on the channel is cut from a session recording that is already public: the developer playing, the Broker’s overlay on screen, uploaded in full. Nothing is staged for a clip. The working copy is the upload itself. For Dead Cells, DiRT 3 and eFootball it is the 1080p version, 1920 × 804, because the recordings are wide, 2.39:1 (see ultrawide gameplay in a standard horizontal video); for the other four sessions it is the 720p version, 1280 × 536.

Working from the published file has two advantages: a clip can only contain what viewers of the full session already saw, and the full session can be linked from the clip as its related video.

Captions give the timing

YouTube generates automatic captions for each upload from its audio. They are saved next to the recording as a WebVTT file and flattened into a plain list, one caption line per row with its start time. This is the end of the DiRT 3 session:

[11:05] Uh-huh, well, not the podium but the
[11:07] finish is locked in.
[11:09] Eight out of eight when the dust has
[11:11] settled.

The captions are trusted for one thing: when he speaks. They come from the audio, so a caption placed on their times sits on his voice. They are not trusted for the words. Automatic captions mishear names and slang, and they transcribe everything audible, the game included. Lines marked >> are a detected change of speaker: in these recordings that is often a co-driver, a stadium announcer or a character in a cutscene, and sometimes simply the Broker starting a new line.

Reading the list is also the quickest way to find candidates. A line that names something checkable (a score, a position, an item, a speed) is worth a look in the frames.

Frames give the words

His exact words are on screen: the overlay shows the line his voice reads in a speech bubble beside his avatar. For each candidate, single frames are pulled from the recording around the caption times and laid side by side on a contact sheet:

ffmpeg -ss 670 -i dirt3-1080.mp4 -frames:v 1 frame_11m10s.png

On the sheet, three things are checked before a moment becomes a clip:

  1. 01The words.

    The bubble text becomes the caption, sentence by sentence. Where the automatic captions differ, the bubble wins: the captions’ “Uh-huh, well, not the podium but the finish is locked in. Eight out of eight when the dust has settled” is the bubble’s “Ah, well, not the podium but the finish’s locked in. Eight out of eight and the dust has settled.”

  2. 02Who is speaking.

    Only lines that appear in his bubble are captioned. Game voices in the same stretch (pace notes, announcers, unit callouts) stay uncaptioned, and the window is chosen so they do not cut across his line.

  3. 03Whether he is right.

    The line is compared with the frame: the score on the board, the gear on the gauge, the row in the results table. A clip is cut only when the line matches what is visible. Misses stay on the session pages, where they are evidence, not promotion.

The frames also catch timing problems the captions cannot show: a line spoken over a replay, a remark about a character who left the screen seconds earlier, a menu the player has already left. Stills for the session pages come from the same step, scaled to 1280 pixels wide and saved as WebP:

ffmpeg -ss 668 -i dirt3-1080.mp4 -frames:v 1 -vf scale=1280:-2:flags=lanczos -c:v libwebp -quality 80 -compression_level 6 eight-of-eight.webp

One JSON spec per clip

Each clip is described by a small JSON file in scripts/clips/specs/: the source, the window, the game label, a hook, and the captions with their absolute times in the recording (m:ss, decimals allowed). The hook is one short line, at most 24 characters, about the Broker and true to the clip. This is the spec of the DiRT 3 final-results clip, with the folder paths shortened:

{
 "src": ".../clips/src/dirt3-1080.mp4",
 "start": "11:03", "end": "11:23",
 "game": "DiRT 3", "hook": "He read the final table.",
 "out": ".../clips/out/dirt-3-eight-of-eight-vertical.mp4",
 "captions": [
  ["11:05", "11:08.8", "Ah, well, not the podium but the finish's locked in."],
  ["11:08.8", "11:12", "Eight out of eight and the dust has settled."],
  ["11:12", "11:13.5", "Could've been worse."],
  ["11:13.5", "11:16", "Still, that gap's a punch in the gut."],
  ["11:16", "11:18.8", "Next time, maybe a bit more fire, yeah?"],
  ["11:18.8", "11:21.5", "The rally gods have spoken, for now."]
 ]
}

An optional inset sets the overlay close-up as [x, y, width, height] in source pixels. The default, [380, 470, 700, 334], frames the bubble and avatar in the 1920 × 804 recordings; the 720p recordings need their own, for example [230, 300, 520, 236] for Company of Heroes.

Writing the spec by hand is deliberate. Every caption line is a decision someone checked against a frame, and the file is the record of it: the clip can be rendered again identically at any time, and anyone can compare its captions with the recording.

The render script

scripts/clips/render_clip.py turns one spec into a vertical 1080 × 1920 MP4 in a single ffmpeg pass, run from the repository root:

python scripts/clips/render_clip.py scripts/clips/specs/dirt-3-eight-of-eight.json
DIRT 3 · SIGNAL BROKER He read the final table. overlay close-up avatar and bubble, from the same frame full frame, uncropped the moment he is talking about Eight out of eight and the dust has settled. The Broker’s words and voice are generated by AI. Early Founder Alpha build, unedited. thesignalbroker.com Game label and hook y 64 and 112 · hook of at most 24 characters Overlay close-up · y 340 crop 700 × 334 at (380, 470) → 1080 × 516 Full recording frame · y 874 1920 × 804 → 1080 × 452 Caption · y 1366 one sentence at a time, 28 characters a line AI line · fixed on every clip 1080 × 1920, 30 fps, audio at −16 LUFS
  • Game label and hook at the top: “DIRT 3 · SIGNAL BROKER”, then the hook in large type.
  • Overlay close-up. The inset crop of the same frame, scaled to the full 1080-pixel width so his bubble can be read on a phone; with the default crop it is 516 pixels tall.
  • The full frame, uncropped. The whole recording frame scaled to 1080 wide (452 pixels tall for a 1920 × 804 source), so the moment he is talking about stays in view next to his own overlay.
  • Captions. His words from the spec, one sentence at a time, wrapped at 28 characters and shown on the caption times.
  • The AI line at the bottom of every clip: “The Broker’s words and voice are generated by AI. Early Founder Alpha build, unedited.” with the site address.

The audio is the recording’s own track, his voice and the game together, normalized to −16 LUFS. Nothing is added: no music, no effects, no re-voicing. Video is H.264 (High profile, CRF 19, 30 fps), audio AAC at 160 kbps, and the file is written with fast start for streaming. The captions are burned into the picture from an ASS subtitle file the script writes next to the clip, so the clip carries its captions wherever it is posted.

Check before it ships

A render is not finished until one frame from the middle of it has been looked at: is the bubble legible in the close-up, does the caption on screen match the bubble, is the hook true to what happens. For the 720p recordings the default crop misses the bubble, so the inset is set by hand and checked the same way.

Some candidates do not survive this step. In the October batch, a GTA V line about “nothing happening” was dropped because the frame shows a busy street with a wanted level, and a Dead Cells loadout clip was dropped because its last sentence calls an equipped collar slot empty. Both moments are on the session pages instead, with what went wrong.

The one check frames cannot make is the sound. The captions sit on audio-derived times and nobody in this workflow listens to the audio, so the notes for every clip leave one step to whoever publishes it: a short listen to confirm the voice sits under the captions.

Publishing settings

The clips go out as YouTube Shorts on the channel and as video posts on X, with the same settings every time:

Title
The hook, then “AI cohost watching” and the game, then “Signal Broker Founder Alpha”.
Description
The hook; two sentences on what the Broker is and does not do (he does not play, hear the player or read chat); a plain link to the session page; and “The Broker’s words and voice are generated by AI and can be wrong or badly timed. Founder Alpha is early-access software, sold to customers in the United States only. Free trial: 30 Signal Minutes, no card.”
Audience
Not made for kids.
Altered content
Yes: the voice is synthetic.
Related video
The full session recording the clip was cut from.
On X
The hook, the game and build, the AI sentence and the plain session link, within 280 characters, with the clip attached.

The link points at the session page, not the sales page, so a viewer who wants to judge the Broker lands on the full recording and the notes on what he got right and wrong.

Limits

  • This is the developer’s own process for the channel’s clips, not a feature of the app.
  • Words are checked against the overlay text and timed on automatic captions; nobody in this workflow listens to the audio, so a short listen before publishing is the one check it leaves open.
  • The example spec has its folder paths shortened; the script expects ffmpeg with libass and the Windows fonts Segoe UI and Bahnschrift.
  • Founder Alpha is early-access software; the commentary can be wrong, repeated or badly timed, and it is sold to customers in the United States only.

Ready when you are.

Founder Alpha is available to customers in the United States. Founder Alpha is early-access software. Signal Broker is an AI system. The Broker's words and voice are generated using AI. No person is speaking or writing what he says.