VideoFlowcodeGitHubStudioTry itCoreRenderersReact Video EditorPlaygroundExamplesDocscodeGitHubStudioTry it
Example

Captions

Time-synced captions burned into the frame.

#captions
// Time-coded captions via addCaptions(typographyProps, { captions: [...] }).
const $ = new VideoFlow({
  name: 'Captions Demo',
  width: 1920,
  height: 1080,
  fps: 30,
  backgroundColor: '#0d0d1a',
});

$.addCaptions(
  // Shared typography across every line.
  {
    fontSize: 3.5,
    fontWeight: 700,
    color: '#ffffff',
    position: [0.5, 0.82],
    textAlign: 'center',
  },
  // startTime/endTime are absolute seconds.
  {
    captions: [
      { caption: 'Welcome to VideoFlow.',   startTime: 0,   endTime: 1.5 },
      { caption: 'Build videos from code.', startTime: 1.5, endTime: 3   },
      { caption: 'No editor required.',     startTime: 3,   endTime: 5 },
      { caption: 'Just write JavaScript.',  startTime: 5, endTime: 7.5  },
    ],
    maxCharsPerLine: 35,
    maxLines: 2,
  },
);

// addCaptions doesn't advance the flow pointer; wait covers the full track.
$.wait('7.5s');

return $;
Compiling00:00
play_arrowOpen in playgroundcodeSource on GitHub← All examples
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.