remotion-dev/remotion · error · Error

No sequence prop edits to save

Error message

No sequence prop edits to save

What it means

Rejected by saveSequenceProps in @remotion/browser-studio when the request contains nothing to save: `request.edits` is empty, `captionPatches` is empty/absent, and there are no added or moved keyframes, so both the prop-saving step and the keyframe step are skipped and the operation refuses to commit an empty mutation. Unlike most operations here it throws directly (no try/catch inside), so the promise rejects with this message.

Source

Thrown at packages/browser-studio/src/browser-studio-operations.ts:2280

								{
									fromFrame: keyframe.fromFrame,
									toFrame: keyframe.toFrame,
								},
							],
						},
					},
				],
			}));
			const keyframeResult =
				sequenceMutations.length > 0 || effectMutations.length > 0
					? await mutateKeyframesInProject({
							project: propResult?.project ?? project,
							sequenceMutations,
							effectMutations,
						})
					: null;
			if (propResult === null && keyframeResult === null) {
				throw new Error('No sequence prop edits to save');
			}

			const firstTarget = request.edits[0] ?? request.captionPatches?.[0];
			controller.applyMutation({
				timelineSelection: null,
				fileName:
					firstTarget?.fileName ??
					sequenceMutations[0]?.fileName ??
					'Keyframes',
				nodePathMutationFiles: null,
				mutate: () => keyframeResult?.project ?? propResult!.project,
			});
			if (propResult) {
				return propResult.response;
			}

			const firstSequenceMutation = keyframeResult?.appliedSequenceMutations[0];
			return firstSequenceMutation && keyframeResult

View on GitHub (pinned to b2f4e34732)

Solutions

  1. Only call saveSequenceProps when at least one edit, caption patch, added keyframe, or moved keyframe exists
  2. Track a dirty flag and skip the call when nothing changed
  3. Catch the rejection defensively around debounced auto-save
  4. If you expect edits but get this error, log the request payload — your edit collection logic is dropping changes

Example fix

// before
await operations.saveSequenceProps({
  fileName,
  edits: [],
  addedKeyframes: [],
  movedKeyframes: {sequenceKeyframes: [], effectKeyframes: []},
}); // rejects: No sequence prop edits to save

// after
const hasWork =
  edits.length > 0 ||
  addedKeyframes.length > 0 ||
  movedKeyframes.sequenceKeyframes.length > 0 ||
  movedKeyframes.effectKeyframes.length > 0;
if (hasWork) {
  await operations.saveSequenceProps({fileName, edits, addedKeyframes, movedKeyframes});
}
Defensive patterns

Strategy: validation

Validate before calling

const hasWork =
  edits.length > 0 ||
  (captionPatches?.length ?? 0) > 0 ||
  (addedKeyframes?.length ?? 0) > 0 ||
  (movedKeyframes?.sequenceKeyframes.length ?? 0) > 0 ||
  (movedKeyframes?.effectKeyframes.length ?? 0) > 0;
if (hasWork) {
  await operations.saveSequenceProps({fileName, edits, captionPatches, addedKeyframes, movedKeyframes});
}

Try / catch

try { await operations.saveSequenceProps(request); } catch (error) { /* empty or malformed request — clear the dirty flag and move on */ }

Prevention

When it happens

Trigger: Calling `saveSequenceProps({edits: [], captionPatches: [], addedKeyframes: [], movedKeyframes: {sequenceKeyframes: [], effectKeyframes: []}})` or omitting all optional arrays; a debounced auto-save firing after the user reverted their last change, sending an empty diff.

Common situations: Auto-save timers in embedding editors that fire even when the change queue was emptied; save buttons enabled with no dirty fields; diff tracking that produces zero edits after normalization.

Related errors


AI-assisted analysis of remotion-dev/remotion@b2f4e34732 (2026-08-22). Data as JSON: /api/errors/a06d245000ec7d9b. Report an issue: GitHub.