VideoFlowcodeGitHubTry itCoreRenderersReact Video EditorPlaygroundExamplesDocscodeGitHubTry 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

Easing functions

VideoFlow ships 5 named easings. Set one per project via defaults.easing, or override per-animation with the easing option.

NameShapeWhen to use
stepHold → jumpDiscrete state (text swaps, SFX cues).
linearConstant velocityKen Burns pans, scrolling credits.
easeInStarts slow, acceleratesExiting offscreen.
easeOutFast start, soft stopDefault for most UI motion.
easeInOutSoft start and stopLong transforms.

Compare side-by-side

Each row is a dot sliding across with a different easing:

const $ = new VideoFlow({ width: 512, height: 512, fps: 30, backgroundColor: '#0b0b1f' });

const rows = [
  { label: 'linear',     easing: 'linear',     y: 0.2 },
  { label: 'easeIn',     easing: 'easeIn',     y: 0.35 },
  { label: 'easeOut',    easing: 'easeOut',    y: 0.5 },
  { label: 'easeInOut',  easing: 'easeInOut',  y: 0.65 },
  { label: 'step',       easing: 'step',       y: 0.8 },
];

$.parallel(rows.map((r) => () => {
  const dot = $.addText({ text: '●', fontSize: 8, color: '#ff5a1f', position: [0.35, r.y] });
  $.addText({ text: r.label, fontSize: 4, color: '#888', position: [0.04, r.y], textAlign: 'left' });
  dot.animate({ position: [0.35, r.y] }, { position: [0.9, r.y] }, { duration: '2s', easing: r.easing });
}));
$.wait('1s');
return $;
Compiling00:00

Per-keyframe easing

Each keyframe carries its own easing — it describes the outgoing interpolation from that keyframe to the next. The last keyframe in a sequence is a terminator; its easing is ignored.

Custom easings. Roll your own by pushing raw keyframes instead of using .animate() — set the keyframe's easing to any cubic-bezier or custom function accepted by the renderer.

VideoFlow

Open-source toolkit for composing videos from code.

Product

CoreRenderersReact Video EditorPlayground

Learn

DocsAPI referenceExamplesvs. Remotionvs. FFmpeg

Project

GitHubLicenseContactTermsPrivacy

From the blog

All posts →Generating Multi-Language Video at Scale: The Localization PlaybookBrowser-Side Video Export: Zero-Server Rendering with WebCodecsCinematic GLSL: Stacking Effects for a Retro VHS Look in VideoFlowCinematic Text: Mastering Typography and Text Effects in VideoFlowHow to Generate Personalized Video Ads from a CSV with TypeScriptThe Git-Flow for Video: Why Your MP4s Should Be Diffable JSONHeadless Video Rendering: Why VideoFlow Doesn't Need FFmpegBeyond the Play Button: Building Interactive Video Docs with VideoFlow
© 2026 VideoFlow. Apache-2.0 core.