optional-skills/creative/hyperframes/references/troubleshooting.md
HeadlessExperimental.beginFrame' wasn't found (first thing to check)Symptom: npx hyperframes render fails with:
✗ Render failed
Protocol error (HeadlessExperimental.beginFrame):
'HeadlessExperimental.beginFrame' wasn't found
Cause: Chromium 147+ removed the HeadlessExperimental.beginFrame CDP command. This affected sandbox environments (e.g., OpenClaw, some containerized agent hosts) that ship modern Chromium as the system browser. See hyperframes#294.
Fix (permanent — preferred): upgrade.
npx hyperframes upgrade -y
# or
npm install -g hyperframes@latest
hyperframes >= 0.4.2 auto-detects whether the resolved browser supports beginFrame (checks for chrome-headless-shell in the binary path) and falls back to screenshot capture mode when it doesn't. Commit 4c72ba4 (March 2026) shipped this auto-detect.
Fix (escape hatch — if you can't upgrade):
export PRODUCER_FORCE_SCREENSHOT=true
npx hyperframes render
This forces screenshot mode regardless of the binary. Screenshot mode is slightly slower but visually identical.
Fix (prevent — recommended): install chrome-headless-shell so the engine can use the fast BeginFrame path:
npx puppeteer browsers install chrome-headless-shell
# or let the CLI do it
npx hyperframes browser --install
scripts/setup.sh runs this automatically.
npx hyperframes render hangs for 120s then times outCause: the resolved browser is system Chrome (e.g., /usr/bin/google-chrome) and doesn't support the BeginFrame path, but auto-detect also missed it (older hyperframes version).
Fix:
npx hyperframes browser --pathchrome-headless-shell: npx hyperframes browser --install, ORexport PRODUCER_FORCE_SCREENSHOT=true, ORnpx hyperframes upgrade -yffmpeg: command not foundInstall FFmpeg via your system package manager:
| OS / distro | Command |
|---|---|
| Ubuntu / Debian | sudo apt-get install -y ffmpeg |
| Fedora / RHEL | sudo dnf install -y ffmpeg |
| Arch | sudo pacman -S ffmpeg |
| macOS | brew install ffmpeg |
| Windows | winget install Gyan.FFmpeg |
Verify: ffmpeg -version.
Node version X is not supportedHyperFrames requires Node.js >= 22. Check with node --version.
nvm install 22 && nvm use 22brew install node@22 && brew link --overwrite node@22ENOSPC: no space left on device or OOM kills during renderRenders are memory- and disk-hungry. Minimums:
--quality high)/tmp during captureMitigations:
--quality draft.--fps 24.--workers 1.TMPDIR to a volume with more space: export TMPDIR=/mnt/scratch.Check the browser console in preview — usually:
__timelines["typo"] instead of __timelines["root"]).<template> (only sub-compositions use <template>).Run npx hyperframes lint --verbose to see info-level findings.
hyperframes validate⚠ WCAG AA contrast warnings (3):
· .subtitle "secondary text" — 2.67:1 (need 4.5:1, t=5.3s)
--no-contrast if iterating rapidly, but clear it before delivery.Font family 'X' not supported by compilerThe compiler embeds a curated set of web-safe + open-source fonts. If a font isn't supported, either:
@font-face pointing to a .woff2 in the project directory (the compiler embeds referenced @font-face files).Check:
<video> element has muted playsinline (required — browser autoplay policy).<audio> element, not the video element.data-volume is set (defaults to 1).Add --privileged or pass --cap-add=SYS_ADMIN:
npx hyperframes render --docker --docker-args "--cap-add=SYS_ADMIN"
The headless browser needs namespace permissions for sandboxing.
Symptom: load average climbs and stays high; top shows several chrome-headless-shell --type=gpu-process at ~300%+ CPU each, alive for hours/days, even when you're not rendering.
Cause: npx hyperframes preview is a long-lived server that keeps Chrome render workers resident. On hosts with no real GPU (WSL, containers, most CI), each idle worker falls back to software WebGL (swiftshader) whose GPU process busy-spins a CPU core. A preview left open — or several started over time — stacks these up.
Diagnose:
pgrep -af chrome-headless-shell # list the workers + their parent flags
pgrep -af "hyperframes.*preview" # the preview server(s) holding them open
uptime # confirm elevated load average
Fix: stop the preview server and its workers (see SKILL.md#cleanup):
pkill -f "hyperframes.*preview"
pkill -f chrome-headless-shell # only if no other tool uses it — check pgrep first
Avoid: never leave a preview running after review; use render (one-shot, self-cleaning) for output. Keep --workers low on shared/GPU-less hosts.
Include npx hyperframes info output + the full error log. File at github.com/heygen-com/hyperframes.