AI Production · An agro holding

Video production as an engineering pipeline: cinematic promo for an agro holding's trade-show screen

Five minutes of looped broadcast with no film crew: the product is shot by a browser, the nature by generative models, the edit assembled by a script.

Client
An agro holding
Timeline
2026
Role
Full cycle
Status
Master delivered for the trade-show broadcast
5:00
Looped master runtime
1920×1080, 30 fps, H.264; a seamless loop via stream_loop and global fades
6
Generative nature scenes
kie GPT-image (3:2) → Kling 2.6 image-to-video, ~5-second clips, 1764×1176
~410 credits
Generation spend for the whole reel
the full image-to-video budget for animating all nature scenes — a fixed, predictable figure
3
Product surfaces captured live
public marketplace, product CRM, and a 12-section personal cabinet — all recorded via headless Chrome, no mockups

Context

An industry trade show is a short window in which a stand competes for attention with dozens of neighbors. A screen on the stand runs in a specific mode: there's no sound (the hall noise drowns it), the viewer is random and held for seconds, and the playback runs for hours with no operator. A reel for such a broadcast must be looped, self-sufficient without an audio track, and cinematic enough to stop the gaze from a passing distance.

The client's product is a digital platform: a public B2B marketplace, a product CRM, and a farm's personal cabinet with twelve sections. All of it lives in a browser, and traditional "screen recording by hand" gives a predictably weak result: a shaking cursor, random interface states, non-reproducible takes. The other half of the dramaturgy is agro nature: grain elevators, combines in the field, grain trucks. The classic path is a location shoot or stock footage; the first is expensive and slow, the second destroys the integrity of the brand style.

The key circumstance: the product is in active development. Interfaces change from sprint to sprint, and a reel shot as a one-off artifact goes stale before the trade-show season ends. We approached the task not as a shoot but as an engineering system: every scene is described by code, every layer is produced by a script, and the whole master is rebuilt with a single command. Video production here is a reproducible pipeline, not a project in a video editor's timeline.

The task

Assemble a five-minute looped 1920×1080 H.264 promo reel for continuous playback on the stand's TV screen. Show three of the platform's products live — the public site with the key role-choice scenario, the product CRM, and the personal cabinet with all twelve sections — so the viewer sees a real working interface, not slides and not mockups.

The product scenes had to be interleaved with cinematic nature in a single brand style: a lime accent on dark olive, the Manrope typeface. On top — a graphics layer: an intro with the logo, lower-thirds explaining each scene in place of the missing sound, and an outro with a QR code that takes the viewer from the stand straight into the platform's registration funnel.

A separate requirement is reproducibility. The client needs not a file but a production capability: on an interface change, the addition of a cabinet section, or a shift in campaign accents, the reel must re-shoot itself. This ruled out any manual editing and any dependence on a film crew.

Approach

We decomposed production into three independent layers with a shared assembly point. The first is programmatic capture of the live product: a browser under script control walks the interfaces and records video. The second is generative nature: agro scenes are created by an image model and animated by an image-to-video model. The third is graphics: intro, outro, and lower-thirds are built as HTML and rendered into transparent PNGs. All three layers converge in an ffmpeg edit driven by a single assembly script.

Capture is built on puppeteer-core 25 over the system Chrome: the page is recorded via page.screencast into VP9/WebM straight in headless mode, with no virtual displays or external recorders. Two scenarios cover the whole product: one shoots the CRM and personal cabinet, the other the live public site. The dramaturgy of the frame is set by code: the script clicks through the cabinet navigation and sequentially reveals all twelve sections — from the dashboard to analytics — with calibrated pauses that in a manual recording would have to be rehearsed across takes.

Script discipline extends to what should not be in the frame. The public site is shot in strong states — a clean hero, the role-choice modal with "sell" and "buy" cards — while the script deliberately avoids weak states: at shoot time, a click on "buy" led to an empty catalog on a sleeping backend, and the directorial decision here is codified right in the capture script. This is a matter of principle in the approach: directing a live product is managing the system's states, not post-processing failed takes.

Pipeline architecture

The generative layer produces six nature agro scenes: elevators, a farmer, a combine, grain trucks. Static frames are created via kie GPT-image in 3:2 by a separate generation script, kept to the reel's brand palette and compositional style. Then a second script sends each frame to Kling 2.6 image-to-video — uploading the source, submitting the task, polling status until ready — and pulls clips of about five seconds at 1764×1176 resolution. The reel's whole generative budget is on the order of 410 credits: a fixed, predictable figure, unlike a location-shoot estimate.

The graphics layer is rendered by the same Chrome that shoots the product. The intro with the logo, the outro with the QR code, and the lower-thirds are built as HTML pages in the brand style and output into transparent 1920×1080 PNGs via a render with the background disabled. The reel's graphics thus live in the same stack as the client's whole frontend: editing a lower-third is editing markup, not work in a graphics editor, and visual consistency with the product is guaranteed by construction.

The final assembly is done by an editing script on top of ffmpeg. Each source is crop-filled to 1920×1080 at 30 fps, PNG overlays are laid over the scenes with smooth alpha-channel fade-in and fade-out, scenes are stitched with an xfade chain, the whole reel gets a global fade in and fade out, and then the loop is replicated with stream_loop to a full 300 seconds. The dramaturgical structure is fixed in the assembly code: intro → site with role choice → elevators → personal cabinet → farmer → combine → CRM → grain trucks → outro with QR.

The pipeline as a whole is a set of scripts in one working folder: two capture scenarios, a frame generator, an animator, an overlay renderer, and an assembler. There are no manual operations between layers: the product interface updated — capture and assembly are re-run; the campaign accent changed — the scene order in the script is edited. Not a single second of the master exists outside the code.

Directing a silent broadcast

The absence of sound is not a constraint but a design condition around which the whole dramaturgy is built. The semantic load of a voiceover is carried by the lower-thirds: every product scene is captioned, and a viewer who catches the reel at any second understands what's in front of them. Alternating the live interface with cinematic nature keeps the rhythm: the screen scenes give the product's specifics, the generative ones the scale of the industry and the emotion.

The loop is designed seamless for hours-long playback: global fades at the start and end reduce the loop seam to a soft dimming, and the outro with the QR code ends each pass with a concrete action — the viewer leaves the stand not with an impression but with an entry point into the product. The brand style — lime on dark olive, Manrope — is held across all three layers: in the captured interface it's present natively, in the generative frames it's set by prompts, in the graphics by markup.

The master's technical parameters are subordinate to the playback scenario, not the other way around. The frame is crop-filled without distorting proportions, the rate is fixed at 30 fps across the full length, and transitions between scenes are done with xfade — no hard cuts, which on a large screen read as a glitch. The resulting H.264 plays on any trade-show player and TV without transcoding — a requirement verified before delivery, not on the stand.

Result

The master is delivered: five minutes of looped broadcast, 1920×1080, H.264, designed for silent continuous playback on a trade-show screen. The reel holds the live product in all three guises, including a walk through the twelve cabinet sections, six animated nature scenes, and a full graphics layer with a QR exit into the platform's funnel. Not a single stock frame, not a single hour of a shooting day, not a single manual operation in a video editor.

The project's economics come from measurable figures: a generative budget of about 410 credits for the whole reel, the rest being engineering time on the pipeline — with no shooting-day rates, no stock licenses, and no editor's hours in the estimate at all. A new version of the reel is a re-run of the scripts, not a new production: the marginal cost of an update is close to the cost of the changed generations alone.

The main asset for the client is not a file but a production capability. The pipeline stays at their disposal: the product changed — the reel is rebuilt by re-running the scripts; a new campaign is needed — the scene scenario changes, not the contractor. Extensions are already planned and require no core rework: a background-music version for venues with sound, a vertical 9:16 format for digital displays, and a 4K master.

What we built

  • Programmatic capture of the live product

    puppeteer-core 25 over the system Chrome, recording via page.screencast into VP9/WebM in headless mode. Two scenarios: the CRM with the personal cabinet, and the live public site.

  • Codified interface dramaturgy

    The capture script clicks through the cabinet navigation and sequentially reveals all 12 sections with calibrated pauses; weak product states are avoided by a directorial decision fixed in the code.

  • Generative nature layer

    Six agro scenes: frames in kie GPT-image (3:2) to the brand palette, animation in Kling 2.6 image-to-video — ~5-second clips, 1764×1176. Budget ~410 credits for the whole reel.

  • Graphics from HTML

    The intro with the logo, the outro with the QR, and the lower-thirds are built as HTML and rendered into transparent 1920×1080 PNGs via Chrome with the background disabled — the graphics live in the same stack as the product.

  • Editing as code

    An assembly script on top of ffmpeg: crop-fill 1920×1080@30, PNG overlays with alpha-fade, an xfade chain between scenes, global fades, looping with stream_loop to 300 seconds.

  • Fixed broadcast structure

    Intro → site with role choice → elevators → personal cabinet → farmer → combine → CRM → grain trucks → outro with QR. The scene order is a script parameter, not an editor timeline.

  • Design for silent playback

    The voiceover's semantic load is carried by the lower-thirds; the reel reads from any second. The brand style (lime on dark olive, Manrope) is held across all three layers.

Engineering challenges

Script injection crashed the headless capture

Helper code injected before document load failed at the document-start stage — the document doesn't exist yet. The fix is fixed in the pipeline: helpers are injected via page.evaluate strictly after navigating to the page.

The overlay collapsed to a single frame

A PNG input to ffmpeg gives a single frame by default, and the lower-third vanished right after appearing. The working scheme is an image input with -loop 1 and an explicit -t duration, after which alpha-fade works across the whole scene interval.

Local images didn't load in the graphics render

A page opened as a data: URL doesn't pull images over file:// — the logo and QR dropped out of the overlays. The HTML is written to a temp file and opened over file://, so local assets are available to the render.

Weak product states in the frame

At shoot time, the transition from the role-choice modal led to an empty catalog on a sleeping backend. Instead of retouching — a script decision: the capture shows the role choice itself and a clean hero, avoiding the state that shouldn't reach the broadcast.