remotion-markup
Structure Remotion scenes with markup patterns for layout, typography, and reusable video UI.
Install
npx skills add https://github.com/remotion-dev/skills --skill remotion-markup- metadata
- tags: effects, visual-effects, webgl, canvas, video, create-effect
Read this guidance when adding an effect to a component that supports effects,
or when considering canvas post-processing or a reusable custom effect.
Docs: https://www.remotion.dev/docs/effects Custom effect docs: https://www.remotion.dev/docs/create-effect
For exposure, white balance, Levels, Curves, and LUTs, read color-correction.md [blocked].
Usage
Install the package that provides the chosen effect:
Effects are functions passed to the effects prop of supported components.
These components accept effects directly:
Ordinary HTML elements, <Interactive.*> DOM wrappers, <AbsoluteFill>, and
<Sequence> do not accept effects directly. To apply effects to their content,
wrap them in <HtmlInCanvas> and put the effects prop on the wrapper.
For example, apply an effect directly to a video:
Use the effect docs for exact props and imports. Most @remotion/effects imports use @remotion/effects/<effect-slug>; uvTranslate() and xyTranslate() use @remotion/effects/translate.
Most effects use WebGL2; cylinder(), sphere(), and pageTurn() use WebGPU. During renders, enable WebGL and WebGPU with:
Available effects
Built-in effects from @remotion/effects:
- Color and tone:
brightness(),colorCorrection(),colorKey(),contrast(),curves(),duotone(),exposure(),grayscale(),hue(),invert(),levels(),linearGradient(),linearGradientTint(),lut(),saturation(),shadowsHighlights(),thermalVision(),tint(),vibrance(),whiteBalance(). - Blur and trails:
blur(),lightTrail(),linearProgressiveBlur(),radialProgressiveBlur(),regionBlur(),zoomBlur(). - Lighting:
dropShadow(),longShadows(),glow(),lightLeak(),shine(),starburst(),vignette(). - Distortion and transforms:
barrelDistortion(),chromaticAberration(),cornerPin(),fisheye(),mirror(),noiseDisplacement(),scale(),skew(),tile(),uvTranslate(),wave(),xyTranslate(). - Textures and patterns:
burlap(),checkerboard(),contourLines(),dotGrid(),emboss(),flannel(),gridlines(),halftone(),halftoneLinearGradient(),lines(),liquidContours(),noise(),paper(),pattern(),rings(),scanlines(),speckle(),tvSignalOff(),waves(),whiteNoise(),zigzag(). - Edges:
outline(),roughenEdges(),shrinkwrap(),tear(). - Pixelation and transitions:
evolve(),linearProgressivePixelate(),pixelate(),pixelDissolve(),radialProgressivePixelate(),venetianBlinds().
Example:
Custom effects
Use createEffect() from remotion when the user wants a reusable effect factory that works in the same effects array as @remotion/effects.
Prefer a custom effect over <HtmlInCanvas onPaint> when the transformation should be reusable, parameterized, editable in Studio, or stackable with other effects.
For quick project-specific effects, keep the effect next to the composition, for example src/effects/palette-map.ts. For library effects intended for @remotion/effects, follow the repository's add-effect skill instead.
createEffect() expects:
type: stable reverse-DNS identifier, for examplecom.example.paletteMap.label: Studio label, commonlypaletteMap().documentationLink: URL ornull.backend:"2d","webgl2"or"webgpu".calculateKey(params): stable string containing every resolved parameter that changes output.setup(target): create reusable backend state, or returnnull.apply({source, target, width, height, params, state, flipSourceY}): draw the transformed result intotarget.cleanup(state): free resources created bysetup().schema: anInteractivitySchemafor Studio controls.disabledis added automatically.validateParams(params): throw on missing or invalid values.
Use backend: "2d" for simple pixel, filter, drawImage, or image-data effects. Use WebGL2 only when shader math or GPU performance is needed; during renders, enable WebGL as shown above.
For a WebGL2 effect, compile/link shaders in setup(), keep the program, fullscreen quad, texture, and uniform locations in state, upload source in apply(), and free GPU resources in cleanup(). Minimal shape:
For a complete 2D and WebGL2 pair, see packages/example/src/EffectsTestbed/sample-posterize-2d.ts and packages/example/src/EffectsTestbed/sample-rgb-shift-webgl.ts.
Use the returned factory in an effects array:
When generating a custom effect, also:
- Include
disabled?: booleanonly through the returned factory; do not add it to the custom params type or schema. - Validate required parameters at factory-call time with
validateParams. - Include all defaults in both
schemaand theresolve()helper. - Reset mutable 2D context state such as
filter,globalAlpha, transforms, and compositing after drawing. - Preserve alpha unless the requested effect intentionally changes transparency.