{
  "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 Store 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.",
  "links_out": []
}