Skip to content

How it works

Five tools

This is the pipeline your agent actually runs, tool by tool, rather than a simplified overview. Full detail lives in PIPELINE.md and PLANNING.md.

  1. 01

    Intake becomes beats.json

    validate_beatswrite_beats_file

    Your agent asks PLANNING.md's guided questions (product, features to demo, target length, Higgsfield access, brand info, existing assets), or reads them out of a README or feature list you paste in instead. For every feature it runs the capture method decision tree: a held state becomes a screenshot, something that changes over time becomes a recording, a claim the product cannot back yet becomes a labelled dom-demo, and a shot with no product UI in it at all can become Higgsfield b roll. The draft is a beats.json: fps, title, and a contiguous list of beats, each with a start frame, a duration, narration, and a decided captureMethod. validate_beats checks the schema before anything touches disk, and write_beats_file refuses to write a file validate_beats has not passed. Neither tool enforces the approval gate: your agent is required to show you the full draft and get an explicit yes first, every time.

  2. 02

    Real capture, not a guess

    capture_screenshotcapture_screen_recording

    Every screenshot and recording beat is captured for real, against your actual running app, through Playwright. This is where the pipeline earns the claim that nothing is hallucinated: these tools drive a real browser to the beat's URL, run its interactions (click, fill, select, hover, scroll, wait), and save the result at the exact asset path the rest of the pipeline expects. Internally they follow CAPTURE.md's zoom compensation protocol, because a Playwright browser profile can carry a per origin zoom level that silently desyncs the requested viewport from what Chrome actually renders. An uncorrected capture reliably comes out small, soft, or bleeding in a neighbouring section. Both tools measure and compensate instead of trusting a resize at face value.

  3. 03

    Scenes get scaffolded

    extract_brandscaffold_scene

    First, extract_brand makes the video look like your product rather than like openvidstudio: Tailwind theme blocks and CSS custom properties for the palette, next/font imports for the typefaces, and the best wordmark it can find. It reports the file every value came from and leaves anything it cannot resolve at the default rather than guessing, so the video wears your identity and not a template. Then one scene file per beat. scaffold_scene generates the right shape for whatever capture method that beat decided on: a screenshot renders inside a BrowserFrame, a recording composites as an OffthreadVideo on the same camera keyframe pattern, a dom-demo is a hand coded panel built from your project's real design tokens and copy, and a Higgsfield clip scene is structurally identical to a real recording scene once the clip lands at its asset path. Every scene is wrapped in a CinematicScene, with grain, vignette and grade always on, and camera keyframes. Motion never stops, and STYLE.md fails QC on a static frame.

  4. 04

    Composition gets stitched

    plan_sound_effectsstitch_composition

    stitch_composition assembles every scene into a single Series, in beats.json order, with each scene's duration taken straight from its beat. It also wires up narration and music where the files exist: it checks public/audio/vo/<beatId>.mp3 for every beat and public/audio/music-bed.mp3 once, and skips the audio layer for any file that is not there. That omission is silent by design rather than an error. A video renders fine with a beat missing its narration, so the QC checklist is the real backstop here, not a tool failure. Sound effects come from the synthesized pack that ships with the project, which ffmpeg generates and which therefore carries no third-party rights at all. If a beat needs something outside it, plan_sound_effects works out what is genuinely missing and hands back a search link and a filename per sound for you to download, rather than fetching anything on your behalf. Anything you bring in lands in public/imported_audios/, kept separate from the built-in pack so it stays obvious which sounds carry licence terms.

  5. 05

    Render, then QC

    render_videoqc_extract_frames

    render_video runs the actual Remotion render to an mp4 in output/, the folder every render, contact sheet and QC still lands in, so there is one place to pick the finished video up from or point an upload step at. qc_extract_frames then pulls still frames at each beat's midpoint, and for a real capture beat its end too, since a crop that looks fine early can push the payoff off the bottom of frame once the camera has zoomed in. Your agent checks PIPELINE.md's list against real output: crisp text at every zoom level, zero linear easing, visible captions, no em dashes on screen, sound effects landing on the visual events, and beat durations matching beats.json. This is meant to run more than once. It is a QC loop, not a one shot render.