Skip to content

feat(tools): re-generatable intro-video infrastructure (tools/intro-video/)#339

Merged
avrabe merged 1 commit into
mainfrom
feat/intro-video-infra
May 30, 2026
Merged

feat(tools): re-generatable intro-video infrastructure (tools/intro-video/)#339
avrabe merged 1 commit into
mainfrom
feat/intro-video-infra

Conversation

@avrabe
Copy link
Copy Markdown
Contributor

@avrabe avrabe commented May 29, 2026

Summary

Reusable infrastructure to auto-generate a 30–60s rivet intro/quickstart video, per request. Single storyboard.json drives scene actions + timing + narration so the clip regenerates after UI changes instead of being hand-edited.

Stack: Playwright recordVideo (deterministic capture) → piper TTS (local, MIT, no API key, CI-able) → ffmpeg mux (adelay/amix sync). Rejected: OS screen-recorders (non-deterministic/headless-unfriendly), cloud TTS (proprietary lock-in + CI secret + per-render cost — only macOS say kept as a no-install preview), asciinema (second capture + sync tool).

Voice guide (from pulseengine.eu/blog): problem-first, evidence-/falsification-minded, no marketing fluff, concrete commands + artifact types, calm ~2.5 wps, signature close — "agents don't remember why — so the repository has to."

Storyboard (~39s, 7 scenes): title → rivet --help → dashboard home → /artifactsREQ-001 detail (link chain) → /coverage (gap fails the build) → outro.

Persona reviews (done before scaffolding): DevRel (problem-first in first 5s — addressed), safety engineer (show the gate not a montage — coverage scene says "fails the build" + real link chain), a11y (captions/contrast — contrast ok, single calm voice; caption .vtt generation is a documented TODO — the main a11y gap).

Files (all under tools/intro-video/)

storyboard.json · capture.spec.ts · playwright.config.ts · generate.sh (capture|tts|mux|all) · package.json · README.md · .gitignore (excludes out/, voices/, node_modules/).

Regenerate: cd tools/intro-video && npm install && npx playwright install chromium && ./generate.shout/rivet-intro.mp4.

⚠️ Honest status — NOT runtime-verified

Structurally checked (valid JSON, bash -n clean, 7 scenes, executable) but never executed (the research agent had no shell). First run needs a human + the piper binary + a .onnx voice model (not bundled — license/size). capture works standalone; tts/mux stop with a clear error until piper is installed. Open gaps: caption generation (TODO), voice selection + final timing fine-sync.

No rivet source / Cargo / existing Playwright tests touched.

Refs: FEAT-001

🤖 Generated with Claude Code

Copy link
Copy Markdown

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Rivet Criterion Benchmarks'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.20.

Benchmark suite Current: f0ad924 Previous: 120431c Ratio
store_insert/10000 20315377 ns/iter (± 835746) 15407880 ns/iter (± 422056) 1.32
query/10000 136022 ns/iter (± 936) 98172 ns/iter (± 701) 1.39

This comment was automatically generated by workflow using github-action-benchmark.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 29, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

…s/intro-video/)

Reusable infrastructure to auto-generate a 30–60s rivet intro/quickstart
video: Playwright recordVideo (deterministic capture) → piper TTS (local,
MIT, no API key, CI-able) → ffmpeg mux. Single storyboard.json drives
scene actions + timing + narration so the clip regenerates after UI
changes rather than being hand-edited.

Files:
- storyboard.json   — source of truth: 7 scenes, hold_ms timing, narration
                      (~39s nominal, ~135 words, PulseEngine voice)
- capture.spec.ts   — Playwright spec; one continuous video; renders the
                      title / CLI-help / outro as in-browser panels so
                      there's one timeline to sync narration against
- playwright.config.ts — standalone (recordVideo, 1280x720, reuses
                      `rivet serve` :3003, outputs to out/)
- generate.sh       — capture | tts | mux | all; piper default, macOS
                      `say` preview only; ffmpeg adelay/amix sync
- package.json      — pins @playwright/test
- README.md         — stack rationale, prerequisites, regenerate command,
                      voice guide, storyboard, a11y notes, gaps
- .gitignore        — excludes out/, voices/, node_modules/

Voice guide derived from pulseengine.eu/blog: problem-first, evidence-/
falsification-minded, no marketing fluff, signature close ("agents don't
remember why — so the repository has to"). Reviewed by three personas
(DevRel, safety-critical engineer, a11y) before scaffolding.

HONEST STATUS — scaffold is NOT runtime-verified: structurally checked
(valid JSON, `bash -n` clean, 7 scenes, executable) but never executed.
First run needs a human + the piper binary and a .onnx voice model
(not bundled — license/size). Open gaps: caption (.vtt) generation
wired as TODO, voice selection + final timing fine-sync need a human pass.
No rivet source / Cargo / existing tests touched.

Refs: FEAT-001
@avrabe avrabe force-pushed the feat/intro-video-infra branch from f0ad924 to 5a81894 Compare May 29, 2026 18:33
@avrabe avrabe merged commit b8039c8 into main May 30, 2026
38 of 58 checks passed
@avrabe avrabe deleted the feat/intro-video-infra branch May 30, 2026 03:59
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.

1 participant