{
  "slug": "video/cli",
  "title": "Video CLI",
  "description": "Commands and options for the Cuitty Video command-line workflow.",
  "url": "https://cuitty.com/docs/video/cli",
  "markdown_url": "https://cuitty.com/docs/video/cli.md",
  "json_url": "https://cuitty.com/docs/video/cli.json",
  "frontmatter": {
    "title": "Video CLI",
    "description": "Commands and options for the Cuitty Video command-line workflow.",
    "order": 3,
    "section": "Video",
    "updatedAt": "2026-05-24"
  },
  "headings": [
    {
      "depth": 1,
      "slug": "video-cli",
      "text": "Video CLI"
    },
    {
      "depth": 2,
      "slug": "commands",
      "text": "Commands"
    },
    {
      "depth": 2,
      "slug": "render",
      "text": "Render"
    },
    {
      "depth": 2,
      "slug": "preview",
      "text": "Preview"
    },
    {
      "depth": 2,
      "slug": "validate",
      "text": "Validate"
    },
    {
      "depth": 2,
      "slug": "init",
      "text": "Init"
    },
    {
      "depth": 2,
      "slug": "backup",
      "text": "Backup"
    }
  ],
  "body_markdown": "# Video CLI\n\nThe `cuitty-video` CLI validates, previews, renders, and backs up Video compositions.\n\nIn a published install, run the binary directly:\n\n```bash\ncuitty-video --help\n```\n\nInside the local workspace, run the CLI source with Bun:\n\n```bash\ncd ~/Code/cuitty/video\nbun --cwd packages/cli src/index.ts --help\n```\n\n## Commands\n\n| Command | Purpose |\n| --- | --- |\n| `init [directory]` | Create a starter project with a sample composition. |\n| `preview <file>` | Parse a YAML or JSON composition and print timeline details. |\n| `validate <file>` | Validate schema and lint checks without rendering. |\n| `render <file>` | Render a composition to a video file. |\n| `backup <file>` | Back up a rendered video through the Persist integration. |\n| `login` | Authenticate with Cuitty. |\n| `logout` | Remove the local Cuitty auth session. |\n| `whoami` | Print the current auth identity. |\n\n## Render\n\n```bash\ncuitty-video render composition.yaml -o output.mp4 --codec h264 --crf 18\n```\n\nOptions:\n\n| Option | Description |\n| --- | --- |\n| `-o, --output <path>` | Output path. Defaults to `<input>.mp4`. |\n| `--codec <codec>` | `h264`, `h265`, `vp9`, `prores`, or `gif`. |\n| `--crf <number>` | Constant Rate Factor. Lower is higher quality. |\n| `--concurrency <number>` | Parallel frame renders. |\n| `--preset-dir <path>` | Directory containing reusable preset YAML files. |\n| `--dry-run` | Parse and validate only. Do not render. |\n\nUse `--dry-run` in CI checks that should validate authoring changes without requiring FFmpeg.\n\n## Preview\n\n```bash\ncuitty-video preview composition.yaml\ncuitty-video preview composition.yaml --frame 60\ncuitty-video preview composition.yaml --open\n```\n\n`--frame` prints the clips visible at one frame. `--open` starts a local browser preview.\n\n## Validate\n\n```bash\ncuitty-video validate composition.yaml --strict\ncuitty-video validate composition.yaml --preset-dir ./presets --json\n```\n\nValidation checks the DSL shape, timeline bounds, empty layers, overlapping clips, and unknown render types.\n\n## Init\n\n```bash\ncuitty-video init my-video\ncd my-video\ncuitty-video preview composition.yaml\ncuitty-video render composition.yaml\n```\n\nUse `init` for a local starting point, then move reusable presets and data-driven scenes into version control.\n\n## Backup\n\n```bash\ncuitty-video backup output.mp4 -e http://localhost:3456\n```\n\n`backup` is the bridge from rendered artifacts into Cuitty storage workflows.",
  "body_html": "<h1 id=\"video-cli\">Video CLI</h1>\n<p>The <code>cuitty-video</code> CLI validates, previews, renders, and backs up Video compositions.</p>\n<p>In a published install, run the binary directly:</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#79B8FF\"> --help</span></span></code></pre>\n<p>Inside the local workspace, run the CLI source with Bun:</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#79B8FF\">cd</span><span style=\"color:#9ECBFF\"> ~/Code/cuitty/video</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">bun</span><span style=\"color:#79B8FF\"> --cwd</span><span style=\"color:#9ECBFF\"> packages/cli</span><span style=\"color:#9ECBFF\"> src/index.ts</span><span style=\"color:#79B8FF\"> --help</span></span></code></pre>\n<h2 id=\"commands\">Commands</h2>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Command</th><th>Purpose</th></tr></thead><tbody><tr><td><code>init [directory]</code></td><td>Create a starter project with a sample composition.</td></tr><tr><td><code>preview &#x3C;file></code></td><td>Parse a YAML or JSON composition and print timeline details.</td></tr><tr><td><code>validate &#x3C;file></code></td><td>Validate schema and lint checks without rendering.</td></tr><tr><td><code>render &#x3C;file></code></td><td>Render a composition to a video file.</td></tr><tr><td><code>backup &#x3C;file></code></td><td>Back up a rendered video through the Persist integration.</td></tr><tr><td><code>login</code></td><td>Authenticate with Cuitty.</td></tr><tr><td><code>logout</code></td><td>Remove the local Cuitty auth session.</td></tr><tr><td><code>whoami</code></td><td>Print the current auth identity.</td></tr></tbody></table>\n<h2 id=\"render\">Render</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> render</span><span style=\"color:#9ECBFF\"> composition.yaml</span><span style=\"color:#79B8FF\"> -o</span><span style=\"color:#9ECBFF\"> output.mp4</span><span style=\"color:#79B8FF\"> --codec</span><span style=\"color:#9ECBFF\"> h264</span><span style=\"color:#79B8FF\"> --crf</span><span style=\"color:#79B8FF\"> 18</span></span></code></pre>\n<p>Options:</p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Option</th><th>Description</th></tr></thead><tbody><tr><td><code>-o, --output &#x3C;path></code></td><td>Output path. Defaults to <code>&#x3C;input>.mp4</code>.</td></tr><tr><td><code>--codec &#x3C;codec></code></td><td><code>h264</code>, <code>h265</code>, <code>vp9</code>, <code>prores</code>, or <code>gif</code>.</td></tr><tr><td><code>--crf &#x3C;number></code></td><td>Constant Rate Factor. Lower is higher quality.</td></tr><tr><td><code>--concurrency &#x3C;number></code></td><td>Parallel frame renders.</td></tr><tr><td><code>--preset-dir &#x3C;path></code></td><td>Directory containing reusable preset YAML files.</td></tr><tr><td><code>--dry-run</code></td><td>Parse and validate only. Do not render.</td></tr></tbody></table>\n<p>Use <code>--dry-run</code> in CI checks that should validate authoring changes without requiring FFmpeg.</p>\n<h2 id=\"preview\">Preview</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> preview</span><span style=\"color:#9ECBFF\"> composition.yaml</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> preview</span><span style=\"color:#9ECBFF\"> composition.yaml</span><span style=\"color:#79B8FF\"> --frame</span><span style=\"color:#79B8FF\"> 60</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> preview</span><span style=\"color:#9ECBFF\"> composition.yaml</span><span style=\"color:#79B8FF\"> --open</span></span></code></pre>\n<p><code>--frame</code> prints the clips visible at one frame. <code>--open</code> starts a local browser preview.</p>\n<h2 id=\"validate\">Validate</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> validate</span><span style=\"color:#9ECBFF\"> composition.yaml</span><span style=\"color:#79B8FF\"> --strict</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> validate</span><span style=\"color:#9ECBFF\"> composition.yaml</span><span style=\"color:#79B8FF\"> --preset-dir</span><span style=\"color:#9ECBFF\"> ./presets</span><span style=\"color:#79B8FF\"> --json</span></span></code></pre>\n<p>Validation checks the DSL shape, timeline bounds, empty layers, overlapping clips, and unknown render types.</p>\n<h2 id=\"init\">Init</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> init</span><span style=\"color:#9ECBFF\"> my-video</span></span>\n<span class=\"line\"><span style=\"color:#79B8FF\">cd</span><span style=\"color:#9ECBFF\"> my-video</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> preview</span><span style=\"color:#9ECBFF\"> composition.yaml</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> render</span><span style=\"color:#9ECBFF\"> composition.yaml</span></span></code></pre>\n<p>Use <code>init</code> for a local starting point, then move reusable presets and data-driven scenes into version control.</p>\n<h2 id=\"backup\">Backup</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">cuitty-video</span><span style=\"color:#9ECBFF\"> backup</span><span style=\"color:#9ECBFF\"> output.mp4</span><span style=\"color:#79B8FF\"> -e</span><span style=\"color:#9ECBFF\"> http://localhost:3456</span></span></code></pre>\n<p><code>backup</code> is the bridge from rendered artifacts into Cuitty storage workflows.</p>",
  "links_out": []
}