Skip to content
Odori
Esc
navigateopen⌘Jpreview

Build videos
with React

Define videos in code, discover them from the filesystem, preview them in the built-in Studio, and compose them from components you own.

Yourvideos/is a directory

A video.tsx file is all you need to make a video. Layouts, schemas, components, and configuration are optional building blocks.

videos/launch/video.tsx

A video.tsx file is a complete composition. Arrange typed scenes in JSX, then preview it immediately.

import { Scene, Video, defineVideoMetadata } from "odori";
import { CodeProof, EndCard, TitleReveal } from "@/components/video";

export const metadata = defineVideoMetadata({
  id: "launch",
  duration: "18s",
});

export default function LaunchVideo() {
  return (
    <Video>
      <Scene duration="4s">
        <TitleReveal title="Ship the story." />
      </Scene>
      <Scene duration="10s">
        <CodeProof code={source} />
      </Scene>
      <Scene duration="4s">
        <EndCard title="Available today." />
      </Scene>
    </Video>
  );
}

A framework for the whole video lifecycle

Programmatic definitions

A video is typed source: static metadata, JSX scenes, and inputs validated against a schema. Diff it, review it, generate it.

Filesystem routing

A video exists because videos/launch/video.tsx exists. Layouts cascade down the tree, so one file reformats a whole subtree.

Built-in Studio

odori dev serves a workspace that plays every composition and component fixture at any frame. Preview needs no encode.

Components you own

odori add copies real source into your repository, with a declared timing contract odori test enforces.

Build your first video today.

Read the docs