Skip to content

Record the onboarding and what's new videos from the app - #1199

Draft
JorimTheuns wants to merge 13 commits into
best-practices-samplefrom
feat/release-videos
Draft

JorimTheuns wants to merge 13 commits into
best-practices-samplefrom
feat/release-videos

Conversation

@JorimTheuns

@JorimTheuns JorimTheuns commented Oct 10, 2026 •

Copy link
Copy Markdown
Member

Requested by Jor · project thread

Stacked on #1200 (best practices sample). Merge that first; GitHub then retargets this PR to main.

Before: release videos had to be screen-recorded and edited by hand each release.

After: pnpm videos records an onboarding video (a new user's first walk through dembrane, opening with the best practices sample project) and a what's new video (the release's cards plus the onboarding scenes that changed) from a production build, in English and Dutch, with WebVTT captions and an optional burned-in copy. A narrator's own recordings can be added: they are cleaned up, cut into lines and mixed in, and each shot waits for its line.

How: Playwright drives the app against a seeded local database (apps/migrate/src/video-seed.ts: Millbrook and best practices samples under an ordinary user). Frames come from Chrome's screencast and ffmpeg assembles the clips. Scenes live in dembrane/frontend/videos/scenes, each tagged with the release that introduced it; a release file lists its what's new scenes. Voiceover takes go through DeepFilterNet 3 (pinned binary, checksum checked), a high-pass and loudness normalisation; --script writes the narrator's script. See dembrane/frontend/videos/README.md. The create project wizard gets four test ids.

Open before merging: the v3 numbers in releases/v3.0.0.ts are placeholders.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4

@github-actions

Copy link
Copy Markdown
Contributor

Hi @claude!

Thank you for contributing to Dembrane ECHO! Before we consider your Pull Request, we ask that you sign our Contributor License Agreement (CLA). This is only required for your first Pull Request.

Please review the CLA, and sign it by adding your GitHub username to the contributors.yml file. Thanks!

@JorimTheuns JorimTheuns self-assigned this Oct 10, 2026

Copy link
Copy Markdown
Member Author

10-check-server failed on faec466 in packages/conversations/test/pipeline.integration.test.ts:149 ("a conversation whose merge fails still gets its duration from the chunks": expected duration 5, got 0). This PR doesn't change the conversations package; on the server side it only adds apps/migrate/src/video-seed.ts and exports a list of ids from packages/samples. The same test file passes twice locally on this branch against Postgres 16 (22 pass, 0 fail), and the check passed on main at the base commit. It looks like a timing race in that test, and I don't have a fix for it. The push of 0513250 (catalog references, for 20-check-frontend) runs the check again.


Generated by Claude Code

@JorimTheuns
JorimTheuns changed the base branch from main to best-practices-sample October 10, 2026 16:31
A script drives a production build with Playwright, records each scene through
Chrome's screencast, and joins the clips with ffmpeg into 1920x1080 MP4s with
WebVTT captions, in English and Dutch. The what's new video is the release's
own cards plus the onboarding scenes listed for it, so each release re-records
both instead of re-editing them.

- dembrane/frontend/videos: scenes, render step, README
- apps/migrate/src/video-seed.ts: local seed for the recording user and the
  Millbrook sample, which also removes what the last recording created
- test ids on the create project wizard, so scenes don't depend on copy
- product-release skill points step 7 at `pnpm videos`

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
Takes are cleaned with DeepFilterNet 3, loudness-normalised and cut into
lines; each shot holds until its line is spoken, and the lines are mixed
into the videos. --script writes the narrator's script.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
… ids

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
The placeholder card becomes a scene that opens the seeded best practices
project and its chat on how to set up a first project. The video seed
seeds that sample in the same workspace and keeps it through cleanup.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
pnpm videos:measure signs in to each environment with a test account and
times opening a project, so release cards can quote the same synthetic
steps on both versions.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
v2 rotates its refresh token on use, so each run saves its cookies for
the next. Runs now alternate between environments so network changes
affect both alike.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011yTwhFVtLseJGteGEVdShK
Production v2.4.2 against staging v3.0.2, 20 alternating runs each with
pnpm videos:measure. The placeholder warning now reads the cards' own text.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
v3 has not run in production long enough to compare uptime or failed
uploads with v2.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
…cene

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
…ording per language

The narrator can now record the whole script as <lang>/all.<ext>; it is split at pauses of
2 s or more into scenes, then into lines.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
…or said

Whisper (faster-whisper) transcribes the cut lines, prompted with the scripted line, so ad libs
get matching captions. The narration script keeps the scripted text.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYnJLB1pzSoRLExHKvqoV4

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants