Demo videos
Product demos are built from the real production components — the same
ReadOnlyChatView, RequirementsPanel, TaskPanel, and TestResultsPanel
the application ships — driven by a controlled timeline instead of live
state. The scrubbable player below is a Remotion
composition; the identical component renders the homepage’s auto-playing
showcase and exports to MP4.
How it works
Section titled “How it works”The demo kit lives in apps/editor-web/src/demos. Its core idea: the visible
room state is a pure function of elapsed time.
- A
DemoScenariois plain data — a sequence of beats (DemoStep), each pinning a fullDemoRoomState(chat messages, planning tasks, requirements, test results, preview URL, active tab, caption) to astartMs. demoStateAt(scenario, timeMs)resolves the state for any moment, so the same scenario can be driven by a looping animation-frame clock on the web (useDemoClock) or by Remotion’s frame clock ((useCurrentFrame() / fps) * 1000).DemoRoomStagepaints that state through the production components, pixel-for-pixel.
Authoring a new demo
Section titled “Authoring a new demo”- Write a scenario in
apps/editor-web/src/demos/scenarios/— mock the domain data with the same shapes the components consume and lay out beats withstartMs(seehero-journey.tsfor the reference). - Register a composition in
apps/editor-docs/src/demo-videos/Root.tsx— duration, fps, and canvas size come from the scenario itself. - Preview and export with
pnpm --filter editor-docs demos:studio(live scrubber) orpnpm --filter editor-docs demos:render <id>(MP4). - Embed it in these docs with
@remotion/playerinside a/preview/*route, or as an auto-playing loop withuseDemoClocklike the homepage showcase.