{
  "slug": "video/quickstart",
  "title": "Video quickstart",
  "description": "Create, preview, render, and inspect a Cuitty Video composition.",
  "url": "https://cuitty.com/docs/video/quickstart",
  "markdown_url": "https://cuitty.com/docs/video/quickstart.md",
  "json_url": "https://cuitty.com/docs/video/quickstart.json",
  "frontmatter": {
    "title": "Video quickstart",
    "description": "Create, preview, render, and inspect a Cuitty Video composition.",
    "order": 1,
    "section": "Video",
    "updatedAt": "2026-05-24"
  },
  "headings": [
    {
      "depth": 1,
      "slug": "video-quickstart",
      "text": "Video quickstart"
    },
    {
      "depth": 2,
      "slug": "install-the-workspace",
      "text": "Install the workspace"
    },
    {
      "depth": 2,
      "slug": "create-a-composition",
      "text": "Create a composition"
    },
    {
      "depth": 2,
      "slug": "preview-the-composition",
      "text": "Preview the composition"
    },
    {
      "depth": 2,
      "slug": "render-the-video",
      "text": "Render the video"
    },
    {
      "depth": 2,
      "slug": "next-steps",
      "text": "Next steps"
    }
  ],
  "body_markdown": "# Video quickstart\n\nCuitty Video turns a TypeScript composition or YAML document into a rendered video. The local pipeline compiles the composition into IR, renders frames with Playwright, and encodes the final artifact with FFmpeg.\n\n## Install the workspace\n\nFrom the video repository:\n\n```bash\ncd ~/Code/cuitty/video\nbun install\nbun run typecheck\n```\n\nRendering requires FFmpeg and a Playwright-compatible browser on the machine that runs the renderer.\n\n## Create a composition\n\nCreate `examples/hello.yaml`:\n\n```yaml\ncomposition:\n  id: hello-video\n  width: 1280\n  height: 720\n  fps: 30\n  duration: 5s\n\nlayers:\n  - id: background\n    render:\n      type: gradient\n      colors: [\"#0f172a\", \"#312e81\"]\n      direction: \"135deg\"\n\n  - id: title\n    clips:\n      - id: intro-title\n        start: 0s\n        end: 5s\n        render:\n          type: text\n          text: \"Hello from Cuitty Video\"\n          fontSize: 64\n          color: \"#ffffff\"\n        animate:\n          - property: opacity\n            from: 0\n            to: 1\n            start: 0s\n            duration: 1s\n            easing: cubic-out\n\noutput:\n  codec: h264\n  crf: 18\n```\n\n## Preview the composition\n\nUse the CLI to validate the file and print its timeline summary:\n\n```bash\nbun --cwd packages/cli src/index.ts preview ../../examples/hello.yaml\n```\n\nInspect a single frame:\n\n```bash\nbun --cwd packages/cli src/index.ts preview ../../examples/hello.yaml --frame 60\n```\n\n## Render the video\n\nRender to MP4:\n\n```bash\nmkdir -p output\nbun --cwd packages/cli src/index.ts render ../../examples/hello.yaml -o ../../output/hello.mp4 --codec h264 --crf 18\n```\n\nUse `--dry-run` when you want to parse and validate without invoking Playwright or FFmpeg:\n\n```bash\nbun --cwd packages/cli src/index.ts render ../../examples/hello.yaml --dry-run\n```\n\n## Next steps\n\n- Use the TypeScript SDK when the timeline is generated from code or application data.\n- Use YAML when compositions should live in config, tests, or content workflows.\n- Use [CLI reference](/docs/video/cli) for automation commands.\n- Use [E2E visibility](/docs/video/e2e) to leave inspectable render artifacts.",
  "body_html": "<h1 id=\"video-quickstart\">Video quickstart</h1>\n<p>Cuitty Video turns a TypeScript composition or YAML document into a rendered video. The local pipeline compiles the composition into IR, renders frames with Playwright, and encodes the final artifact with FFmpeg.</p>\n<h2 id=\"install-the-workspace\">Install the workspace</h2>\n<p>From the video repository:</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:#9ECBFF\"> install</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">bun</span><span style=\"color:#9ECBFF\"> run</span><span style=\"color:#9ECBFF\"> typecheck</span></span></code></pre>\n<p>Rendering requires FFmpeg and a Playwright-compatible browser on the machine that runs the renderer.</p>\n<h2 id=\"create-a-composition\">Create a composition</h2>\n<p>Create <code>examples/hello.yaml</code>:</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"yaml\"><code><span class=\"line\"><span style=\"color:#85E89D\">composition</span><span style=\"color:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">  id</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">hello-video</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">  width</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#79B8FF\">1280</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">  height</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#79B8FF\">720</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">  fps</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#79B8FF\">30</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">  duration</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">5s</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#85E89D\">layers</span><span style=\"color:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  - </span><span style=\"color:#85E89D\">id</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">background</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">    render</span><span style=\"color:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">      type</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">gradient</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">      colors</span><span style=\"color:#E1E4E8\">: [</span><span style=\"color:#9ECBFF\">\"#0f172a\"</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#9ECBFF\">\"#312e81\"</span><span style=\"color:#E1E4E8\">]</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">      direction</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">\"135deg\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  - </span><span style=\"color:#85E89D\">id</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">title</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">    clips</span><span style=\"color:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">      - </span><span style=\"color:#85E89D\">id</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">intro-title</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">        start</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">0s</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">        end</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">5s</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">        render</span><span style=\"color:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">          type</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">text</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">          text</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">\"Hello from Cuitty Video\"</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">          fontSize</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#79B8FF\">64</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">          color</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">\"#ffffff\"</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">        animate</span><span style=\"color:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">          - </span><span style=\"color:#85E89D\">property</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">opacity</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">            from</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#79B8FF\">0</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">            to</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#79B8FF\">1</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">            start</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">0s</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">            duration</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">1s</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">            easing</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">cubic-out</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#85E89D\">output</span><span style=\"color:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">  codec</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">h264</span></span>\n<span class=\"line\"><span style=\"color:#85E89D\">  crf</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#79B8FF\">18</span></span></code></pre>\n<h2 id=\"preview-the-composition\">Preview the composition</h2>\n<p>Use the CLI to validate the file and print its timeline summary:</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\">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:#9ECBFF\"> preview</span><span style=\"color:#9ECBFF\"> ../../examples/hello.yaml</span></span></code></pre>\n<p>Inspect a single frame:</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\">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:#9ECBFF\"> preview</span><span style=\"color:#9ECBFF\"> ../../examples/hello.yaml</span><span style=\"color:#79B8FF\"> --frame</span><span style=\"color:#79B8FF\"> 60</span></span></code></pre>\n<h2 id=\"render-the-video\">Render the video</h2>\n<p>Render to MP4:</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\">mkdir</span><span style=\"color:#79B8FF\"> -p</span><span style=\"color:#9ECBFF\"> output</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:#9ECBFF\"> render</span><span style=\"color:#9ECBFF\"> ../../examples/hello.yaml</span><span style=\"color:#79B8FF\"> -o</span><span style=\"color:#9ECBFF\"> ../../output/hello.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>Use <code>--dry-run</code> when you want to parse and validate without invoking Playwright or FFmpeg:</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\">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:#9ECBFF\"> render</span><span style=\"color:#9ECBFF\"> ../../examples/hello.yaml</span><span style=\"color:#79B8FF\"> --dry-run</span></span></code></pre>\n<h2 id=\"next-steps\">Next steps</h2>\n<ul>\n<li>Use the TypeScript SDK when the timeline is generated from code or application data.</li>\n<li>Use YAML when compositions should live in config, tests, or content workflows.</li>\n<li>Use <a href=\"/docs/video/cli\">CLI reference</a> for automation commands.</li>\n<li>Use <a href=\"/docs/video/e2e\">E2E visibility</a> to leave inspectable render artifacts.</li>\n</ul>",
  "links_out": [
    "/docs/video/cli",
    "/docs/video/e2e"
  ]
}