Every demo gets its own narrated walkthrough video in the voice of the team member who owns the job: intro, their job, the demo, and what we've done before.
1,679 personalised videos produced for three presenters.
TL;DR
1,679 personalised videos produced: 553 for Konstantin, 595 for Anton, 531 for Aidana.
Every video follows the same four-part story: intro → their job → the demo → what we've done before.
Voice, cursor movement, narration and editing are all automated. Recording time per video: zero minutes.
The problem
A demo link is good. A video where a real person walks you through your solution is far better, because it builds trust before the first call. But a decent Loom takes 10–15 minutes including retakes. At several dozen jobs a day, that's a full-time job just recording.
The video structure
Every video tells the same story in four acts:
Act
What the client sees
Length
1. Intro
The team member on camera, cut out and placed over a blurred screenshot of the client's own demo, with the job title beside them. "Hi, I saw your post and built something for you."
short, pre-recorded
2. Their job
A branded job-brief page: the 4–6 requirements pulled from their post, our fit score, their client profile and a "your need → our solution" grid. The cursor highlights each point as it's spoken.
~34 s
3. The demo
The live demo opens in a browser. An animated cursor scrolls, hovers and clicks the real tabs and buttons while the voice explains each section, talking to the client as "you".
~34 s
4. What we've done before
Real portfolio screenshots and numbers that match this job (e.g. a £3.8M GMV brand for a Klaviyo job), then the outro.
short
How it's made
1
Pull the job. When a row has a demo but no video, the pipeline loads ~20 fields from Notion: title, budget, country, spend, sub-scores, requirements and the demo URL.
2
Understand the demo. A headless browser opens the demo and extracts its real structure (headings, buttons, tabs), so narration only mentions things that actually exist on screen.
3
Write the script. Claude Sonnet writes seven timed narration lines for the demo act and seven for the job act, each 10–18 words, naming real sections and the client's pain points.
4
Voice it. ElevenLabs generates each line in that team member's cloned voice: 14 clips per video, timed to fixed beats (0.8 s, 5.2 s, 10.4 s …).
5
Record the screen. Playwright records both acts at 1440×900 with an injected animated cursor that moves, hovers and clicks in sync with the voice.
6
Composite the intro. rembg removes the background from every frame of the pre-recorded intro clip; Pillow places the person over the client's demo screenshot.
7
Edit. ffmpeg mixes the audio, normalises all acts to the same resolution, frame rate and codec, and joins them.
8
Publish. Upload to YouTube as unlisted (Google Drive as fallback), then write the URL and a spoken Loom script back to Notion.
Under the hood
One pipeline, three presenters. Each team member has their own intro clip, cloned voice (VOICE_ID per person), Notion video field and branch of the video template. Jobs route by Owner.
Standing rules we never break: Act 1 always shows this job's demo, never a generic one. The voice always comes from config, never hard-coded. Portfolio screenshots take priority over the generic portfolio page.
Speed: rembg's background removal is slow the first time (~2 min per intro clip) and is then cached, so each later video only pays for narration, recording and encoding.
Failure handling: if the YouTube token expires, the video goes to Google Drive and the application is still written, so a job never stalls on an upload.
Results
Metric
Value
Videos, Konstantin
553
Videos, Anton
595
Videos, Aidana
531
Total videos
1,679
Spoken Loom scripts generated as backup
2,002
Human recording time per video
0 min
What we learned
Show the client their own problem first. Act 2 ("here's what you asked for") holds attention better than jumping straight into the demo.
Narration must match the screen. Extracting the real DOM before writing the script got rid of the "AI talking about buttons that don't exist" problem.
A real face matters. Cloned voices alone felt synthetic. A real 10-second intro clip of the person makes the rest believable.