Video

Brainstorm turns prompts and images into short video clips that live right on the board. Every clip is a video bubble — a <video> with controls in the same chrome as code cells (a draggable header, a bottom-right resize grip, and an × to remove it) that pans and zooms with the canvas and plays inline.

A generated clip playing inline on the board, beside its source image and prompt.

Text-to-video

Right-click → Video → Text-to-video opens the generate dialog in video mode. Describe the video, choose the length in seconds and a count (and, in hosted mode, a different model per clip), and hit Generate. The clip(s) drop onto the board as video bubbles at the click point — no source image needed. (You can still toggle the dialog back to Image if you’d rather run text-to-image.)

Image-to-video

Every image — loaded or generated — carries an orange + on its bottom edge. Click it to open the Transform image dialog, which has an Image / Video toggle. Flip it to Video, write a prompt, choose the length and a count, and hit Animate to run image-to-video from that source image.

The result is a small lineage beneath the source, joined by Bézier connectors — the same shape as image-to-image, but the row holds clips instead of stills:

source image  →  prompt bubble  →  row of generated clips
  • The prompt bubble is display-only; the clips are full video bubbles that play inline, drag, resize, and close.
  • The same curved connectors apply — they reshape as you drag either end, and a hover-to-remove × sits at each connector’s midpoint.

Loading a video

Right-click → Video → Load video picks a local video file and drops it straight onto the board as a video bubble — handy for bringing an existing clip onto the canvas alongside everything else.

Videos in code cells

Video bubbles plug into code cells as data — the same way spreadsheets and images do — and any video a cell writes comes back onto the board as its own clip. (In-browser kernel only.)

  • As input — the VIDEOS dict. Every video bubble has its own orange +: click it for a small menu — Python spawns a code cell that reads the clip, HTML5 spawns an HTML5 bubble with the clip linked in — or drag the + onto an existing code cell or HTML5 bubble to link the video in there. In a code cell, each linked video — and any inherited from an ancestor cell — is written into the kernel filesystem and exposed through an auto-injected VIDEOS dict (video1, video2, … → path), so you can e.g. cv2.VideoCapture(VIDEOS["video1"]); in an HTML5 bubble it’s injected into the iframe as a VIDEOS global of data URLs. The link is a green connector with the same hover-to-remove ×, and it’s re-materialized on every run. The magic wand is told the available VIDEOS keys too, so a generated snippet reads the real clips instead of inventing paths.
  • As output — a written file becomes its own bubble. When a run writes a video file (.mp4, .webm, .mov, …), Brainstorm surfaces it as its own video bubble to the right of the cell, joined by a Bézier connector — the video twin of how image outputs get their own image bubbles. A re-run that rewrites the file replaces the clip; detach the connector (hover-×) to keep one as a standalone clip the cell won’t overwrite. (Linked input videos aren’t mistaken for outputs — only files the cell actually writes are surfaced.)
Linking a clip into a code cell as VIDEOS, and a run's written video appearing as its own connected bubble.

Playback tip. A clip plays in its bubble only if the browser can decode it — prefer H.264 .mp4 or .webm. The AVI container isn’t supported by browsers, so an .avi output is still captured and connected but won’t play in-app.

Persistence & sync

Clips persist and sync with the board and survive disk export/import. Each clip’s bytes are stored locally (in IndexedDB), and for Plus users they also sync to the cloud so a collaborator can play a clip they don’t have locally — a reloaded or shared board shows its clips without regenerating. Free, lapsed, and signed-out boards keep video local-only.

Settings & metering

Configure the video track — BYOK vs hosted, model / base URL / API key, or the hosted model picker — in the Models tab, alongside Chat and Image generation. Hosted video is metered per clip from your balance. See Accounts & billing.