---
name: make-video
description: Make a video, MP4, GIF, animation, music video, short film, explainer, chart animation, product demo, logo reveal or social clip from code. Write one HTML page that draws any frame from its time t, render it frame-exact to MP4 with Helios, check stills and contact sheets, and add a soundtrack. Use whenever the user asks for a video or an animation file.
---
# Make a video with Helios
A Helios video is one HTML page with one function, `window.renderAt(t)`. It draws the frame at `t` seconds. The Helios renderer loads the page in headless Chrome, calls `renderAt(t)` once per frame, captures each frame and encodes the MP4. There is no bundler, no framework and no capture script to write.
## 1. Write the page
Every frame must be a **pure function of `t`**. The renderer may ask for frames in any order, and it renders the same frame identically every time.
- **Derive everything from `t`:** positions, opacity, which scene is showing. Never use counters, `x += speed`, physics stepped frame by frame, or `setTimeout`/`setInterval`.
- **Randomness must be seeded.** Use `rand(seed)` below, not a bare `Math.random()` inside `renderAt`.
- **Load assets before the first frame.** Keep a `ready` promise for fonts and images, and make `renderAt` async and `await ready`. The renderer waits for any promise that `renderAt` returns.
- **Size the page to the video.** A canvas the size of the video, with `html,body{margin:0;overflow:hidden}`.
```html
```
DOM, CSS, SVG and WebGL pages work too. Set styles from `t` inside `renderAt`, or let CSS animations and GSAP/motion timelines run. The renderer seeks those to each frame's time. See [references/pages.md](references/pages.md).
## 2. Render it
```bash
npx -y @helios-project/cli@latest render video.html -o video.mp4 --duration 12
```
| Flag | Use |
|---|---|
| `--duration ` | Length in seconds. Fractions are fine. Required for a `renderAt` page. |
| `--width 1080 --height 1920` | Frame size; the default is 1920×1080. Match your canvas. Vertical 9:16 is `1080x1920`. |
| `--fps ` | Frame rate; the default is 30. |
| `--audio song.mp3` | Soundtrack, trimmed to the video. |
| `--mode canvas` | Faster for a page that is only one full-frame `