VideoFlowcodeGitHubStudioTry itCoreRenderersReact Video EditorPlaygroundExamplesDocscodeGitHubStudioTry it
Getting started
InstallationQuick startCore conceptsYour first video
Builder
Builder APITime formatsParallel & wait
Layers
TextImageVideoAudioCaptionsShapeGroups
Animation
Animate & keyframesEasing functionsTransitionsEffects
Renderers
Browser rendererServer rendererDOM preview
React Video Editor
QuickstartThemingUploadsCustom panelsHooks & commandsKeyboard shortcuts
API reference
Overview@videoflow/core@videoflow/renderer-browser@videoflow/renderer-server@videoflow/renderer-dom@videoflow/react-video-editor

Custom panels

The editor is built from four top-level panels: Titlebar, Preview, Sidebar, Timeline. Pass a components prop to replace any of them. Your component receives the editor context via hooks — see Hooks & commands.

import { VideoEditor, useEditor } from '@videoflow/react-video-editor';

function MyTitlebar() {
  const video = useEditor((s) => s.video);
  return (
    <header>
      <h1>{video.name}</h1>
      <button>Export</button>
    </header>
  );
}

<VideoEditor
  video={v}
  components={{ Titlebar: MyTitlebar }}
/>

Panel defaults

PanelResponsibilities
TitlebarProject name, undo/redo, Save / Export buttons.
PreviewThe DomRenderer host + transport bar.
SidebarInspector: selection props, media library, effects.
TimelineTracks, playhead, ruler, drag-and-drop.

Partial replacement

Pass only the panels you want to replace — the editor keeps its defaults for the rest.

<VideoEditor video={v} components={{
  Titlebar: MyTitlebar,
  Sidebar: ({ selection }) => selection ? <MyInspector /> : <MyMediaLibrary />,
}} />

Don't swap Preview unless you have to. It hosts the DomRenderer instance every other panel assumes exists. If you just want to add overlays, wrap the default preview inside your replacement.

Titlebar slot props

The Titlebar slot is special — when you replace it, the editor forwards the same handlers it would have given the default titlebar.

PropTypeNotes
onExport() => voidPre-bound — calls your onExport if set, otherwise opens the built-in export modal.
onSave() => voidPre-bound — calls your onSave with the current video.
branding`ReactNodenull
VideoFlow

Open-source toolkit for composing videos from code.

Product

CoreRenderersReact Video EditorPlaygroundStudio

Learn

DocsAPI referenceExamplesvs. Remotionvs. FFmpeg

Project

GitHubLicenseContactTermsPrivacy

From the blog

All posts →Building a "Canva for Video" with the @videoflow/react-video-editorAutomating Social Media Captions: A Developer's Guide to Frame-Perfect SubtitlesBeyond Node: How to Render Cinematic Videos from Python and GoBuilding a Video Rendering API with Node.js and VideoFlow (No FFmpeg Required)Mastering Programmatic Video Transitions: A Developer's GuideProgrammatic Video Storage: Why Your MP4s Should Live as Version-Controlled JSONThe Video Markdown Pattern: Turning Static Content into Automated MP4sZero-Cost Video Rendering: How to Export MP4s Directly in the Browser
© 2026 VideoFlow. Apache-2.0 core.