remotion-dev/remotion · warning · Error

Browser Studio does not support saving sequence keyframes ye

Error message

Browser Studio does not support saving sequence keyframes yet

What it means

saveSequencePropsInProject explicitly rejects any SaveSequencePropsRequest that contains keyframe changes (detected via hasKeyframeChanges). Browser Studio has not implemented persisting sequence keyframes yet, so this is a capability gate rather than a user-correctable input error. Non-keyframe prop edits and caption patches are still allowed.

Source

Thrown at packages/browser-studio/src/save-sequence-props.ts:77

				JSON.stringify(target.nodePath),
				target,
			]),
		).values(),
	];
};

export const saveSequencePropsInProject = ({
	project,
	request,
}: {
	project: VirtualProject;
	request: SaveSequencePropsRequest;
}): {
	project: VirtualProject;
	response: SaveSequencePropsResponse;
} => {
	if (hasKeyframeChanges(request)) {
		throw new Error(
			'Browser Studio does not support saving sequence keyframes yet',
		);
	}

	if (
		request.edits.length === 0 &&
		(request.captionPatches?.length ?? 0) === 0
	) {
		throw new Error('No sequence prop edits to save');
	}

	const mutations = new Map<string, FileMutation>();
	for (const edit of request.edits) {
		const absolutePath = findProjectFile({
			filePath: edit.fileName,
			project,
		});
		getFileMutation(mutations, absolutePath).edits.push(edit);

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Filter out keyframe-bearing edits before calling saveSequenceProps (only send static prop edits and caption patches).
  2. Disable the keyframe-recording UI in Browser Studio until persistence is supported.
  3. Use the desktop Remotion Studio if keyframe persistence is required.
  4. Track this as a known limitation and surface an in-UI message instead of letting the throw propagate.

Example fix

// before
saveSequencePropsInProject({project, request}); // request contains keyframes

// after
const stripped = {...request, edits: request.edits.filter((e) => !isKeyframeEdit(e))};
saveSequencePropsInProject({project, request: stripped});
Defensive patterns

Strategy: validation

Validate before calling

// Strip keyframe-bearing edits before calling saveSequenceProps
const requestWithoutKeyframes: SaveSequencePropsRequest = {
  ...request,
  edits: request.edits.filter((e) => !isKeyframeEdit(e)),
  captionPatches: (request.captionPatches ?? []).filter((c) => !isKeyframeEdit(c)),
};
if (requestWithoutKeyframes.edits.length === 0 &&
    (requestWithoutKeyframes.captionPatches?.length ?? 0) === 0) {
  // nothing savable — inform user instead of calling
}

Type guard

const hasNoKeyframeChanges = (req: SaveSequencePropsRequest): boolean =>
  !hasKeyframeChanges(req);

Try / catch

try {
  saveSequencePropsInProject({project, request});
} catch (err) {
  if (String(err?.message ?? '').includes('does not support saving sequence keyframes')) {
    // inform user keyframes can't be saved in Browser Studio yet; do not retry unchanged
  } else throw err;
}

Prevention

When it happens

Trigger: Calling saveSequenceProps with an edits/captionPatches payload that includes keyframe changes — e.g. the user animated a prop and the Studio sent the keyframes to be saved.

Common situations: A UI flow that records keyframes (visual-mode timeline editing) attempting to persist them; new feature work that produces keyframe diffs before the save path supports them; client and server capability mismatch after an upgrade.

Related errors


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/d0e40683b1cf7fa5. Report an issue: GitHub.