Quickstart

Set up with an agent

Give your agent this prompt:

Set up Odori in this folder and make a launch video from it. The guide is at odori.dev/start.md.

The setup instructions cover product style import, template selection, source installation, and verification. To keep them available across agent sessions, install the quickstart skill:

npx skills add allenzhou101/odori --skill odori-quickstart --yes

The guide inspects your repository for product style, then helps you choose a template and describe the video. You can provide another style source or keep the template defaults. Choose a variation and copy Use template to include that choice in your prompt.

Set up manually

Create a project and install its dependencies:

pnpm create odori@latest product-stories
cd product-stories
pnpm install

Choose a template, then install the example you watched:

pnpm odori add template agent-launch
node videos/agent-launch/select-variation.mjs racing
pnpm odori dev

Studio opens the installed video. Read videos/agent-launch/ADAPTATION.md, edit selected-input.ts, and use schema.ts for content limits. The installed React source remains yours to edit. The default example and its variations share one composition, including its camera moves and timing.

Use pnpm odori catalog templates --json to see stable IDs and available variations. Skip the selector to keep the original example. Reference-based templates retain their sample UI and marks; read their adaptation scope before choosing one for a different product.

pnpm odori test agent-launch
pnpm odori export agent-launch

Author from scratch

For a blank composition, run pnpm odori new launch and install the components you need. The example below is a manual authoring option; template-first setup starts with the finished composition above.

Generated project

  • videos/
    • layout.tsx
    • brands/
      • paper.ts
    • components/
      • title-reveal/
        • title-reveal.tsx
        • title-reveal.preview.tsx
      • end-card/
        • end-card.tsx
        • end-card.preview.tsx
    • launch/
      • video.tsx
  • public/
    • fonts/
  • odori.config.ts
  • package.json

In a standalone video project, Odori creates only the video-facing source. In a Next.js project, app/ and videos/ remain siblings: routes are web entry points; videos are render entry points.

Your first video

Replace videos/launch/video.tsx with two scenes:

videos/launch/video.tsx
import {Scene, Video, defineVideoMetadata} from "odori";
import {EndCard} from "../components/end-card/end-card";
import {TitleReveal} from "../components/title-reveal/title-reveal";
import {productLayout} from "../layout";

export const metadata = defineVideoMetadata({
  title: "Hello, odori",
  layout: productLayout,
  duration: "8s",
});

export default function LaunchVideo() {
  return (
    <Video>
      <Scene duration="5s">
        <TitleReveal title="Introducing our new editor" />
      </Scene>
      <Scene duration="3s">
        <EndCard title="Available today" />
      </Scene>
    </Video>
  );
}

Core commands

CommandPurpose
odori devDiscover project resources and start Studio
odori doctorCheck Node, React, Chrome, FFmpeg, and the generated cache
odori installDownload the pinned Chrome and FFmpeg into the shared cache
odori initAdd videos/ and odori.config.ts to an existing project
odori new <name>Generate a video.tsx entry
odori add component <components>Install editable component source
odori catalog componentsList available components and their temporal contracts
odori listPrint discovered video IDs and formats
odori inspect <id>Show resolved layout, inputs, scenes, and the frozen manifest
odori frame <id> --at 4sRender one deterministic frame to a PNG
odori test [id]Validate contracts and representative frames
odori export <id>Render, mix audio, and encode a distributable file
odori export <id> --format webmmp4, webm, prores, gif, or png
odori jobs listList export jobs, their attempts, and their output
odori diff / odori updateCompare and apply upstream component changes

inspect, frame, test, and export accept --input to supply video inputs. frame and export accept --output <path>. Run odori <command> --help for one command's usage, and odori --version when reporting a bug.

Videos in CI

Add these steps to your continuous integration (CI) workflow after setting up Node.js and pnpm. odori doctor checks render dependencies; odori test --json emits one object per check.

.github/workflows/video.yml
- run: pnpm install --frozen-lockfile
- uses: actions/cache@v4
  with:
    path: ~/.cache/odori
    key: odori-binaries-${{ runner.os }}
- run: pnpm odori install
- run: pnpm odori doctor
- run: pnpm odori test --json
- run: pnpm odori export launch --output out/launch.mp4
- uses: actions/upload-artifact@v4
  with:
    name: launch
    path: out/launch.mp4

:::tip Preview changes in Studio while editing. Export when you need a video file. :::

Continue building

Choose the guide for your next task:

On this page