* feat(cli): capture can route its traffic through an opt-in upstream proxy HYPERFRAMES_CAPTURE_PROXY=http://host:port sends the capture browser proxy's forwarded requests and CONNECT tunnels, and every publicRequest download, to that proxy by hostname instead of dialing a checked public IPv4. Unset, behaviour is unchanged. * fix(cli): keep capture comment share flat and close the new CodeQL findings Test fixtures record what they receive instead of echoing request data, and capture --video strips line breaks from a failed download's message before logging it. * fix(cli): proxied HTTP downloads send no URL fragment, and a malformed proxy credential is refused The absolute-form request to the upstream used the URL's href, so a fragment such as sprite.svg#icon went on the request line, which the pinned path never sends and strict proxies refuse. A malformed percent-escape in the proxy credentials threw a bare URIError instead of the usual "not a valid proxy URL" error. The test servers label their echoes text/plain. * fix(cli): strip line breaks from capture --video errors in the form CodeQL recognizes * fix(cli): capture --video logs errors through a recognized newline sanitizer --------- Co-authored-by: Jerrai <jerrai@heygen.com>
6.2 KiB
init, capture, skills
Scaffolding commands. Use these instead of creating files by hand — they set up the right file structure, copy media, run transcription, and install AI coding skills.
init
npx hyperframes init my-video # centered blank (TTY: wizard)
npx hyperframes init my-video --example warm-grain # pick an example
npx hyperframes init my-video --resolution portrait
npx hyperframes init my-video --video clip.mp4 # with video file
npx hyperframes init my-video --audio track.mp3 # with audio file
npx hyperframes init my-video --tailwind # Tailwind v4 browser runtime
npx hyperframes init my-video --non-interactive # CI — flag-only, same blank
Default depends on TTY: in a terminal, the CLI prompts for example/options (default: centered blank). Outside a TTY (CI, agents, piped output) it auto-switches to non-interactive and scaffolds that blank. Pass --example only to start from a named example. Pass --non-interactive to force flag-only mode on a TTY.
Templates: blank, warm-grain, play-mode, swiss-grid, vignelli, decision-tree, kinetic-type, product-promo, nyt-graph. (The closed set of hyperframes:example items in registry/registry.json plus the bundled blank template. hyperframes catalog does not list examples — its --type takes only block or component — so this list has no live equivalent and is checked by bun run lint:skills.)
Other useful flags:
--resolution— preset:landscape(1920×1080),portrait(1080×1920),landscape-4k,portrait-4k,square(1080×1080),square-4k. Aliases:1080p,4k,uhd,1080p-square,4k-square.--skill=<slug>— record the owning skill (e.g.hyperframes) inhyperframes.json, so every later render of this project — re-renders,npm run render,--batch— is attributed to it on anonymous telemetry without re-passing the flag. You rarely pass it by hand.--skip-skills— leave AI coding skills alone:initdoes not install the core set.HYPERFRAMES_SKIP_SKILLS=1does the same.--skip-transcribe— don't auto-transcribe--audio/--videowith Whisper.--model,--language— Whisper model / language for the auto-transcription.
Tailwind (--tailwind): the scaffold pins the Tailwind v4 browser runtime, not Studio's Tailwind v3 setup.
- Keep the pinned runtime; never swap in
cdn.tailwindcss.com. Renders wait forwindow.__tailwindReadybefore frame 0. For offline or locked-down renders, compile to CSS and ship the stylesheet. - Theme and custom utilities go in
<style type="text/tailwindcss">with@themeand@utility. No v3@tailwind base/components/utilities, notailwind.config.js;@configand@pluginabort the browser compile. - Write complete class tokens in the HTML. The runtime only sees classes it can scan, so never build a render-critical class name at seek time (
bg-${color}-500); vary items through CSS variables (style="--i: 2") or data variants. - Tailwind is for static layout and style; timing stays in GSAP or another seekable runtime.
When --audio or --video is supplied, init transcribes the file with Whisper. For voice/model selection see the media-use skill.
capture
npx hyperframes capture https://stripe.com # scaffold from a website
npx hyperframes capture https://linear.app -o linear-video # custom output directory
npx hyperframes capture https://example.com --json # JSON output for agents
npx hyperframes capture https://example.com --skip-assets # skip image/SVG download
npx hyperframes capture https://example.com --skip-vision # skip optional AI captions
npx hyperframes capture https://example.com --max-screenshots 12
npx hyperframes capture https://example.com --timeout 60000 # page-load timeout in ms
npx hyperframes capture https://example.com --capture-budget 90000 # post-navigation budget
HYPERFRAMES_CAPTURE_PROXY=http://127.0.0.1:3128 npx hyperframes capture https://example.com # behind an egress proxy
Captures a live URL as an editable HyperFrames project: screenshots become layered scenes, assets are downloaded locally, and the result is a normal project you can lint / preview / render. Use this when the user supplies a URL as the starting point for a video.
--timeout bounds page navigation; --capture-budget is the separate cooperative budget for work
after navigation (fonts, assets, vision, and contact sheets). The latter is not a hard wall-clock
watchdog and cannot interrupt native work already in flight. An outer caller deadline is therefore a
third, distinct timeout. An outer caller timeout leaves the capture result unknown; it does not prove
HyperFrames hung or that the navigation timeout should be increased. Preserve the last phase and
classify the boundary that fired. --skip-vision disables only optional AI image captioning.
For agents, use --json. The result includes ok, warnings, and lastPhase. The command also emits
stable HYPERFRAMES_CAPTURE_PHASE records so a watchdog can report the last started, completed, or
degraded phase without retaining sensitive payloads.
Treat a non-zero exit, JSON ok: false, or an output BLOCKED.md as a hard stop. Do not render,
build, or infer brand/design data from partial files in a blocked capture. A successful capture may
degrade an optional phase within budget, but its structural output still has to be usable. Exit zero and file existence alone are not semantic success: require the current
invocation's JSON ok: true, no BLOCKED.md, and artifacts usable for the video. Run each retry
into a fresh output directory; never merge or reuse a blocked attempt's partial output.
skills
npx hyperframes skills # install HyperFrames skills for AI coding tools
One-time setup that adds the HyperFrames skill pack (/hyperframes with its references, /hyperframes-cli, /hyperframes-registry, /media-use, /figma, /slideshow, /remotion-to-hyperframes) to the local AI coding environment so agents follow the framework conventions. Re-run after major HyperFrames upgrades.