--- title: CLI sidebarTitle: "CLI reference" description: "Create, preview, and render HTML video compositions from the command line." --- This page lists every command and every flag. If you are still deciding which command you need, the [CLI guide](/developers/cli) is the shorter route. The installed version is always the authority. Run `npx hyperframes help ` (or `npx hyperframes --help`) to see exactly what your copy accepts. A mistyped command or flag exits 2 and suggests the closest one: `Did you mean 'hyperframes render'?`. ```bash # No install needed npx hyperframes # Or install once npm install -g hyperframes ``` ## Find your command | You want to | Use | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Start a project | [`init`](#init), [`add`](#add), [`catalog`](#catalog) | | Bring in source material | [`capture`](#capture), [`media-use`](#media-use), [`transcribe`](#transcribe), [`tts`](#tts), [`remove-background`](#remove-background), [`media-treatment`](#media-treatment), [`beats`](#beats), [`audio`](#audio), [`normalize-audio`](#normalize-audio), [`models`](#models) | | Look at it, or share it | [`preview`](#preview), [`present`](#present-and-play), [`play`](#present-and-play), [`publish`](#publish), [`open`](#open-and-catch-up), [`catch-up`](#open-and-catch-up) | | Find problems | [`lint`](#lint), [`check`](#check), [`snapshot`](#snapshot), [`keyframes`](#keyframes), [`compare`](#compare-and-grade-compare), [`grade-compare`](#compare-and-grade-compare) | | Rebuild a video | [`measure`](#measure), [`analyze`](#analyze), [`diff`](#diff) | | Edit from the terminal | [`timeline`](#timeline), [`history`](#history) | | Make a file | [`render`](#render), [`benchmark`](#benchmark) | | Render somewhere else | [`cloud`](#hyperframes-cloud), [`lambda`](#hyperframes-lambda), [`cloudrun`](#hyperframes-cloudrun) | | Fix your setup | [`doctor`](#doctor), [`browser`](#browser), [`upgrade`](#upgrade), [`docs`](#docs), [`info`](#info-and-compositions), [`compositions`](#info-and-compositions), [`clean`](#clean) | | Connect other tools | [`auth`](#hyperframes-auth), [`billing`](#billing), [`skills`](#skills), [`usage`](#usage), [`figma`](#figma-and-events), [`events`](#figma-and-events), [`telemetry`](#telemetry), [`feedback`](#feedback) | `validate`, `inspect`, and `layout` still work but are [deprecated](#deprecated-validate-inspect-and-layout). Use `check` instead. ## What every command shares Read this once and skip the repetition below. **The project directory.** Most commands take it as the first argument and default to the current directory: `npx hyperframes check ./my-video`. A few take it as a flag instead — `add`, `transcribe`, `feedback`, `skills`, `history`, and the `timeline` edit commands use `--dir`. **`--json` for agents and scripts.** Most commands accept it, and the ones that do not reject it with exit 2. The payload is wrapped with a `_meta` field so a script can spot an outdated CLI from any command's output, without a second call: ```json { "name": "my-video", "duration": 10.5, "_meta": { "version": "0.1.4", "latestVersion": "0.1.5", "updateAvailable": true } } ``` The version numbers come from a cache refreshed at most once a day, in a background process, and never under CI or `HYPERFRAMES_NO_UPDATE_CHECK=1`. `--json` never makes a network request of its own. Deprecated commands add `_meta.deprecated: true`. A failure under `--json` always prints one JSON object on stdout, with a machine-readable `code` and, when there is a next step, a `hint`: ```json { "ok": false, "error": { "code": "unknown_flag", "message": "Unknown flag: --out", "hint": "Did you mean --output? Run 'hyperframes render --help' to see its flags." } } ``` Some commands add their own fields next to `error`, such as `findings` from `lint` or `reason` and `fix` from a refused `timeline` edit. **The project `.env`.** The `.env` in the current directory sets only the CLI's own settings: `HEYGEN_API_KEY`, `HYPERFRAMES_API_KEY`, `ELEVENLABS_API_KEY`, `FIGMA_TOKEN`, and the vision keys, models, Vertex settings and timeout, and the telemetry opt-outs `HYPERFRAMES_NO_TELEMETRY` and `DO_NOT_TRACK`. A variable already in your environment wins. Any other key in the file is ignored, and one line on stderr names them. **Flags, not prompts.** A missing required flag fails immediately with a usage example rather than waiting for input. Two commands are interactive on a TTY: `init` prompts for a project name and example unless you pass `--non-interactive`, and `catalog --human-friendly` opens a picker. Nothing else prompts, apart from confirmations you can skip with `--yes` or `--no-confirm`. **Unattended runs never prompt.** A run is unattended when stdin or stdout is not a terminal, under CI, inside a coding agent, or with `HYPERFRAMES_AGENT=1`. There, a command that would ask for confirmation, such as `publish` or `upgrade`, exits 2 instead and names the flag to pass (`--yes`), and spinners print only their final line, on stderr. **Exit codes.** `0` means the command succeeded, `1` means it ran and failed, and `2` means the command line itself is wrong: an unknown command or flag, or a missing or invalid value. **Version notices.** An owned install (npm, bun, pnpm, brew) updates itself quietly in the background and prints one line on the next run: `hyperframes auto-updated to v0.1.5`. It never crosses a major version. Anywhere it cannot install — `npx`, an unknown installer — you get a notice instead: ``` Update available: 0.1.4 → 0.1.5 Run: npx hyperframes@latest ``` Both stay silent in unattended runs, and the background install never starts there. While an install is underway, the notice is not shown. `HYPERFRAMES_NO_UPDATE_CHECK=1` turns off the check, the install, and the notice; `HYPERFRAMES_NO_AUTO_INSTALL=1` turns off only the install. **Skills notice.** When installed HyperFrames skills are out of date or missing, a command ends with one line on stderr naming `npx hyperframes skills update`. It shows at most once a day per project. In an unattended run it shows only when a core skill is missing. `HYPERFRAMES_SKIP_SKILLS=1` turns it off. No notice follows a usage error. ## Create a project ### `init` Scaffold a new composition project from an example. ```bash # Default: centered Inter blank. Non-TTY skips the wizard. npx hyperframes init my-video # Start from a video file npx hyperframes init my-video --video video.mp4 --non-interactive # With the Tailwind browser runtime npx hyperframes init my-video --tailwind ``` | Flag | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `--example, -e` | Example to scaffold. Default is the centered blank. See [Examples](/examples) for the full list. | | `--resolution` | Canvas 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, -v` | Path to a video file (MP4, WebM, MOV) | | `--audio, -a` | Path to an audio file (MP3, WAV, M4A) | | `--tailwind` | Add Tailwind CSS browser-runtime support to the scaffolded HTML | | `--non-interactive` | Never prompt. For agents and CI. | | `--skip-transcribe` | Skip the automatic Whisper transcription | | `--keep-original` | Copy the `--video` file as is instead of converting a non-web codec to H.264 MP4 | | `--model` | Whisper model for that transcription (for example `small.en`, `medium.en`, `large`) | | `--language` | Language code for transcription (`en`, `es`, `ja`, …). Filters out speech in other languages. | | `--skip-skills` | Leave AI coding skills alone: `init` does not install the core set. `HYPERFRAMES_SKIP_SKILLS=1` does the same. Pass `--video` or `--audio` and the CLI transcribes the audio with Whisper and patches the captions into the composition for you. `--skip-transcribe` turns that off. `--tailwind` injects the pinned Tailwind v4 browser runtime and exposes a `window.__tailwindReady` promise that renders wait on before capturing frame 0. The `/hyperframes-cli` skill's `references/init-and-scaffold.md` (Tailwind) covers editing these projects, so agents follow v4 CSS-first patterns instead of v3 `tailwind.config.js` patterns. The browser runtime is meant for scaffolded projects and quick iteration — for offline or locked-down production renders, compile Tailwind to CSS and link the stylesheet. Every new project gets an `AGENTS.md` and an identical `CLAUDE.md`: they tell a coding agent what HyperFrames is and which commands preview, check, snapshot and render the video. After scaffolding, `init` checks and installs the core AI skills from the current GitHub source. See [`skills`](#skills). ### `add` Install one item from the registry into a project you already have. [`init`](#init) scaffolds whole projects; `add` drops in a **block** (a sub-composition scene) or a **component** (an effect or snippet). ```bash npx hyperframes add claude-code-window # a block npx hyperframes add shader-wipe # a component npx hyperframes add captions # every block with this tag npx hyperframes add shader-wipe --dir ./my-video npx hyperframes add shader-wipe --no-clipboard --json # headless / CI ``` The positional name is a registry item, or a tag — a tag installs every block carrying it. `--dir` picks the project directory, `--json` prints the written files and paste snippet, and `--no-clipboard` skips the clipboard copy for CI. If any block in a tag fails to install, `add` keeps the successful installs and exits with code 1. With `--json`, `ok` is `false` and `errors` lists each failed block's `name` and `error`; `installed` lists the blocks that succeeded. Every install produces files plus a **paste snippet**: the `