Getting Started
Verify your environment
Run the diagnostics command to check for required dependencies:Expected output:
Terminal
Preview your composition
Before rendering, preview your composition in the browser to verify it looks correct:
Terminal
Rendering Modes
- Local Mode
- Docker Mode
Local Mode (default)
Uses Puppeteer (bundled Chromium) and your system’s FFmpeg. Fast for iteration during development.Requires: FFmpeg installed on your system. See Troubleshooting if FFmpeg is not found.Terminal
- Fast startup, no container overhead
- Can use your system GPU for Chrome/WebGL capture by default
- Can use your system GPU for hardware-accelerated encoding (with
--gpu) - Best for iterative development
- Output may vary across platforms due to font and Chrome version differences
- Not suitable for CI/CD pipelines that require reproducibility
When to Use Each Mode
| Scenario | Recommended Mode |
|---|---|
| Local development and iteration | Local |
| CI/CD pipeline | Docker |
| Sharing renders with a team | Docker |
| Quick preview export | Local |
| AI agent-driven rendering | Docker |
| Benchmarking performance | Local |
Options
| Flag | Values | Default | Description |
|---|---|---|---|
--output | path | renders/<name>.mp4 | Output file path |
--format | mp4, mov, webm, gif, png-sequence | mp4 | Output format (see Transparent Video below) |
--fps | 24, 30, 60 | 30 | Frames per second |
--gif-loop | 0-65535 | 0 | GIF loop count. 0 loops forever |
--quality | draft, standard, high | standard | Encoding quality preset |
--crf | 0–51 | — | Override CRF (lower = higher quality). Cannot combine with --video-bitrate |
--video-bitrate | e.g. 10M, 5000k | — | Target bitrate encoding. Cannot combine with --crf |
--video-frame-format | auto, jpg, png | auto | Source video frame extraction format. Use png for UI recordings, screen captures, and color-sensitive source videos |
--workers | 1-8 or auto | auto | Parallel render workers (see Workers below) |
--max-concurrent-renders | 1-10 | 2 | Max simultaneous renders via the producer server (see Concurrent Renders below) |
--batch | path | — | JSON array of variable rows (or { "rows": [...] }), rendering one output per row |
--batch-concurrency | integer | 1 | Maximum batch rows to render at once |
--batch-fail-fast | — | off | Stop launching new batch rows after the first row failure |
--gpu | — | off | GPU encoding (NVENC, VideoToolbox, AMF, VAAPI, QSV) |
--browser-gpu / --no-browser-gpu | — | on locally, off in Docker | Use or opt out of host GPU acceleration for local Chrome/WebGL capture |
--hdr | — | off | Force HDR output even if no HDR sources are detected (MP4 only). See HDR Rendering |
--sdr | — | off | Force SDR output even if HDR sources are detected |
--docker | — | off | Use Docker for deterministic rendering |
--quiet | — | off | Suppress verbose output |
Quality and Encoding
The--quality flag selects a preset that controls the H.264 CRF (Constant Rate Factor) and encoder speed:
| Preset | CRF | x264 Preset | Best For |
|---|---|---|---|
draft | 28 | ultrafast | Quick previews, iteration |
standard | 18 | medium | General use — visually lossless at 1080p |
high | 15 | slow | Final delivery, near-lossless quality |
--crf or --video-bitrate to override the preset:
standard preset (CRF 18) is visually lossless at 1080p — most people cannot distinguish it from the source. Use --quality draft for faster iteration, or --quality high / --crf 10 when file size is no concern.
Animated GIF
Use GIF when the output needs to autoplay inline in GitHub PRs, READMEs, issue reports, and docs pages:Terminal
palettegen with diff statistics, then paletteuse with Sierra dithering) for better gradients and text edges than a single-pass conversion. GIFs are still much larger than MP4/WebM at the same dimensions, so prefer short compositions. GIF renders are capped at 30fps; pass --fps 15 for smaller files.
GIF does not carry audio and only has 1-bit transparency. For transparent overlays, use --format webm, --format mov, or --format png-sequence instead.
For UI recordings, screen captures, or other source videos where saturated interface colors matter, pass --video-frame-format png to extract source video layers as PNG before browser capture. The default auto mode preserves the historical behavior: alpha-capable sources use PNG, opaque sources use JPG.
GPU Acceleration
Hyperframes has two separate GPU acceleration surfaces:--gpuuses a hardware video encoder in FFmpeg when one is available. Supported backends include VideoToolbox on macOS, NVENC on NVIDIA systems, AMD AMF on Windows, VAAPI on Linux, and Intel QSV on supported Windows/Linux hosts.- Browser GPU uses the host GPU for local Chrome/WebGL capture. It is enabled automatically for local renders and disabled in Docker. Use
--no-browser-gputo opt out.
Terminal
--no-browser-gpu or Docker mode when exact cross-machine reproducibility matters more than local render speed.
Workers
Each render worker launches a separate Chrome browser process to capture frames in parallel. More workers can speed up rendering, but each one consumes ~256 MB of RAM and significant CPU.Default behavior
By default, Hyperframes uses half of your CPU cores, capped at 4:| Machine | CPU cores | Default workers |
|---|---|---|
| MacBook Air (M1) | 8 | 4 |
| MacBook Pro (M3) | 12 | 4 (capped) |
| 4-core laptop | 4 | 2 |
| 2-core VM | 2 | 1 |
Choosing a worker count
Terminal
When to use 1 worker
- Short compositions (under 2 seconds / 60 frames) — parallelism overhead exceeds the benefit
- Low-memory machines (4 GB or less)
- Running renders alongside other heavy processes (video editing, large builds)
When to increase workers
- Long compositions (30+ seconds) on a machine with 8+ cores and 16+ GB RAM
- Dedicated render machines or CI runners
- Docker mode on a well-provisioned host
Batch Rendering
Batch rendering runs the same composition once per variables row:rows.json
Terminal
--output is a template. Use {index} or any scalar key from the row to make each path unique. Hyperframes preflights the full batch before rendering: malformed rows, missing placeholders, duplicate output paths, and strict variable mismatches fail before the first video starts. A manifest.json file is written next to the outputs with per-row status, output path, render time, duration when available, and error details.
Rows continue after failures by default so a bad data row does not discard the rest of the batch. Add --batch-fail-fast to stop launching new rows after the first failure, or --json to stream machine-readable progress events while the manifest is updated.
Concurrent Renders
When multiple render requests hit the producer server simultaneously (common with AI agents), each render spawns its own set of Chrome worker processes. Too many concurrent renders can exhaust CPU and cause failures. The producer server uses a request-level semaphore to queue renders. OnlymaxConcurrentRenders renders execute at a time — additional requests wait in a FIFO queue until a slot opens.
Configuration
Terminal
Queue status
The producer server exposes aGET /render/queue endpoint that returns the current state:
SSE queue events
When using the streaming endpoint (POST /render/stream), queued requests receive a queued event before rendering begins:
Choosing a concurrency limit
| Machine | CPU cores | Recommended limit |
|---|---|---|
| 4-core VM | 4 | 1 |
| 8-core workstation | 8 | 2 |
| 16-core server | 16 | 3-4 |
| 32-core render box | 32 | 5-6 |
Transparent Video
Hyperframes supports rendering with a transparent background — useful for overlays, lower thirds, subscribe cards, and any element you want to composite over other footage in a video editor.Recommended format: MOV (ProRes 4444)
Terminal
- CapCut
- Final Cut Pro
- Adobe Premiere Pro
- DaVinci Resolve
- After Effects
Format comparison
| Format | Codec | Transparency | Video editors | Browsers | File size |
|---|---|---|---|---|---|
| MOV | ProRes 4444 | Yes | CapCut, Final Cut, Premiere, DaVinci, After Effects | No | Large |
| WebM | VP9 | Yes | None (shows black background) | Chrome, Firefox | Small |
| PNG sequence | RGBA PNGs (no encoding) | Yes (lossless) | After Effects, Nuke, Fusion (image-sequence import) | No | Largest |
| MP4 | H.264 | No | All | All | Small |
WebM VP9 alpha is technically supported but all major video editors ignore the alpha channel and render transparent areas as black. Only Chromium-based browsers (Chrome, Arc, Brave, Edge) decode VP9 alpha correctly. Safari does not support it. Use MOV for editor workflows and WebM only for browser-based playback.
PNG sequence (no encoding)
Terminal
--format png-sequence skips the encoder entirely. The captured RGBA frames are copied to <output>/frame_NNNNNN.png (zero-padded) and, if the composition has audio, an audio.aac sidecar is written alongside. Use this when you want lossless frames — for compositing in After Effects / Nuke / Fusion, or as the input to a custom encode pipeline. --output is treated as a directory and is created if it doesn’t exist.
How it works
When you render with--format mov, --format webm, or --format png-sequence, Hyperframes:
- Captures each frame as a PNG with alpha channel (instead of JPEG for MP4)
- Sets Chrome’s page background to transparent via
Emulation.setDefaultBackgroundColorOverride - Encodes with an alpha-capable codec (ProRes 4444 for MOV, VP9 for WebM);
png-sequenceskips encoding and writes the captured frames directly
background on html or body — leave it unset so the transparent background comes through.
Authoring transparent compositions
Verifying transparency
- In a browser: Open the MOV file — it won’t play (ProRes is not a browser codec). Instead, render a WebM copy and open it in Chrome on a checkerboard background page.
- In a video editor: Import the MOV file and place it on a track above other footage. Transparent areas should show the footage below.
- Online tool: Use rotato.app/tools/transparent-video to verify your MOV or WebM has working transparency.
Tips
- Use
npx hyperframes benchmarkto find optimal settings for your system - Docker mode is slower but guarantees identical output across platforms
- For compositions with many frames,
--gpucan significantly speed up local encoding
Next Steps
Deterministic Rendering
Understand the determinism guarantees
HDR Rendering
Render HDR10 MP4 from HDR video and image sources
Cloud Rendering
Render on HeyGen’s hosted cloud — no local Chrome or FFmpeg
CLI Reference
Full list of CLI commands and flags
Troubleshooting
Fix common rendering issues