Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
aceb44a
continueRender in finally: shader draw exceptions must not leak the d…
BarriBarri20 Aug 21, 2026
c18d16d
`remotion`: Replace imperative playing ref with `playbackStore` and `…
Octember Aug 30, 2026
00120e9
`remotion`: Expose `isPlaying()` on timeline context instead of `play…
Octember Aug 30, 2026
2bdd21c
`remotion`: Use runtime value store for playing and drop dead hooks
Octember Aug 30, 2026
7b6c268
`remotion`: Stabilize playing reads and fix imperative player re-renders
Octember Aug 30, 2026
c368238
`remotion`: Keep Studio timeline setters free of dummy frame refs
Octember Aug 30, 2026
b365338
`remotion`: Keep Studio frameRef in sync with the current timeline
Octember Aug 30, 2026
172b4c6
`remotion`: Provide SetTimelineContext in sequence test wrapper
Octember Aug 30, 2026
4eaf9d5
remotion: Avoid redundant playback store updates
Octember Aug 30, 2026
b0e25b7
remotion: Keep usePlaying internal
Octember Aug 30, 2026
7ef0bf5
remotion: Provide playback context to thumbnails
Octember Aug 30, 2026
51b51c9
remotion: Simplify thumbnail playback fallback
Octember Aug 30, 2026
f47c8bd
refactor(core): publish runtime value snapshots
Octember Aug 30, 2026
e42ac51
docs(core): explain playing subscription split
Octember Aug 30, 2026
9ec3e9f
`@remotion/media`: Upgrade Mediabunny to 1.55.4
JonnyBurger Aug 31, 2026
6a9bfc6
Add current error to Studio WebMCP
JonnyBurger Aug 31, 2026
07bc8cf
Merge remote-tracking branch 'origin/main' into codex/upgrade-mediabu…
JonnyBurger Aug 31, 2026
4f984c5
Merge remote-tracking branch 'origin/main' into codex/webmcp-current-…
JonnyBurger Aug 31, 2026
dd2ee8d
`@remotion/media`: Update loop frame color snapshot
JonnyBurger Aug 31, 2026
a79dba5
Document get_current_error WebMCP tool
JonnyBurger Aug 31, 2026
e2d4717
Update WebMCP error prompt
JonnyBurger Aug 31, 2026
9faa0cc
Cancel render on HTML-in-canvas draw errors
JonnyBurger Aug 31, 2026
b91f119
Fix Browser Studio document title
JonnyBurger Aug 31, 2026
c5cfac5
Internal tests: Wait for installed Element file
JonnyBurger Aug 31, 2026
dda7ea8
Vendor useSyncExternalStore shim
JonnyBurger Aug 31, 2026
c043e5f
Keep sync store shim internal
JonnyBurger Aug 31, 2026
6e5d5d7
Derive Element install title from modal state
JonnyBurger Aug 31, 2026
48af791
Merge pull request #10970 from remotion-dev/codex/upgrade-mediabunny-…
JonnyBurger Aug 31, 2026
a399c49
`@remotion/studio-codemods`: Stop wrapping self-closing roots in `<Se…
JonnyBurger Aug 31, 2026
de46700
Add folder hierarchy to Quick Switcher search
JonnyBurger Aug 31, 2026
0c3691e
Merge pull request #10971 from remotion-dev/codex/webmcp-current-error
JonnyBurger Aug 31, 2026
f86c713
Remove three flaky Studio E2E tests
JonnyBurger Aug 31, 2026
53db4bc
Merge pull request #10956 from Octember/kill-imperative-playing-main
JonnyBurger Aug 31, 2026
1ef1aee
Merge pull request #10951 from BarriBarri20/exception-safe-html-in-ca…
JonnyBurger Aug 31, 2026
6b15f78
Merge pull request #10989 from remotion-dev/codex/remove-top-flaky-st…
JonnyBurger Aug 31, 2026
27e436b
`@remotion/studio`: Fix selection after context-menu deletion
JonnyBurger Aug 31, 2026
dda474f
Merge pull request #10981 from remotion-dev/codex/fix-browser-studio-…
JonnyBurger Aug 31, 2026
5b2ce50
remotion: Update sequence registrations in place
JonnyBurger Aug 31, 2026
6735bde
Merge pull request #10987 from remotion-dev/codex/remove-self-closing…
JonnyBurger Aug 31, 2026
1ecb96c
Merge pull request #10990 from remotion-dev/codex/fix-context-menu-de…
JonnyBurger Aug 31, 2026
1894cd1
Merge pull request #10988 from remotion-dev/codex/quick-switcher-fold…
JonnyBurger Aug 31, 2026
19975b2
Merge pull request #10992 from remotion-dev/codex/update-sequence-reg…
JonnyBurger Aug 31, 2026
3086f7d
Fade unselected timeline tracks
JonnyBurger Aug 31, 2026
2dcfb74
Add composition context menu to Quick Switcher
JonnyBurger Aug 31, 2026
ca1f876
Merge pull request #10997 from remotion-dev/codex/fade-unselected-tim…
JonnyBurger Aug 31, 2026
4af29a9
Merge pull request #10998 from remotion-dev/codex/quick-switcher-comp…
JonnyBurger Aug 31, 2026
1c4c39d
`@remotion/studio`: Move composition dragging out of Studio Protocol …
samohovets Aug 31, 2026
c9147ae
Validate Studio Protocol data with Zod Mini (#10983)
samohovets Aug 31, 2026
aa8cf57
Merge pull request #10985 from remotion-dev/studio-shared-decouple-pr…
samohovets Aug 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 22 additions & 20 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,14 @@
"@types/node": "20.12.14",
"@types/web": "0.0.166",
"@types/bun": "1.3.3",
"mediabunny": "1.55.1",
"@mediabunny/server": "1.55.1",
"@mediabunny/mp3-encoder": "1.55.1",
"@mediabunny/aac-encoder": "1.55.1",
"@mediabunny/flac-encoder": "1.55.1",
"@mediabunny/prores": "1.55.1",
"@mediabunny/ac3": "1.55.1",
"@mediabunny/dts": "1.55.1",
"mediabunny": "1.55.4",
"@mediabunny/server": "1.55.4",
"@mediabunny/mp3-encoder": "1.55.4",
"@mediabunny/aac-encoder": "1.55.4",
"@mediabunny/flac-encoder": "1.55.4",
"@mediabunny/prores": "1.55.4",
"@mediabunny/ac3": "1.55.4",
"@mediabunny/dts": "1.55.4",
"next": "16.2.11",
"three": "0.178.0",
"sharp": "0.34.5",
Expand Down
19 changes: 19 additions & 0 deletions packages/browser-studio/e2e/browser-studio.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,10 @@ test('loads Browser Studio, opens external links, and can add, delete, and dupli
studio.locator('.remotion-studio-composition-container'),
).toBeVisible();
await expect.poll(() => new URL(page.url()).search).toBe('?/MyComp');
await expect(page).toHaveTitle(
'MyComp / template-blank - Remotion Studio',
{timeout: 5000},
);
await studio.locator('button:has(svg[viewBox="0 0 415 426"])').click();
const popupPromise = page.waitForEvent('popup');
await studio.getByText('About Remotion', {exact: true}).click();
Expand Down Expand Up @@ -329,8 +333,16 @@ test('loads Browser Studio, opens external links, and can add, delete, and dupli
studio.getByTitle('/project').getByText('MyComp1'),
).toBeVisible();
await expect.poll(() => new URL(page.url()).search).toBe('?/MyComp1');
await expect(page).toHaveTitle(
'MyComp1 / template-blank - Remotion Studio',
{timeout: 5000},
);
await page.goBack();
await expect.poll(() => new URL(page.url()).search).toBe('?/MyComp');
await expect(page).toHaveTitle(
'MyComp / template-blank - Remotion Studio',
{timeout: 5000},
);
await studio.getByRole('button', {name: 'Render on web'}).click();
await expect(
studio.getByText('Render MyComp', {exact: true}),
Expand Down Expand Up @@ -1089,6 +1101,10 @@ export const LinkedElement = () => <Rect width={320} height={180} fill="red" />;
await expect(
studio.getByText('Install Element', {exact: true}),
).toBeVisible();
await expect(page).toHaveTitle(
'📦 Install Linked Element - Remotion Studio',
{timeout: 5000},
);
await expect(
studio.getByText('Unverified Browser Studio link'),
).toBeVisible();
Expand Down Expand Up @@ -1146,6 +1162,9 @@ export const LinkedElement = () => <Rect width={320} height={180} fill="red" />;
).__browserStudioInstallPreservedIframe,
),
).toBe(true);
await expect(page).toHaveTitle('MyComp / template-blank - Remotion Studio', {
timeout: 5000,
});
});

test('reports inline SVG imports as unsupported without changing the project', async ({
Expand Down
6 changes: 5 additions & 1 deletion packages/browser-studio/src/browser-studio-operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1952,7 +1952,11 @@ export const createBrowserStudioOperations = ({
return value === null
? null
: {
element: value.payload.element,
element: {
...value.payload.element,
durationInFrames: value.payload.element.durationInFrames ?? null,
installationMode: value.payload.element.installationMode ?? null,
},
sourceOrigin: value.sourceOrigin,
};
},
Expand Down
15 changes: 10 additions & 5 deletions packages/browser-studio/src/test/browser-studio-operations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ test('consumes an initial Element payload only once', () => {
});

expect(operations.consumeInitialElement()).toEqual({
element: payload.element,
element: {
...payload.element,
durationInFrames: 60,
installationMode: 'wrapped',
},
sourceOrigin: 'https://elements.example.test',
});
expect(operations.consumeInitialElement()).toBe(null);
Expand Down Expand Up @@ -179,7 +183,7 @@ export const MyComponent = () => <AbsoluteFill>Existing</AbsoluteFill>;
);
});

test('wraps a self-closing root, aliases bindings, and remaps the root', () => {
test('inserts beside a self-closing root, aliases bindings, and remaps the root', () => {
const project: VirtualProject = {
rootDir: '/project',
entryPoint: '/project/src/index.tsx',
Expand Down Expand Up @@ -212,11 +216,12 @@ registerRoot(Root);
const output = updated.files['/project/src/index.tsx'];

expect(output).toContain(
"import {AbsoluteFill, Composition, registerRoot, Solid as RemotionSolid, Sequence as RemotionSequence} from 'remotion';",
"import {AbsoluteFill, Composition, registerRoot, Solid as RemotionSolid} from 'remotion';",
);
expect(output).toContain('<RemotionSequence>');
expect(output).not.toContain('<RemotionSequence>');
expect(output).toContain('<AbsoluteFill />');
expect(output).toContain('<RemotionSolid width={1280}');
expect(nodePathRemappings).toHaveLength(3);
expect(nodePathRemappings).toHaveLength(2);
expect(nodePathRemappings).toEqual(
expect.arrayContaining([
expect.objectContaining({oldNodePath: expect.any(Array)}),
Expand Down
3 changes: 2 additions & 1 deletion packages/canvas/src/selection.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {useState, useSyncExternalStore} from 'react';
import {useState} from 'react';
import type {SequenceNodePathInfo} from './get-timeline-sequence-sort-key';
import {useSyncExternalStore} from './use-sync-external-store';

export type CanvasSelectionItem =
| {
Expand Down
11 changes: 11 additions & 0 deletions packages/canvas/src/use-sync-external-store.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import {Internals} from 'remotion';

type UseSyncExternalStore = <TSnapshot>(
subscribe: (onStoreChange: () => void) => () => void,
getSnapshot: () => TSnapshot,
getServerSnapshot?: () => TSnapshot,
) => TSnapshot;

export const {useSyncExternalStore} = Internals as typeof Internals & {
useSyncExternalStore: UseSyncExternalStore;
};
14 changes: 7 additions & 7 deletions packages/cli/src/extra-packages.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
export const EXTRA_PACKAGES: Record<string, string> = {
mediabunny: '1.55.1',
'@mediabunny/ac3': '1.55.1',
'@mediabunny/dts': '1.55.1',
'@mediabunny/mp3-encoder': '1.55.1',
'@mediabunny/aac-encoder': '1.55.1',
'@mediabunny/flac-encoder': '1.55.1',
'@mediabunny/prores': '1.55.1',
mediabunny: '1.55.4',
'@mediabunny/ac3': '1.55.4',
'@mediabunny/dts': '1.55.4',
'@mediabunny/mp3-encoder': '1.55.4',
'@mediabunny/aac-encoder': '1.55.4',
'@mediabunny/flac-encoder': '1.55.4',
'@mediabunny/prores': '1.55.4',
zod: '4.4.3',
};

Expand Down
28 changes: 28 additions & 0 deletions packages/core/THIRD_PARTY_LICENSES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Third-party licenses

## use-sync-external-store

The vendored `useSyncExternalStore` compatibility implementation is adapted
from `use-sync-external-store` 1.5.0.

MIT License

Copyright (c) Meta Platforms, Inc. and affiliates.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading
Loading