Skip to main content

Documentation Index

Fetch the complete documentation index at: https://hyperframes.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

The hyperframes CLI is the primary way to work with Hyperframes. It handles project creation, live preview, rendering, linting, and diagnostics — all from your terminal.
npm install -g hyperframes
# or use directly with npx
npx hyperframes <command>

When to Use

Use the CLI when you want to:
  • Capture a website for video production (capture)
  • Create a new composition project from an example (init)
  • Preview compositions with live hot reload (preview)
  • Render compositions to MP4 locally or in Docker (render)
  • Lint compositions for structural issues (lint)
  • Inspect rendered visual layout for text overflow and clipped containers (inspect)
  • Capture key frames as PNG screenshots (snapshot)
  • Check your environment for missing dependencies (doctor)
Use a different package if you want to:
  • Render programmatically from Node.js code — use the producer
  • Build a custom frame capture pipeline — use the engine
  • Embed a composition editor in your own web app — use the studio
  • Parse or generate composition HTML in code — use core
The CLI is the recommended starting point for all Hyperframes users. It wraps the producer, engine, and studio packages so you do not need to install them separately.

Agent-Friendly by Default

The CLI is agent-friendly by default: commands support explicit flags and parseable output so automation can run reliably.
  • Inputs can be passed via flags (for example, --example, --video, --output)
  • Missing required flags fail fast with a clear error and usage example
  • Output is plain text suitable for parsing
Interactivity is command-specific. For example, init uses prompts on TTY by default; pass --non-interactive to force non-interactive mode. --human-friendly is also command-specific (for example, catalog). It is not a global flag on every command.
# Fully non-interactive — all inputs from flags
npx hyperframes init my-video --example blank --video video.mp4
npx hyperframes render --output output.mp4 --fps 30 --quality standard
npx hyperframes upgrade --check --json

JSON Output and _meta Envelope

All commands that support --json wrap their output with a _meta field containing version check info:
{
  "name": "my-video",
  "duration": 10.5,
  "_meta": {
    "version": "0.1.4",
    "latestVersion": "0.1.5",
    "updateAvailable": true
  }
}
This allows agents to detect outdated versions from any command’s output without running a separate upgrade check. The version data comes from a 24-hour cache — no network request is made during --json output.

Passive Update Notices

The CLI checks npm for newer versions in the background (cached 24 hours). If an update is available, a notice appears on stderr after command completion:
  Update available: 0.1.4 → 0.1.5
  Run: npx hyperframes@latest
This is suppressed in CI environments, non-TTY shells, and when HYPERFRAMES_NO_UPDATE_CHECK=1 is set.

Getting Started

1

Create a project

Scaffold a new composition from an example:
npx hyperframes init --example warm-grain
You will be prompted for a project name, or pass it as an argument:
npx hyperframes init my-video --example warm-grain
See Examples for all available examples.
2

Preview in browser

Start the development server with live hot reload:
cd my-video
npx hyperframes preview
The Hyperframes Studio opens in your browser. Edit index.html and the preview updates instantly.
3

Lint your composition

Check for structural issues before rendering:
npx hyperframes lint
◆  Linting my-project/index.html

◇  0 errors, 0 warnings
4

Render to MP4

Produce the final video:
npx hyperframes render --output output.mp4
Render a specific composition instead of index.html:
npx hyperframes render -c compositions/intro.html -o intro.mp4
For deterministic output, add --docker:
npx hyperframes render --docker --output output.mp4

Commands

init

Create a new composition project from an example:
# Agent mode (default) — --example is required
npx hyperframes init my-video --example blank --video video.mp4

# Include Tailwind CSS browser-runtime support
npx hyperframes init my-video --example blank --tailwind

# Human mode — interactive prompts on TTY by default
npx hyperframes init my-video
FlagDescription
--example, -eExample to scaffold (required in default mode, interactive in --human-friendly)
--resolutionCanvas preset: landscape (1920×1080), portrait (1080×1920), landscape-4k (3840×2160), portrait-4k (2160×3840), square (1080×1080), square-4k (2160×2160). Aliases: 1080p, 4k, uhd, 1080p-square, square-1080p, 4k-square. Default: keep template dimensions.
--video, -VPath to a video file (MP4, WebM, MOV)
--audio, -aPath to an audio file (MP3, WAV, M4A)
--tailwindAdd Tailwind CSS browser-runtime support to scaffolded HTML
--skip-skillsSkip AI coding skills installation
--skip-transcribeSkip automatic whisper transcription
--modelWhisper model for transcription (e.g. small.en, medium.en, large-v3)
--languageLanguage code for transcription (e.g. en, es, ja). Filters non-target speech.
ExampleDescription
blankEmpty composition — just the scaffolding
warm-grainCream aesthetic with grain texture
play-modePlayful elastic animations
swiss-gridStructured grid layout
vignelliBold typography with red accents
In non-interactive mode, --example is required — the CLI errors with a usage example if missing. In interactive mode (default on TTY), you choose the example interactively. Pass --non-interactive to require --example via flag. When --video or --audio is provided, the CLI automatically transcribes the audio with Whisper and patches captions into the composition (use --skip-transcribe to disable).--tailwind injects the pinned Tailwind v4 browser runtime into scaffolded HTML and exposes a window.__tailwindReady promise that renders wait on before capturing frame 0. Use the /tailwind skill when editing these projects so agents follow v4 CSS-first patterns instead of v3 tailwind.config.js and @tailwind directive patterns. The browser runtime is still intended for scaffolded projects and quick iteration; for fully offline or locked-down production renders, compile Tailwind to CSS and include the stylesheet directly.After scaffolding, the CLI installs AI coding skills for Claude Code, Gemini CLI, and Codex CLI (use --skip-skills to disable). See skills command.See Examples for full details.

add

Install a block or component from the registry into an existing project. Examples (full projects) are scaffolded with init; blocks and components are smaller units you add to a composition you already have.
# Add a block (sub-composition scene)
npx hyperframes add claude-code-window

# Add a component (effect / snippet)
npx hyperframes add shader-wipe

# Target a different project dir
npx hyperframes add shader-wipe --dir ./my-video

# Headless / CI (skip clipboard; also: --json for a machine-readable result)
npx hyperframes add shader-wipe --no-clipboard --json
FlagDescription
<name> (positional)Registry item name (e.g. claude-code-window, shader-wipe)
--dirProject directory (defaults to the current working directory)
--no-clipboardSkip copying the include snippet to the clipboard
--jsonPrint a machine-readable summary (written files + snippet) to stdout
add reads hyperframes.json at the project root to know which registry to pull from and where to drop files. If the file is missing but the directory looks like a Hyperframes project (has index.html), a default hyperframes.json is written the first time you run add.Output for a block or component is a set of files plus a paste snippet — the <iframe> tag (for blocks) or the fragment path (for components) to include in your host composition. The snippet is copied to the clipboard by default; add --no-clipboard for CI or headless environments.Trying add with an example’s name (e.g. hyperframes add warm-grain) emits a clear error pointing you at init --example.

catalog

Browse the registry — list available blocks and components with optional filters:
# List everything (default: table output)
npx hyperframes catalog

# Filter by type or tag
npx hyperframes catalog --type block
npx hyperframes catalog --type block --tag social

# Machine-readable JSON
npx hyperframes catalog --json

# Interactive picker — select to install
npx hyperframes catalog --human-friendly
FlagDescription
--typeFilter by block or component
--tagFilter by tag (e.g. social, transition, text)
--jsonPrint matching items as JSON (non-interactive)
--human-friendlyInteractive picker — select an item to install it
Default output is a table listing name, type, description, and tags — designed for agents to parse. --json produces structured output. --human-friendly opens an interactive picker that runs add on selection.

compositions

List all compositions in the current project:
npx hyperframes compositions
FlagDescription
--jsonOutput as JSON
Shows each composition’s ID, duration, resolution, and element count.

transcribe

Transcribe audio/video to word-level timestamps, or import an existing transcript:
# Transcribe audio/video with local whisper.cpp
npx hyperframes transcribe audio.mp3
npx hyperframes transcribe video.mp4 --model medium.en --language en

# Import existing transcripts from other tools
npx hyperframes transcribe subtitles.srt
npx hyperframes transcribe captions.vtt
npx hyperframes transcribe openai-response.json
FlagDescription
--dir, -dProject directory (default: current directory)
--model, -mWhisper model (default: small.en). Options: tiny.en, base.en, small.en, medium.en, large-v3
--language, -lLanguage code (e.g. en, es, ja). Filters out non-target language speech.
--jsonOutput result as JSON
The command auto-detects the input type. Audio/video files are transcribed with whisper.cpp. Transcript files (.json, .srt, .vtt) are normalized and imported.Supported transcript formats:
FormatSource
whisper.cpp JSONhyperframes init --video, hyperframes transcribe
OpenAI Whisper API JSONopenai.audio.transcriptions.create() with word timestamps
SRT subtitlesVideo editors, YouTube, subtitle tools
VTT subtitlesWeb players, YouTube, transcription services
All formats are normalized to a standard [{text, start, end}] word array and saved as transcript.json. If the project has caption HTML files, they are automatically patched with the transcript data.
For music or noisy audio, use --model medium.en for better accuracy. For the best results with production content, transcribe via the OpenAI or Groq Whisper API and import the JSON.

tts

Generate speech audio from text using a local AI model (Kokoro-82M). No API key required — runs entirely on-device.
# Generate speech from text
npx hyperframes tts "Welcome to HyperFrames"

# Choose a voice
npx hyperframes tts "Hello world" --voice am_adam

# Save to a specific file
npx hyperframes tts "Intro" --voice bf_emma --output narration.wav

# Adjust speech speed
npx hyperframes tts "Slow and clear" --speed 0.8

# Generate Spanish speech (lang auto-detected from the `e` voice prefix)
npx hyperframes tts "La reunión empieza a las nueve" --voice ef_dora --output es.wav

# Override the phonemizer (read English text with a French voice)
npx hyperframes tts "Bonjour le monde" --voice af_heart --lang fr-fr

# Read text from a file
npx hyperframes tts script.txt

# List available voices
npx hyperframes tts --list
FlagDescription
--output, -oOutput file path (default: speech.wav in current directory)
--voice, -vVoice ID (run --list to see options)
--speed, -sSpeech speed multiplier (default: 1.0)
--lang, -lPhonemizer locale (en-us, en-gb, es, fr-fr, hi, it, pt-br, ja, zh). When omitted, inferred from the voice ID prefix.
--listList available voices and exit
--jsonOutput result as JSON
Voice IDs encode the phonemizer language in their first letter (a=American, b=British, e=Spanish, f=French, h=Hindi, i=Italian, j=Japanese, p=Brazilian Portuguese, z=Mandarin). --lang is only needed when you want to override that — for example, giving English text a French phonemizer for a stylized accent.
Combine tts with transcribe to generate narration and word-level timestamps for captions in a single workflow: generate the audio with tts, then transcribe the output with transcribe to get word-level timing.

remove-background

Remove the background from a video or image using a local AI model. The output is transparent media you can drop into any composition’s <video> or <img> element — no green screen required.
# Default: VP9-with-alpha WebM (HTML5-native, ~1 MB / 4s @ 1080p)
npx hyperframes remove-background avatar.mp4 -o transparent.webm

# ProRes 4444 .mov for editing round-trip
npx hyperframes remove-background avatar.mp4 -o transparent.mov

# Single image → transparent PNG
npx hyperframes remove-background portrait.jpg -o cutout.png

# Layer separation: cutout AND inverse-alpha background plate in one pass
npx hyperframes remove-background avatar.mp4 \
  -o subject.webm --background-output plate.webm

# Force CPU on a machine that has CoreML or CUDA
npx hyperframes remove-background avatar.mp4 -o transparent.webm --device cpu

# Inspect detected providers without rendering
npx hyperframes remove-background --info
FlagDescription
--output, -oOutput path. Format inferred from extension: .webm (default), .mov, .png
--background-output, -bOptional second output: inverse-alpha background plate (subject region transparent, surroundings opaque). Same source RGB, complementary mask. Must be .webm or .mov. Hole-cut, not inpainted — composite something underneath to fill the hole.
--deviceExecution provider: auto (default), cpu, coreml, cuda
--qualityWebM encoder preset: fast (crf 30, smallest), balanced (crf 18, default), best (crf 12, near-lossless). Higher quality keeps the cutout’s RGB closer to the source mp4 — important when overlaying the cutout on its own source for text-behind-subject effects. Applies to both --output and --background-output. Ignored for .mov / .png.
--infoPrint detected execution providers and exit (no render)
--jsonOutput result as JSON
The model is u2net_human_seg (MIT, ~168 MB ONNX). Weights download to ~/.cache/hyperframes/background-removal/models/ on first run and are reused thereafter. Peak inference RAM is ~1.5 GB.--device auto picks CoreML on Apple Silicon, CUDA when available, and CPU otherwise. The CLI bundles the CPU build of onnxruntime-node; for CUDA, set HYPERFRAMES_CUDA=1 and provide a GPU-enabled onnxruntime-node build.Output formats:
FormatUse caseSize (4s @ 1080p)
.webm (VP9 alpha)Drop into <video> for HTML5-native transparent playback~1 MB
.mov (ProRes 4444)Editing round-trip in Premiere / Resolve / DaVinci~50 MB
.pngSingle-image cutoutvaries
The <video> element in Chrome only respects the alpha plane when the WebM is encoded as yuva420p with the alpha_mode=1 metadata tag. The CLI sets both automatically — if you re-encode the output yourself, preserve those flags.
See the Remove Background guide for the full workflow — using transparent videos in compositions, performance per platform, limitations of u2net_human_seg, and free alternative tools when this model isn’t the right fit.

capture

Capture a website — extract screenshots, design tokens, fonts, assets, and animations for video production:
npx hyperframes capture https://stripe.com
npx hyperframes capture https://linear.app -o captures/linear
npx hyperframes capture https://example.com --json
◇  Captured Stripe | Financial Infrastructure → captures/stripe-com

  Screenshots: 12
  Assets: 45
  Sections: 15
  Fonts: sohne-var
FlagDescription
-o, --outputOutput directory (default: captures/<hostname>)
--timeoutPage load timeout in ms (default: 120000)
--skip-assetsSkip downloading images and fonts
--max-screenshotsMaximum screenshot count (default: 24)
--jsonOutput structured JSON for programmatic use
The capture command extracts everything an AI agent needs to understand a website’s visual identity: viewport screenshots at every scroll depth, color palette (pixel-sampled + DOM computed), font files, images with semantic names, SVGs, Lottie animations, video previews, WebGL shaders, visible text, and page structure.Output is a self-contained directory with a CLAUDE.md file that any AI agent can read to understand the captured site. Used by the /website-to-hyperframes skill as step 1 of the video production pipeline.Set GEMINI_API_KEY in a .env file for AI-powered image descriptions via Gemini vision (~$0.001/image). See the Website to Video guide for details.

hyperframes auth

Sign in to HeyGen and manage credentials. Credentials are stored in ~/.heygen/credentials (mode 0600) and are shared with the heygen CLI — sign in with one and the other picks up the session. Resolution order (first match wins):
  1. HEYGEN_API_KEY environment variable
  2. HYPERFRAMES_API_KEY environment variable (hyperframes alias)
  3. ~/.heygen/credentials

Subcommands

auth login --api-key

Save a HeyGen API key. The key is verified against GET /v3/users/me before the command reports success; a rejected key is not left on disk.
# Interactive hidden-input prompt
hyperframes auth login --api-key

# Pipe a key from stdin (CI-friendly)
echo "$HEYGEN_API_KEY" | hyperframes auth login --api-key

auth status

Show the active credential’s source, type, and verified identity (account + billing snapshot). Exits non-zero when nothing is configured or the API rejects the credential, so scripts can check sign-in state.
hyperframes auth status
hyperframes auth status --json   # machine-readable

auth logout

Remove the stored credential. Prompts for confirmation on a TTY.
hyperframes auth logout
hyperframes auth logout --keep-api-key   # clear only an OAuth session
hyperframes auth logout --yes            # skip the confirmation prompt

Environment variables

VariableDescription
HEYGEN_API_KEYOverride the stored credential.
HYPERFRAMES_API_KEYAlias for HEYGEN_API_KEY.
HEYGEN_API_URLAPI base URL (default https://api.heygen.com).
HEYGEN_CONFIG_DIRCredentials directory (default ~/.heygen).

hyperframes cloud

Render a HyperFrames composition on HeyGen’s hosted cloud — no local Chrome, no local ffmpeg, no AWS to manage. Sign in once with hyperframes auth login and the same credential drives every cloud subcommand.
hyperframes auth login                          # one-time
hyperframes cloud render ./my-video             # zip + upload + poll + download
hyperframes cloud render ./my-video --no-wait   # submit and exit with the render_id
hyperframes cloud list                          # browse recent renders

Subcommands

cloud render [<projectDir>]

End-to-end render: zips the project (excluding .git, node_modules, dist, .next, coverage, dotfiles), uploads it via POST /v3/assets, submits POST /v3/hyperframes/renders, polls GET /v3/hyperframes/renders/{id} until the render completes or fails, and streams the resulting video to disk. Render parameters mirror the local hyperframes render UX where they overlap:
FlagDefaultMeaning
--fps30Integer 1-240.
--qualitystandarddraft, standard, or high.
--formatmp4mp4, webm, or mov.
--resolutioncomposition defaultlandscape, portrait, landscape-4k, portrait-4k, square, square-4k.
--composition / -cindex.htmlEntry HTML file inside the zip.
--variablesInline JSON object overriding data-composition-variables.
--variables-filePath to a JSON file (alternative to --variables).
--strict-variablesoffFail when variables are undeclared or have the wrong type.
--titleFree-text label echoed back in detail responses.
--output / -orenders/<render_id>.<ext>Local destination for the downloaded video.
Lifecycle / control flags:
FlagMeaning
--no-waitSubmit and exit immediately; print the render_id to stdout.
--callback-urlHTTPS webhook fired when the render terminates (compose with --no-wait).
--callback-idOpaque tracking ID echoed in webhook payloads.
--asset-idSkip zip+upload; submit an already-uploaded composition. Mutually exclusive with the project dir and --url.
--urlSubmit a public HTTPS zip URL. Same mutual-exclusion as --asset-id.
--poll-intervalPoll cadence in seconds (default 10).
--max-waitMax poll duration in minutes (default 60).
--idempotency-keyOptional Idempotency-Key for safe retries (1-255 chars from [A-Za-z0-9_:.-]).
--jsonEmit machine-readable JSON instead of human-friendly progress.
# Default flow — render the current directory.
hyperframes cloud render

# Pick a composition + output path.
hyperframes cloud render . \
  --composition compositions/intro.html \
  --output ./renders/intro.mp4

# Higher quality at 60fps.
hyperframes cloud render --quality high --fps 60

# Fire-and-forget with a webhook (no local polling).
hyperframes cloud render --callback-url https://example.com/hf-hook --no-wait

# Re-render an already-uploaded composition (skips zip + upload).
hyperframes cloud render --asset-id asst_abc123

# Render from a public URL (no upload).
hyperframes cloud render --url https://cdn.example.com/site.zip
Safe retries via --idempotency-key
The CLI transparently retries on a 401 Unauthorized by force-refreshing the OAuth token and replaying the failed request. For most reads that’s harmless, but POST /v3/assets (the zip upload) is not idempotent on its own — a retry without an Idempotency-Key would create a duplicate asset and bill the workspace twice. Pass --idempotency-key <key> whenever you want safe retries on cloud render. The key is forwarded to both the upload and submit calls; the server scopes idempotency per-endpoint, so reusing the same value across the two steps is safe and prevents duplicates on either step. Use a UUID per logical render, or any opaque string in [A-Za-z0-9_:.-] (1-255 chars).
hyperframes cloud render . --idempotency-key "$(uuidgen)"

cloud list

Pages through recent renders. Cursor-based: --limit caps a single page (1-100), --token resumes from a previous next_token, --all walks the full list until exhausted.
hyperframes cloud list
hyperframes cloud list --limit 50 --json
hyperframes cloud list --all

cloud get <render_id>

Fetches the full detail record for one render, including the short-lived signed video_url and thumbnail_url (presigned S3 URLs — re-fetch on demand rather than cache).
hyperframes cloud get hfr_abc123
hyperframes cloud get hfr_abc123 --json

cloud delete <render_id>

Soft-deletes a render. Subsequent GET calls return 404 and the signed video URL stops working shortly after. Prompts for confirmation interactively; pass --no-confirm to bypass for scripts.
hyperframes cloud delete hfr_abc123
hyperframes cloud delete hfr_abc123 --no-confirm --json

When to pick cloud vs lambda vs local render

  • hyperframes render (local): fastest iteration loop. Use during composition authoring.
  • hyperframes lambda render: bring-your-own-AWS distributed rendering. Use when you’ve already invested in AWS and want chunked parallelism on your own account.
  • hyperframes cloud render: zero-infra option. HeyGen runs the render; you pay per credit. Use when you don’t want to manage Chrome/ffmpeg/AWS locally.

Auth + base URL

cloud reuses the credential resolved by hyperframes auth status. Override the API base for staging tests with HEYGEN_API_URL (default https://api.heygen.com).

hyperframes lambda

Deploy HyperFrames distributed rendering to AWS Lambda and drive renders from your laptop or CI. The hyperframes lambda command group wraps the @hyperframes/aws-lambda SDK plus AWS SAM so an end-to-end render is three commands:
hyperframes lambda deploy
hyperframes lambda render ./my-project --width 1920 --height 1080 --wait
hyperframes lambda destroy   # when you're done

Prerequisites

  • AWS credentials configured (env vars, ~/.aws/credentials, SSO, or IMDS).
  • AWS SAM CLI on PATH.
  • bun on PATH (used to build the Lambda handler ZIP).

Subcommands

lambda deploy

Builds packages/aws-lambda/dist/handler.zip and SAM-deploys the stack at examples/aws-lambda/template.yaml. On success, writes <cwd>/.hyperframes/lambda-stack-<stackName>.json so the other subcommands don’t need to re-derive the bucket / state-machine ARN.
hyperframes lambda deploy \
  --stack-name=hyperframes-prod \
  --region=us-east-1 \
  --concurrency=8 \
  --memory=10240
Idempotent — re-running on the same --stack-name resolves to a no-op when nothing changed.

lambda sites create <projectDir>

Tars + uploads <projectDir> to S3 with a content-addressed key. Returns a siteId you can reuse across multiple renders so a re-render of the same tree skips the upload.
hyperframes lambda sites create ./my-project
# → siteId: abc1234deadbeef0  (stable across re-runs of the same tree)

hyperframes lambda render ./my-project --site-id=abc1234deadbeef0 --width 1920 --height 1080

lambda render <projectDir>

Starts a Step Functions execution. Returns immediately with a renderId (use lambda progress to poll) unless --wait is set, in which case the CLI blocks until the render finishes and streams per-chunk progress lines.
hyperframes lambda render ./my-project \
  --width=1920 --height=1080 --fps=30 --format=mp4 \
  --chunk-size=240 --max-parallel-chunks=16 \
  --wait
--json swaps the human-readable output for a machine-parseable JSON snapshot. The composition can be parameterised with --variables / --variables-file, mirroring the local hyperframes render flags. Variables flow into the Step Functions execution input and reach every chunk worker as window.__hfVariables. Mismatches against the composition’s data-composition-variables declaration print as warnings; pass --strict-variables to fail the command instead.
hyperframes lambda render ./my-template --site-id=abc1234deadbeef0 \
  --width=1920 --height=1080 \
  --variables '{"title":"Hello Alice","accent":"#ff0000"}'
hyperframes lambda render ./my-template --site-id=abc1234deadbeef0 \
  --width=1920 --height=1080 \
  --variables-file ./alice.json --strict-variables
Variables travel inside the Step Functions Standard execution input, which AWS caps at 256 KiB for the entire payload. Pass typed data (strings, numbers, structured records) through variables; URL-reference media assets (images, audio, video) the composition resolves at render time rather than inlining bytes. The SDK validates the size client-side and rejects oversize inputs with a clear error before any AWS call runs — see the templates-on-lambda guide for the URL-your-assets convention.

lambda render-batch <projectDir>

Fans out N personalised renders from a JSONL batch file — the headline ergonomic for automated template-rendering pipelines. Deploys the site once (or skips with --site-id), then invokes renderToLambda per batch row with per-entry variables and outputKey. Concurrent Step Functions starts are capped at --max-concurrent (default 50) so a 10 000-entry batch doesn’t try to spawn 10 000 executions at once and trip AWS account limits. Batch file format (JSONL — one JSON object per line):
{"outputKey": "renders/alice.mp4", "variables": {"name": "Alice", "accent": "#ff0000"}}
{"outputKey": "renders/bob.mp4",   "variables": {"name": "Bob",   "accent": "#0000ff"}}
{"outputKey": "renders/carol.mp4", "variables": {"name": "Carol"}, "executionName": "hf-carol-001"}
hyperframes lambda render-batch ./my-template \
  --batch ./users.jsonl \
  --width 1920 --height 1080 \
  --max-concurrent 10
The verb prints a manifest — one row per input line — with executionArn + status:
Batch dispatched: 3 started, 0 failed-to-start.

  ✓ line 1  renders/alice.mp4  arn:aws:states:us-east-1:1234:execution:hf:hf-render-...
  ✓ line 2  renders/bob.mp4    arn:aws:states:us-east-1:1234:execution:hf:hf-render-...
  ✓ line 3  renders/carol.mp4  arn:aws:states:us-east-1:1234:execution:hf:hf-carol-001
Pass --json for the machine-readable form. Poll each execution via hyperframes lambda progress <renderId> (or use the returned executionArn). --dry-run skips the AWS calls and prints the manifest with status: "would-invoke" for every entry — use it to lint the batch file before committing to N billable executions:
hyperframes lambda render-batch ./my-template --batch ./users.jsonl \
  --width 1920 --height 1080 --dry-run --json
--max-concurrent is orchestrator-side only: it caps how many StartExecution calls run simultaneously, not how many Lambda invocations the account can run. AWS account-level Lambda concurrency limits live one level up and render-batch cannot enforce them; pick --max-concurrent based on your account’s concurrent-execution quota and the Lambda reserved concurrency you provisioned via lambda deploy --concurrency=<N>.

lambda progress <renderId | executionArn>

Prints one progress snapshot — overall percent, frames rendered, Lambda invocations, accrued cost, and any errors. Accepts either a bare renderId (resolved against the stack’s state-machine ARN) or a full SFN execution ARN.
hyperframes lambda progress hf-render-abcd1234

lambda destroy

Calls sam delete --no-prompts and drops the local state file. The render S3 bucket is configured with CloudFormation Retain so it survives destruction — empty and delete it via the AWS console / CLI if you want the storage back.

lambda policies role | user | validate

Print or validate the minimum IAM policy the CLI needs to deploy / invoke / destroy the stack.
# Print an inline-policy doc you can attach to an IAM user that runs the CLI.
hyperframes lambda policies user

# Print { TrustRelationship, InlinePolicy } for an IAM role (default: cloudformation principal).
hyperframes lambda policies role --principal=cloudformation

# Validate a checked-in policy still covers the CLI's needs.
hyperframes lambda policies validate ./infra/iam/hyperframes-deploy.json
validate reads the JSON doc and checks the union of its Effect: Allow actions against the CLI’s required action set, expanding s3:* / s3:Get* / * wildcards. Missing actions print to stderr and the command exits non-zero — wire it into CI to catch drift before the next deploy fails. The actions list is deliberately broad (Resource: "*") because CloudFormation creates new function / state-machine / bucket ARNs on every adopter’s first deploy. Adopters with stricter security postures should narrow Resource to the deployed ARNs after the first successful run.

State files

hyperframes lambda keeps per-stack metadata under <cwd>/.hyperframes/lambda-stack-<name>.json so the verbs don’t need to call describe-stacks every time. Commit the file to a repo or .gitignore it depending on your workflow — it contains the bucket name, state-machine ARN, and region, none of which are secrets but all of which are AWS-account-identifying.

hyperframes.json

hyperframes init writes a hyperframes.json file at the root of every new project. hyperframes add reads it to know which registry to pull items from and where to drop them. Edit the file (or delete it to fall back to defaults) to reshape your project layout or point at a custom registry.
{
  "$schema": "https://hyperframes.heygen.com/schema/hyperframes.json",
  "registry": "https://raw.githubusercontent.com/heygen-com/hyperframes/main/registry",
  "paths": {
    "blocks": "compositions",
    "components": "compositions/components",
    "assets": "assets"
  }
}
FieldDescription
registryBase URL of the registry add pulls from. Defaults to the public Hyperframes registry.
paths.blocksWhere block .html files land (relative to project root).
paths.componentsWhere component files land (relative to project root).
paths.assetsWhere referenced asset files (images, fonts) land.
Missing fields are filled with defaults — you only need to specify what you want to override.

Producer

The rendering pipeline the CLI calls under the hood. Use directly for programmatic rendering.

Studio

The editor UI that powers hyperframes preview. Use directly to embed in your own app.

Core

Types, linter, and runtime. Use directly for custom tooling and integrations.

Engine

The capture engine. Use directly for custom frame capture pipelines.