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-markupDelaying, trimming
In the component that renders these items, get const {fps} = useVideoConfig().
Use this fps for seconds-to-frames expressions on the JSX node, rather than
a fixed FPS constant.
The following timing props are supported by built-in components (<AbsoluteFill>, <Interactive.*>, <Img>, <AnimatedImage>, <CanvasImage>, <HtmlInCanvas>, <Solid>, <Sequence>, <Track> from remotion, <Video> and <Audio> from @remotion/media, <Gif>, and more).
Custom components made with Interactive.create() accept them too, see Prefer interactive components with their own timelines (remotion-interactivity skill).
from
When the item starts appearing in the timeline.
Its children start at frame 0 when it appears.
trimBefore
Sets the first frame of the item's own timeline:
durationInFrames
How many frames of the item's own timeline are shown, starting at trimBefore.
Use it to end media early instead of cutting the file:
playbackRate
Changes the speed of the item.
Children calling useCurrentFrame() advance playbackRate frames per frame of the parent.
The item occupies durationInFrames / playbackRate frames in its parent timeline.
loop
Repeats the range selected by trimBefore and durationInFrames until the parent ends.
<Video>, <Audio>, <Gif> and <AnimatedImage> may omit durationInFrames; the media's own duration after trimBefore then defines the loop range.
Other items need durationInFrames to define the loop range:
Put timing and volume directly on <Audio>.
<Img>, <CanvasImage>, <Solid> and shapes do not support loop because their output does not change over time.
Order of operations
frompositions the item in its parent timeline.trimBeforesets the first frame of the item's own timeline.durationInFramesselects the range of the item's own timeline.playbackRatestretches or compresses the selected range.looprepeats the selected range until the parent ends.
Children calling useCurrentFrame() get trimBefore + (frame - from) * playbackRate.
See Timing and trimming for more details.
Fallback
If a component does not support these props, wrap it in <Sequence> from remotion, which has them.
layout="absolute-fill"makes the Sequence behave like AbsoluteFilllayout="none"is "headless" mode, no wrapper element is used.