dsh-remotion 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +3 -3
- package/README.md +3 -3
- package/package.json +4 -3
- package/scripts/.skill-port-meta.json +50 -0
- package/scripts/sync-skills.mjs +65 -0
- package/skills/remotion-best-practices/SKILL.md +18 -17
- package/skills/remotion-best-practices/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-captions/{SKILL.md → REFERENCE.md} +1 -1
- package/skills/remotion-best-practices/remotion-captions/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-captions/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-create/{SKILL.md → REFERENCE.md} +26 -9
- package/skills/remotion-best-practices/remotion-create/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-create/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-docs/{SKILL.md → REFERENCE.md} +2 -2
- package/skills/remotion-best-practices/remotion-docs/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-docs/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-interactivity/{SKILL.md → REFERENCE.md} +69 -1
- package/skills/remotion-best-practices/remotion-interactivity/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-interactivity/assets/remotion-icon.svg +4 -0
- package/skills/{remotion-markup/remotion-maps/SKILL.md → remotion-best-practices/remotion-maps/REFERENCE.md} +1 -1
- package/skills/remotion-best-practices/remotion-maps/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-maps/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maplibre/TECHNIQUE.md +21 -2
- package/skills/remotion-best-practices/remotion-maps/techniques/static-map/TECHNIQUE.md +1 -1
- package/skills/remotion-best-practices/remotion-markup/{SKILL.md → REFERENCE.md} +19 -26
- package/skills/remotion-best-practices/remotion-markup/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-markup/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-markup/audio.md +3 -5
- package/skills/remotion-best-practices/remotion-markup/compositions.md +11 -5
- package/skills/remotion-best-practices/remotion-markup/connected-compositions.md +79 -0
- package/skills/remotion-best-practices/remotion-markup/cropping.md +1 -1
- package/skills/remotion-best-practices/remotion-markup/embedding-videos.md +3 -5
- package/skills/remotion-best-practices/remotion-markup/motion-blur.md +60 -0
- package/skills/remotion-best-practices/remotion-markup/multi-scene-video.md +64 -64
- package/skills/remotion-best-practices/{remotion-maps/SKILL.md → remotion-markup/remotion-maps/REFERENCE.md} +1 -1
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/TECHNIQUE.md +21 -2
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/static-map/TECHNIQUE.md +1 -1
- package/skills/remotion-best-practices/remotion-markup/text-highlights.md +1 -1
- package/skills/remotion-best-practices/remotion-multimedia/{SKILL.md → REFERENCE.md} +1 -1
- package/skills/remotion-best-practices/remotion-multimedia/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-multimedia/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-render/{SKILL.md → REFERENCE.md} +9 -1
- package/skills/remotion-best-practices/remotion-render/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-render/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-saas/{SKILL.md → REFERENCE.md} +1 -1
- package/skills/remotion-best-practices/remotion-saas/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-saas/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-saas/framework.md +1 -3
- package/skills/remotion-best-practices/remotion-studio/{SKILL.md → REFERENCE.md} +1 -1
- package/skills/remotion-best-practices/remotion-studio/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-studio/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/remotion-upgrade/{SKILL.md → REFERENCE.md} +3 -3
- package/skills/remotion-best-practices/remotion-upgrade/agents/openai.yaml +2 -2
- package/skills/remotion-best-practices/remotion-upgrade/assets/remotion-icon.svg +4 -0
- package/skills/remotion-captions/SKILL.md +6 -5
- package/skills/remotion-captions/agents/openai.yaml +2 -2
- package/skills/remotion-captions/assets/remotion-icon.svg +4 -0
- package/skills/remotion-create/SKILL.md +32 -14
- package/skills/remotion-create/agents/openai.yaml +2 -2
- package/skills/remotion-create/assets/remotion-icon.svg +4 -0
- package/skills/remotion-docs/SKILL.md +7 -6
- package/skills/remotion-docs/agents/openai.yaml +2 -2
- package/skills/remotion-docs/assets/remotion-icon.svg +4 -0
- package/skills/remotion-interactivity/SKILL.md +75 -6
- package/skills/remotion-interactivity/agents/openai.yaml +2 -2
- package/skills/remotion-interactivity/assets/remotion-icon.svg +4 -0
- package/skills/remotion-maps/SKILL.md +6 -5
- package/skills/remotion-maps/agents/openai.yaml +2 -2
- package/skills/remotion-maps/assets/remotion-icon.svg +4 -0
- package/skills/remotion-maps/techniques/maplibre/TECHNIQUE.md +21 -2
- package/skills/remotion-maps/techniques/static-map/TECHNIQUE.md +1 -1
- package/skills/remotion-markup/SKILL.md +24 -30
- package/skills/remotion-markup/agents/openai.yaml +2 -2
- package/skills/remotion-markup/assets/remotion-icon.svg +4 -0
- package/skills/remotion-markup/audio.md +3 -5
- package/skills/remotion-markup/calculate-metadata.md +2 -2
- package/skills/remotion-markup/compositions.md +11 -5
- package/skills/remotion-markup/connected-compositions.md +79 -0
- package/skills/remotion-markup/cropping.md +1 -1
- package/skills/remotion-markup/embedding-videos.md +3 -5
- package/skills/remotion-markup/motion-blur.md +60 -0
- package/skills/remotion-markup/multi-scene-video.md +64 -64
- package/skills/{remotion-best-practices/remotion-markup/remotion-maps/SKILL.md → remotion-markup/remotion-maps/REFERENCE.md} +1 -1
- package/skills/remotion-markup/remotion-maps/agents/openai.yaml +2 -2
- package/skills/remotion-markup/remotion-maps/assets/remotion-icon.svg +4 -0
- package/skills/remotion-markup/remotion-maps/techniques/maplibre/TECHNIQUE.md +21 -2
- package/skills/remotion-markup/remotion-maps/techniques/static-map/TECHNIQUE.md +1 -1
- package/skills/remotion-markup/text-highlights.md +1 -1
- package/skills/remotion-markup/voiceover.md +1 -1
- package/skills/remotion-multimedia/SKILL.md +6 -5
- package/skills/remotion-multimedia/agents/openai.yaml +2 -2
- package/skills/remotion-multimedia/assets/remotion-icon.svg +4 -0
- package/skills/remotion-render/SKILL.md +14 -5
- package/skills/remotion-render/agents/openai.yaml +2 -2
- package/skills/remotion-render/assets/remotion-icon.svg +4 -0
- package/skills/remotion-saas/SKILL.md +6 -5
- package/skills/remotion-saas/agents/openai.yaml +2 -2
- package/skills/remotion-saas/assets/remotion-icon.svg +4 -0
- package/skills/remotion-saas/framework.md +1 -3
- package/skills/remotion-studio/SKILL.md +6 -5
- package/skills/remotion-studio/agents/openai.yaml +2 -2
- package/skills/remotion-studio/assets/remotion-icon.svg +4 -0
- package/skills/remotion-upgrade/SKILL.md +8 -7
- package/skills/remotion-upgrade/agents/openai.yaml +2 -2
- package/skills/remotion-upgrade/assets/remotion-icon.svg +4 -0
- package/skills/remotion-best-practices/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-captions/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-create/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-docs/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-interactivity/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-maps/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-markup/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-multimedia/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-render/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-saas/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-studio/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-upgrade/assets/remotion-icon.png +0 -0
- package/skills/remotion-captions/assets/remotion-icon.png +0 -0
- package/skills/remotion-create/assets/remotion-icon.png +0 -0
- package/skills/remotion-docs/assets/remotion-icon.png +0 -0
- package/skills/remotion-interactivity/assets/remotion-icon.png +0 -0
- package/skills/remotion-maps/assets/remotion-icon.png +0 -0
- package/skills/remotion-markup/assets/remotion-icon.png +0 -0
- package/skills/remotion-markup/remotion-maps/assets/remotion-icon.png +0 -0
- package/skills/remotion-multimedia/assets/remotion-icon.png +0 -0
- package/skills/remotion-render/assets/remotion-icon.png +0 -0
- package/skills/remotion-saas/assets/remotion-icon.png +0 -0
- package/skills/remotion-studio/assets/remotion-icon.png +0 -0
- package/skills/remotion-upgrade/assets/remotion-icon.png +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: '/remotion-markup'
|
|
3
3
|
short_description: 'Apply Remotion animation and effects practices'
|
|
4
|
-
icon_small: './assets/remotion-icon.
|
|
5
|
-
icon_large: './assets/remotion-icon.
|
|
4
|
+
icon_small: './assets/remotion-icon.svg'
|
|
5
|
+
icon_large: './assets/remotion-icon.svg'
|
|
6
6
|
brand_color: '#0B84F3'
|
|
7
7
|
default_prompt: '$remotion-markup: Apply best Remotion Practices to MyComp.tsx.'
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="100" height="100" viewBox="20 30 363 363" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<title>Remotion</title>
|
|
3
|
+
<path d="M148.332 92.9015C143.307 93.1742 139.259 93.9713 135.179 95.5236C133.144 96.2893 129.809 97.957 127.973 99.1108C120.295 103.925 114.443 111.162 111.391 119.584C110.782 121.252 109.136 126.57 108.076 130.23C101.018 154.7 97.0112 181.456 96.1511 209.776C96.0148 214.286 96.0148 225.026 96.1511 229.463C96.728 248.237 98.5216 265.187 101.773 282.472C103.095 289.468 105.213 298.866 106.44 303.135C108.947 311.809 114.065 319.193 121.344 324.605C126.221 328.234 131.759 330.668 137.895 331.863C140.853 332.44 144.755 332.702 147.629 332.514C151.604 332.251 159.491 331.192 165.9 330.049C194.786 324.899 221.469 315.679 245.666 302.485C260.99 294.125 274.09 285.074 286.729 274.092C299.326 263.163 310.066 251.405 319.516 238.21C321.708 235.158 322.81 233.375 323.911 231.131C326.743 225.341 328.075 219.583 328.064 213.143C328.064 207.143 326.932 201.815 324.488 196.361C323.313 193.728 322.191 191.84 319.674 188.253C310.402 175.048 300.112 163.542 287.568 152.361C268.122 135.034 245.026 120.822 219.235 110.302C213.644 108.026 208.138 106.022 201.509 103.851C187.475 99.2681 170.106 95.2929 155.411 93.3105C153.104 92.9959 149.968 92.8176 148.332 92.9015Z" fill="#0B84F3"/>
|
|
4
|
+
</svg>
|
|
@@ -58,18 +58,16 @@ The audio still starts playing at the beginning of the composition - only the sp
|
|
|
58
58
|
|
|
59
59
|
## Delaying
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
Set `from` directly on `<Audio>` to delay when it starts:
|
|
62
62
|
|
|
63
63
|
```tsx
|
|
64
|
-
import {
|
|
64
|
+
import { staticFile, useVideoConfig } from "remotion";
|
|
65
65
|
import { Audio } from "@remotion/media";
|
|
66
66
|
|
|
67
67
|
const { fps } = useVideoConfig();
|
|
68
68
|
|
|
69
69
|
return (
|
|
70
|
-
<
|
|
71
|
-
<Audio src={staticFile("audio.mp3")} />
|
|
72
|
-
</Sequence>
|
|
70
|
+
<Audio from={fps} src={staticFile("audio.mp3")} />
|
|
73
71
|
);
|
|
74
72
|
```
|
|
75
73
|
|
|
@@ -26,7 +26,7 @@ For static dimensions, duration, FPS, and initial props, inline the values on `<
|
|
|
26
26
|
|
|
27
27
|
## Setting duration based on a video
|
|
28
28
|
|
|
29
|
-
Use the
|
|
29
|
+
Use the `getVideoDuration` and `getVideoDimensions` skills to get the video duration and dimensions:
|
|
30
30
|
|
|
31
31
|
```tsx
|
|
32
32
|
import { CalculateMetadataFunction } from "remotion";
|
|
@@ -45,7 +45,7 @@ const calculateMetadata: CalculateMetadataFunction<Props> = async ({
|
|
|
45
45
|
|
|
46
46
|
## Matching dimensions of a video
|
|
47
47
|
|
|
48
|
-
Use the
|
|
48
|
+
Use the `getVideoDimensions` skill to get the video dimensions:
|
|
49
49
|
|
|
50
50
|
```tsx
|
|
51
51
|
import { CalculateMetadataFunction } from "remotion";
|
|
@@ -106,12 +106,18 @@ Use [`calculateMetadata`](./calculate-metadata.md) to make dimensions, duration,
|
|
|
106
106
|
|
|
107
107
|
## Nesting compositions within another
|
|
108
108
|
|
|
109
|
-
To
|
|
109
|
+
To render a composition's component inside another composition, use `<Sequence>` with `width` and `height` when the nested content needs its own dimensions.
|
|
110
|
+
|
|
111
|
+
When the nested scene should have its own editable Studio timeline, use the [connected composition structure](connected-compositions.md).
|
|
110
112
|
|
|
111
113
|
```tsx
|
|
112
|
-
|
|
113
|
-
<
|
|
114
|
-
|
|
114
|
+
<>
|
|
115
|
+
<Video src="https://remotion.media/video.mp4" />
|
|
116
|
+
<Sequence
|
|
117
|
+
width={1920}
|
|
118
|
+
height={1080}
|
|
119
|
+
>
|
|
120
|
+
<OverlayComponent />
|
|
115
121
|
</Sequence>
|
|
116
|
-
|
|
122
|
+
</>
|
|
117
123
|
```
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Connected compositions
|
|
2
|
+
|
|
3
|
+
Using the connected compositions pattern, a group of layers can get their own Studio timeline, like a precomposition in After Effects.
|
|
4
|
+
|
|
5
|
+
Use connected composition when a section has its own layers or timing, will be reused, or would be easier to edit and preview on its own.
|
|
6
|
+
|
|
7
|
+
1. Put the scene's markup in a named React component. Multiple internal layers and sequences can live inside it.
|
|
8
|
+
2. Render exactly one direct instance of that component inside a `<Sequence>`, `<Series.Sequence>`, or `<TransitionSeries.Sequence>` in the parent.
|
|
9
|
+
3. Register the **same component reference** with `<Composition component={...}>` in the root. Give it a unique `id` and the dimensions, fps, and natural duration needed to preview the scene on its own. A `<Folder>` can keep scene compositions together.
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
// MyVideo.tsx
|
|
13
|
+
import {Series} from 'remotion';
|
|
14
|
+
import {OpeningScene} from './OpeningScene';
|
|
15
|
+
import {FeatureScene} from './FeatureScene';
|
|
16
|
+
|
|
17
|
+
export const MyVideo = () => (
|
|
18
|
+
<Series>
|
|
19
|
+
<Series.Sequence
|
|
20
|
+
name="Opening"
|
|
21
|
+
durationInFrames={90}
|
|
22
|
+
>
|
|
23
|
+
<OpeningScene />
|
|
24
|
+
</Series.Sequence>
|
|
25
|
+
<Series.Sequence
|
|
26
|
+
name="Feature"
|
|
27
|
+
durationInFrames={120}
|
|
28
|
+
>
|
|
29
|
+
<FeatureScene />
|
|
30
|
+
</Series.Sequence>
|
|
31
|
+
</Series>
|
|
32
|
+
);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
// Root.tsx
|
|
37
|
+
import {Composition, Folder} from 'remotion';
|
|
38
|
+
import {MyVideo} from './MyVideo';
|
|
39
|
+
import {OpeningScene} from './OpeningScene';
|
|
40
|
+
import {FeatureScene} from './FeatureScene';
|
|
41
|
+
|
|
42
|
+
export const RemotionRoot = () => (
|
|
43
|
+
<>
|
|
44
|
+
<Folder name="MyVideo-Scenes">
|
|
45
|
+
<Composition
|
|
46
|
+
id="Opening"
|
|
47
|
+
component={OpeningScene}
|
|
48
|
+
width={1920}
|
|
49
|
+
height={1080}
|
|
50
|
+
fps={30}
|
|
51
|
+
durationInFrames={90}
|
|
52
|
+
/>
|
|
53
|
+
<Composition
|
|
54
|
+
id="Feature"
|
|
55
|
+
component={FeatureScene}
|
|
56
|
+
width={1920}
|
|
57
|
+
height={1080}
|
|
58
|
+
fps={30}
|
|
59
|
+
durationInFrames={120}
|
|
60
|
+
/>
|
|
61
|
+
</Folder>
|
|
62
|
+
<Composition
|
|
63
|
+
id="MyVideo"
|
|
64
|
+
component={MyVideo}
|
|
65
|
+
width={1920}
|
|
66
|
+
height={1080}
|
|
67
|
+
fps={30}
|
|
68
|
+
durationInFrames={210}
|
|
69
|
+
/>
|
|
70
|
+
</>
|
|
71
|
+
);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Studio replaces the layers with a reference to the connected composition in the timeline.
|
|
75
|
+
Double-clicking a sequence with one connected composition opens it at the corresponding frame.
|
|
76
|
+
Editing the shared component changes both views.
|
|
77
|
+
|
|
78
|
+
If the scene takes props, pass the intended values in the parent and use matching `defaultProps` on its standalone registration; registration does not automatically copy the parent's props.
|
|
79
|
+
Keep scene and parent fps and dimensions aligned unless their difference is intentional.
|
|
@@ -18,7 +18,7 @@ The following components support `crop*` props:
|
|
|
18
18
|
Crop values are ratios between `0` and `1`.
|
|
19
19
|
A value of `0` applies no crop on that edge.
|
|
20
20
|
A value of `1` is a full crop.
|
|
21
|
-
Keep
|
|
21
|
+
Keep Interactivity Best Practices also for cropping, to keep it editable and keyframable.
|
|
22
22
|
|
|
23
23
|
```tsx
|
|
24
24
|
<CanvasImage
|
|
@@ -54,18 +54,16 @@ return (
|
|
|
54
54
|
|
|
55
55
|
## Delaying
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
Set `from` directly on `<Video>` to delay when it appears:
|
|
58
58
|
|
|
59
59
|
```tsx
|
|
60
|
-
import {
|
|
60
|
+
import { staticFile, useVideoConfig } from "remotion";
|
|
61
61
|
import { Video } from "@remotion/media";
|
|
62
62
|
|
|
63
63
|
const { fps } = useVideoConfig();
|
|
64
64
|
|
|
65
65
|
return (
|
|
66
|
-
<
|
|
67
|
-
<Video src={staticFile("video.mp4")} />
|
|
68
|
-
</Sequence>
|
|
66
|
+
<Video from={fps} src={staticFile("video.mp4")} />
|
|
69
67
|
);
|
|
70
68
|
```
|
|
71
69
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Motion blur
|
|
2
|
+
|
|
3
|
+
Use `@remotion/motion-blur` for frame-driven motion blur.
|
|
4
|
+
Install it with `npx remotion add @remotion/motion-blur`.
|
|
5
|
+
|
|
6
|
+
`<HtmlInCanvasMotionBlur>` is the state of the art in Remotion for blurring animated HTML. It captures the content at fractional frames and averages its pixels in a canvas.
|
|
7
|
+
|
|
8
|
+
## `<HtmlInCanvasMotionBlur>`
|
|
9
|
+
|
|
10
|
+
Available from Remotion 4.0.529.
|
|
11
|
+
Supply the canvas `width` and `height`, usually from `useVideoConfig()`.
|
|
12
|
+
`shutterAngle` defaults to `180` and accepts `0` to `360`.
|
|
13
|
+
`0` disables blur. `samples` defaults to `8` and must be an integer from `1` to `64`. More samples can smooth the blur but increase preview and render cost.
|
|
14
|
+
|
|
15
|
+
Call `useCurrentFrame()` inside the child component so each sample receives its own frame.
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import {
|
|
19
|
+
HtmlInCanvasMotionBlur,
|
|
20
|
+
} from '@remotion/motion-blur';
|
|
21
|
+
import {useCurrentFrame, useVideoConfig} from 'remotion';
|
|
22
|
+
|
|
23
|
+
const MovingBox = () => {
|
|
24
|
+
const frame = useCurrentFrame();
|
|
25
|
+
return (
|
|
26
|
+
<div
|
|
27
|
+
style={{
|
|
28
|
+
position: 'absolute',
|
|
29
|
+
left: frame * 10,
|
|
30
|
+
top: 200,
|
|
31
|
+
width: 120,
|
|
32
|
+
height: 120,
|
|
33
|
+
backgroundColor: '#ff6b6b',
|
|
34
|
+
}}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const HtmlInCanvasBlur = () => {
|
|
40
|
+
const {width, height} = useVideoConfig();
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<HtmlInCanvasMotionBlur
|
|
44
|
+
width={width}
|
|
45
|
+
height={height}
|
|
46
|
+
samples={8}
|
|
47
|
+
shutterAngle={180}
|
|
48
|
+
>
|
|
49
|
+
<MovingBox />
|
|
50
|
+
</HtmlInCanvasMotionBlur>
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
For live preview, enable HTML-in-canvas in Chrome 149 or later with `chrome://flags/#canvas-draw-element`.
|
|
56
|
+
No configuration for rendering is necessary.
|
|
57
|
+
|
|
58
|
+
Do not nest `<HtmlInCanvas>` or `<HtmlInCanvasMotionBlur>` components; nested HTML-in-canvas is unsupported.
|
|
59
|
+
|
|
60
|
+
If HTML-in-canvas is unavailable, see the [motion blur guide](https://www.remotion.dev/docs/motion-blur-guide) for other options. See the [`<HtmlInCanvasMotionBlur>` reference](https://www.remotion.dev/docs/motion-blur/html-in-canvas-motion-blur) for API details.
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
|
|
2
|
-
Create a new folder and put each scene in a separate file.
|
|
1
|
+
# Multi-scene videos
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export const SceneA: React.FC = () => {
|
|
7
|
-
return // ...
|
|
8
|
-
}
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
```tsx
|
|
12
|
-
// SceneB.tsx
|
|
13
|
-
export const SceneB: React.FC = () => {
|
|
14
|
-
return // ...
|
|
15
|
-
}
|
|
16
|
-
```
|
|
3
|
+
Put each substantial scene in its own component and file.
|
|
4
|
+
Register those components as [connected compositions](connected-compositions.md) so each scene has an editable Studio timeline.
|
|
17
5
|
|
|
18
|
-
|
|
6
|
+
Use `<TransitionSeries>` when the scenes may have transitions.
|
|
7
|
+
Install `@remotion/transitions` if it is missing.
|
|
8
|
+
Give each sequence an inline `durationInFrames` value so Studio can edit its timing.
|
|
19
9
|
|
|
20
|
-
|
|
21
|
-
npx remotion add @remotion/transitions
|
|
22
|
-
```
|
|
10
|
+
Example:
|
|
23
11
|
|
|
24
|
-
// MyVideo.tsx
|
|
25
12
|
```tsx
|
|
13
|
+
// MyVideo.tsx
|
|
26
14
|
import {TransitionSeries} from '@remotion/transitions';
|
|
15
|
+
import {OpeningScene} from './OpeningScene';
|
|
16
|
+
import {FeatureScene} from './FeatureScene';
|
|
27
17
|
|
|
28
|
-
const MyVideo
|
|
29
|
-
|
|
30
|
-
<TransitionSeries
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
<
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
18
|
+
export const MyVideo = () => (
|
|
19
|
+
<TransitionSeries>
|
|
20
|
+
<TransitionSeries.Sequence
|
|
21
|
+
name="Opening"
|
|
22
|
+
durationInFrames={90}
|
|
23
|
+
>
|
|
24
|
+
<OpeningScene />
|
|
25
|
+
</TransitionSeries.Sequence>
|
|
26
|
+
<TransitionSeries.Sequence
|
|
27
|
+
name="Feature"
|
|
28
|
+
durationInFrames={120}
|
|
29
|
+
>
|
|
30
|
+
<FeatureScene />
|
|
31
|
+
</TransitionSeries.Sequence>
|
|
32
|
+
</TransitionSeries>
|
|
33
|
+
);
|
|
40
34
|
```
|
|
41
35
|
|
|
42
|
-
|
|
43
|
-
If a composition with the same component is registered, one can double click the sequence in the main composition and jump to that composition.
|
|
36
|
+
Register the same scene components, plus the parent video, in the root:
|
|
44
37
|
|
|
45
38
|
```tsx
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
width={1920}
|
|
56
|
-
height={1080}
|
|
57
|
-
/>
|
|
58
|
-
<Composition
|
|
59
|
-
id="Scene2"
|
|
60
|
-
component={Scene2}
|
|
61
|
-
durationInFrames={5 * fps}
|
|
62
|
-
fps={30}
|
|
63
|
-
width={1920}
|
|
64
|
-
height={1080}
|
|
65
|
-
/>
|
|
66
|
-
</Folder>
|
|
39
|
+
// Root.tsx
|
|
40
|
+
import {Composition, Folder} from 'remotion';
|
|
41
|
+
import {OpeningScene} from './OpeningScene';
|
|
42
|
+
import {FeatureScene} from './FeatureScene';
|
|
43
|
+
import {MyVideo} from './MyVideo';
|
|
44
|
+
|
|
45
|
+
export const RemotionRoot = () => (
|
|
46
|
+
<>
|
|
47
|
+
<Folder name="MyVideo-Scenes">
|
|
67
48
|
<Composition
|
|
68
|
-
id="
|
|
69
|
-
component={
|
|
70
|
-
|
|
49
|
+
id="Opening"
|
|
50
|
+
component={OpeningScene}
|
|
51
|
+
width={1920}
|
|
52
|
+
height={1080}
|
|
71
53
|
fps={30}
|
|
54
|
+
durationInFrames={90}
|
|
55
|
+
/>
|
|
56
|
+
<Composition
|
|
57
|
+
id="Feature"
|
|
58
|
+
component={FeatureScene}
|
|
72
59
|
width={1920}
|
|
73
60
|
height={1080}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
61
|
+
fps={30}
|
|
62
|
+
durationInFrames={120}
|
|
63
|
+
/>
|
|
64
|
+
</Folder>
|
|
65
|
+
<Composition
|
|
66
|
+
id="MyVideo"
|
|
67
|
+
component={MyVideo}
|
|
68
|
+
width={1920}
|
|
69
|
+
height={1080}
|
|
70
|
+
fps={30}
|
|
71
|
+
durationInFrames={210}
|
|
72
|
+
/>
|
|
73
|
+
</>
|
|
74
|
+
);
|
|
78
75
|
```
|
|
79
76
|
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
Keep each scene's standalone metadata and `defaultProps` consistent with how it is used in the main video.
|
|
78
|
+
|
|
79
|
+
With no transition, this example needs a 210-frame main composition. If you add a transition, account for its overlap in the main duration; see [transitions](transitions.md).
|
|
80
|
+
|
|
81
|
+
Use `<Series>` for consecutive scenes that do not need transitions. Use `<Sequence>` for scenes placed independently on the parent timeline.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: '/remotion-maps'
|
|
3
3
|
short_description: 'Create animated maps in Remotion videos'
|
|
4
|
-
icon_small: './assets/remotion-icon.
|
|
5
|
-
icon_large: './assets/remotion-icon.
|
|
4
|
+
icon_small: './assets/remotion-icon.svg'
|
|
5
|
+
icon_large: './assets/remotion-icon.svg'
|
|
6
6
|
brand_color: '#0B84F3'
|
|
7
7
|
default_prompt: '$remotion-maps: Animate a dot from Zurich to New York.'
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="100" height="100" viewBox="20 30 363 363" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<title>Remotion</title>
|
|
3
|
+
<path d="M148.332 92.9015C143.307 93.1742 139.259 93.9713 135.179 95.5236C133.144 96.2893 129.809 97.957 127.973 99.1108C120.295 103.925 114.443 111.162 111.391 119.584C110.782 121.252 109.136 126.57 108.076 130.23C101.018 154.7 97.0112 181.456 96.1511 209.776C96.0148 214.286 96.0148 225.026 96.1511 229.463C96.728 248.237 98.5216 265.187 101.773 282.472C103.095 289.468 105.213 298.866 106.44 303.135C108.947 311.809 114.065 319.193 121.344 324.605C126.221 328.234 131.759 330.668 137.895 331.863C140.853 332.44 144.755 332.702 147.629 332.514C151.604 332.251 159.491 331.192 165.9 330.049C194.786 324.899 221.469 315.679 245.666 302.485C260.99 294.125 274.09 285.074 286.729 274.092C299.326 263.163 310.066 251.405 319.516 238.21C321.708 235.158 322.81 233.375 323.911 231.131C326.743 225.341 328.075 219.583 328.064 213.143C328.064 207.143 326.932 201.815 324.488 196.361C323.313 193.728 322.191 191.84 319.674 188.253C310.402 175.048 300.112 163.542 287.568 152.361C268.122 135.034 245.026 120.822 219.235 110.302C213.644 108.026 208.138 106.022 201.509 103.851C187.475 99.2681 170.106 95.2929 155.411 93.3105C153.104 92.9959 149.968 92.8176 148.332 92.9015Z" fill="#0B84F3"/>
|
|
4
|
+
</svg>
|
|
@@ -63,7 +63,7 @@ import 'maplibre-gl/dist/maplibre-gl.css';
|
|
|
63
63
|
```tsx
|
|
64
64
|
import {useEffect, useRef, useState} from 'react';
|
|
65
65
|
import {AbsoluteFill, useDelayRender, useVideoConfig} from 'remotion';
|
|
66
|
-
import maplibregl from 'maplibre-gl';
|
|
66
|
+
import * as maplibregl from 'maplibre-gl';
|
|
67
67
|
import 'maplibre-gl/dist/maplibre-gl.css';
|
|
68
68
|
|
|
69
69
|
const zurich: [number, number] = [8.5417, 47.3769];
|
|
@@ -79,6 +79,15 @@ export const MyComposition = () => {
|
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
maplibregl.setWorkerUrl(
|
|
83
|
+
URL.createObjectURL(
|
|
84
|
+
new Blob(
|
|
85
|
+
[`import "https://unpkg.com/maplibre-gl@${maplibregl.getVersion()}/dist/maplibre-gl-worker.mjs";`],
|
|
86
|
+
{type: 'text/javascript'},
|
|
87
|
+
),
|
|
88
|
+
),
|
|
89
|
+
);
|
|
90
|
+
|
|
82
91
|
const mapInstance = new maplibregl.Map({
|
|
83
92
|
container: containerRef.current,
|
|
84
93
|
style: 'https://demotiles.maplibre.org/style.json',
|
|
@@ -131,7 +140,8 @@ import {
|
|
|
131
140
|
useDelayRender,
|
|
132
141
|
useVideoConfig,
|
|
133
142
|
} from 'remotion';
|
|
134
|
-
import
|
|
143
|
+
import * as maplibregl from 'maplibre-gl';
|
|
144
|
+
import {type GeoJSONSource, type Map} from 'maplibre-gl';
|
|
135
145
|
import 'maplibre-gl/dist/maplibre-gl.css';
|
|
136
146
|
|
|
137
147
|
const zurich: [number, number] = [8.5417, 47.3769];
|
|
@@ -214,6 +224,15 @@ export const MyComposition = () => {
|
|
|
214
224
|
return;
|
|
215
225
|
}
|
|
216
226
|
|
|
227
|
+
maplibregl.setWorkerUrl(
|
|
228
|
+
URL.createObjectURL(
|
|
229
|
+
new Blob(
|
|
230
|
+
[`import "https://unpkg.com/maplibre-gl@${maplibregl.getVersion()}/dist/maplibre-gl-worker.mjs";`],
|
|
231
|
+
{type: 'text/javascript'},
|
|
232
|
+
),
|
|
233
|
+
),
|
|
234
|
+
);
|
|
235
|
+
|
|
217
236
|
const mapInstance = new maplibregl.Map({
|
|
218
237
|
container: containerRef.current,
|
|
219
238
|
style: 'https://demotiles.maplibre.org/style.json',
|
|
@@ -34,4 +34,4 @@ export const StaticMap: React.FC = () => {
|
|
|
34
34
|
|
|
35
35
|
## Overlays and Interactivity
|
|
36
36
|
|
|
37
|
-
Follow
|
|
37
|
+
Follow Remotion Interactivity best practices and [Remotion Markup Best practices](../../../SKILL.md) for elements.
|
|
@@ -53,4 +53,4 @@ export const TextAnnotations: React.FC = () => {
|
|
|
53
53
|
};
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
Keep `progress` inline, hardcoded and use `interpolate` for maximum
|
|
56
|
+
Keep `progress` inline, hardcoded and use `interpolate` for maximum Studio interactivity.
|
|
@@ -55,7 +55,7 @@ writeFileSync(`public/voiceover/${compositionId}/${scene.id}.mp3`, audioBuffer);
|
|
|
55
55
|
|
|
56
56
|
## Dynamic composition duration with calculateMetadata
|
|
57
57
|
|
|
58
|
-
Use [`calculateMetadata`](./calculate-metadata.md) to measure the
|
|
58
|
+
Use [`calculateMetadata`](./calculate-metadata.md) to measure the audio durations and set the composition length accordingly.
|
|
59
59
|
|
|
60
60
|
```tsx
|
|
61
61
|
import { CalculateMetadataFunction, staticFile } from "remotion";
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: remotion-multimedia
|
|
3
|
-
description: Interacting with Mediabunny
|
|
4
|
-
version: 4.0.
|
|
5
|
-
---
|
|
1
|
+
---
|
|
2
|
+
name: remotion-multimedia
|
|
3
|
+
description: Interacting with Mediabunny
|
|
4
|
+
version: 4.0.529
|
|
5
|
+
---
|
|
6
|
+
|
|
6
7
|
|
|
7
8
|
Mediabunny is a multimedia library for dealing with audio and video in the browser.
|
|
8
9
|
Here is a compact overview of its capabilities: https://mediabunny.dev/llms.txt
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: '/remotion-multimedia'
|
|
3
3
|
short_description: 'Inspect browser-based audio and video media'
|
|
4
|
-
icon_small: './assets/remotion-icon.
|
|
5
|
-
icon_large: './assets/remotion-icon.
|
|
4
|
+
icon_small: './assets/remotion-icon.svg'
|
|
5
|
+
icon_large: './assets/remotion-icon.svg'
|
|
6
6
|
brand_color: '#0B84F3'
|
|
7
7
|
default_prompt: '$remotion-multimedia: Make my video the same duration as the footage'
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="100" height="100" viewBox="20 30 363 363" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<title>Remotion</title>
|
|
3
|
+
<path d="M148.332 92.9015C143.307 93.1742 139.259 93.9713 135.179 95.5236C133.144 96.2893 129.809 97.957 127.973 99.1108C120.295 103.925 114.443 111.162 111.391 119.584C110.782 121.252 109.136 126.57 108.076 130.23C101.018 154.7 97.0112 181.456 96.1511 209.776C96.0148 214.286 96.0148 225.026 96.1511 229.463C96.728 248.237 98.5216 265.187 101.773 282.472C103.095 289.468 105.213 298.866 106.44 303.135C108.947 311.809 114.065 319.193 121.344 324.605C126.221 328.234 131.759 330.668 137.895 331.863C140.853 332.44 144.755 332.702 147.629 332.514C151.604 332.251 159.491 331.192 165.9 330.049C194.786 324.899 221.469 315.679 245.666 302.485C260.99 294.125 274.09 285.074 286.729 274.092C299.326 263.163 310.066 251.405 319.516 238.21C321.708 235.158 322.81 233.375 323.911 231.131C326.743 225.341 328.075 219.583 328.064 213.143C328.064 207.143 326.932 201.815 324.488 196.361C323.313 193.728 322.191 191.84 319.674 188.253C310.402 175.048 300.112 163.542 287.568 152.361C268.122 135.034 245.026 120.822 219.235 110.302C213.644 108.026 208.138 106.022 201.509 103.851C187.475 99.2681 170.106 95.2929 155.411 93.3105C153.104 92.9959 149.968 92.8176 148.332 92.9015Z" fill="#0B84F3"/>
|
|
4
|
+
</svg>
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: remotion-render
|
|
3
|
-
description: Export a Remotion video
|
|
4
|
-
version: 4.0.
|
|
5
|
-
---
|
|
1
|
+
---
|
|
2
|
+
name: remotion-render
|
|
3
|
+
description: Export a Remotion video
|
|
4
|
+
version: 4.0.529
|
|
5
|
+
---
|
|
6
|
+
|
|
6
7
|
|
|
7
8
|
## General rendering strategy
|
|
8
9
|
|
|
@@ -22,6 +23,14 @@ npx remotion still
|
|
|
22
23
|
|
|
23
24
|
Full list of options: https://www.remotion.dev/docs/cli/still.md
|
|
24
25
|
|
|
26
|
+
To render several frames as images in one call, use `render --frames`:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
npx remotion render [composition-id] out/frames --frames=0,30,90 --image-format=png
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
See https://www.remotion.dev/docs/cli/render.md#--frames for more options.
|
|
33
|
+
|
|
25
34
|
## Transparent videos
|
|
26
35
|
|
|
27
36
|
See [Transparent videos](./transparent-videos.md) for rendering out a video with transparency.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: '/remotion-render'
|
|
3
3
|
short_description: 'Export Remotion videos and stills'
|
|
4
|
-
icon_small: './assets/remotion-icon.
|
|
5
|
-
icon_large: './assets/remotion-icon.
|
|
4
|
+
icon_small: './assets/remotion-icon.svg'
|
|
5
|
+
icon_large: './assets/remotion-icon.svg'
|
|
6
6
|
brand_color: '#0B84F3'
|
|
7
7
|
default_prompt: '$remotion-render: Render this as transparent ProRes'
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="100" height="100" viewBox="20 30 363 363" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<title>Remotion</title>
|
|
3
|
+
<path d="M148.332 92.9015C143.307 93.1742 139.259 93.9713 135.179 95.5236C133.144 96.2893 129.809 97.957 127.973 99.1108C120.295 103.925 114.443 111.162 111.391 119.584C110.782 121.252 109.136 126.57 108.076 130.23C101.018 154.7 97.0112 181.456 96.1511 209.776C96.0148 214.286 96.0148 225.026 96.1511 229.463C96.728 248.237 98.5216 265.187 101.773 282.472C103.095 289.468 105.213 298.866 106.44 303.135C108.947 311.809 114.065 319.193 121.344 324.605C126.221 328.234 131.759 330.668 137.895 331.863C140.853 332.44 144.755 332.702 147.629 332.514C151.604 332.251 159.491 331.192 165.9 330.049C194.786 324.899 221.469 315.679 245.666 302.485C260.99 294.125 274.09 285.074 286.729 274.092C299.326 263.163 310.066 251.405 319.516 238.21C321.708 235.158 322.81 233.375 323.911 231.131C326.743 225.341 328.075 219.583 328.064 213.143C328.064 207.143 326.932 201.815 324.488 196.361C323.313 193.728 322.191 191.84 319.674 188.253C310.402 175.048 300.112 163.542 287.568 152.361C268.122 135.034 245.026 120.822 219.235 110.302C213.644 108.026 208.138 106.022 201.509 103.851C187.475 99.2681 170.106 95.2929 155.411 93.3105C153.104 92.9959 149.968 92.8176 148.332 92.9015Z" fill="#0B84F3"/>
|
|
4
|
+
</svg>
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: remotion-saas
|
|
3
|
-
description: Build an app with Remotion
|
|
4
|
-
version: 4.0.
|
|
5
|
-
---
|
|
1
|
+
---
|
|
2
|
+
name: remotion-saas
|
|
3
|
+
description: Build an app with Remotion
|
|
4
|
+
version: 4.0.529
|
|
5
|
+
---
|
|
6
|
+
|
|
6
7
|
|
|
7
8
|
One can build apps with Remotion.
|
|
8
9
|
It is possible to have a simple form and hook it up to a render, or have a complex video editor.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: '/remotion-saas'
|
|
3
3
|
short_description: 'Build apps that preview and render videos'
|
|
4
|
-
icon_small: './assets/remotion-icon.
|
|
5
|
-
icon_large: './assets/remotion-icon.
|
|
4
|
+
icon_small: './assets/remotion-icon.svg'
|
|
5
|
+
icon_large: './assets/remotion-icon.svg'
|
|
6
6
|
brand_color: '#0B84F3'
|
|
7
7
|
default_prompt: '$remotion-saas: Turn my video into an app.'
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="100" height="100" viewBox="20 30 363 363" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<title>Remotion</title>
|
|
3
|
+
<path d="M148.332 92.9015C143.307 93.1742 139.259 93.9713 135.179 95.5236C133.144 96.2893 129.809 97.957 127.973 99.1108C120.295 103.925 114.443 111.162 111.391 119.584C110.782 121.252 109.136 126.57 108.076 130.23C101.018 154.7 97.0112 181.456 96.1511 209.776C96.0148 214.286 96.0148 225.026 96.1511 229.463C96.728 248.237 98.5216 265.187 101.773 282.472C103.095 289.468 105.213 298.866 106.44 303.135C108.947 311.809 114.065 319.193 121.344 324.605C126.221 328.234 131.759 330.668 137.895 331.863C140.853 332.44 144.755 332.702 147.629 332.514C151.604 332.251 159.491 331.192 165.9 330.049C194.786 324.899 221.469 315.679 245.666 302.485C260.99 294.125 274.09 285.074 286.729 274.092C299.326 263.163 310.066 251.405 319.516 238.21C321.708 235.158 322.81 233.375 323.911 231.131C326.743 225.341 328.075 219.583 328.064 213.143C328.064 207.143 326.932 201.815 324.488 196.361C323.313 193.728 322.191 191.84 319.674 188.253C310.402 175.048 300.112 163.542 287.568 152.361C268.122 135.034 245.026 120.822 219.235 110.302C213.644 108.026 208.138 106.022 201.509 103.851C187.475 99.2681 170.106 95.2929 155.411 93.3105C153.104 92.9959 149.968 92.8176 148.332 92.9015Z" fill="#0B84F3"/>
|
|
4
|
+
</svg>
|
|
@@ -9,9 +9,7 @@ Remotion can be used with any React framework.
|
|
|
9
9
|
|
|
10
10
|
We offer the following templates:
|
|
11
11
|
|
|
12
|
-
- Next.js
|
|
13
|
-
- Next.js App Router without Tailwind: https://www.remotion.dev/templates/next-no-tailwind. Uses Lambda as default rendering choice.
|
|
14
|
-
- Next.js Pages Router: https://github.com/remotion-dev/template-next-pages-dir. Uses Lambda as default rendering choice.
|
|
12
|
+
- Next.js: https://github.com/remotion-dev/template-next-app-dir-tailwind. Uses Lambda as default rendering choice.
|
|
15
13
|
- Vercel Sandbox rendering: https://github.com/remotion-dev/template-vercel. Uses Vercel as default rendering choice.
|
|
16
14
|
- React Router 7: https://github.com/remotion-dev/template-react-router. Uses Lambda as default rendering choice.
|
|
17
15
|
- Express.js render server: `packages/template-render-server`: https://github.com/remotion-dev/template-render-server. Uses Node.js as default rendering choice.
|