remotion-dev/remotion · error · Error

No effect prop edits to save

Error message

No effect prop edits to save

What it means

saveMultipleEffectProps refuses empty batch saves: if request.edits is an empty array it throws 'No effect prop edits to save'. Unlike most other operations here, this method has no try/catch wrapper, so the error propagates as a rejected promise to the caller.

Source

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

				files: {...project.files, [absolutePath]: result.output},
			};
			controller.applyMutation({
				timelineSelection: null,
				fileName: absolutePath,
				nodePathMutationFiles: null,
				mutate: () => nextProject,
			});
			return getEffectStatus({
				effectIndex: request.effectIndex,
				fileName: request.fileName,
				project: nextProject,
				schema: request.schema,
				sequenceNodePath: request.sequenceNodePath,
			});
		},
		saveMultipleEffectProps: async (request) => {
			if (request.edits.length === 0) {
				throw new Error('No effect prop edits to save');
			}

			const project = getProject();
			const outputByPath = new Map<string, string>();
			for (const edit of request.edits) {
				const absolutePath = findProjectFile({
					filePath: edit.fileName,
					project,
				});
				const result = await updateEffectPropsCodemod({
					effectIndex: edit.effectIndex,
					formatFile: formatCodemodFile,
					input: outputByPath.get(absolutePath) ?? project.files[absolutePath],
					schema: edit.schema,
					sequenceNodePath: edit.sequenceNodePath.nodePath,
					update:
						edit.type === 'effect-param'
							? {

View on GitHub (pinned to b2f4e34732)

Solutions

  1. Guard the call: only invoke saveMultipleEffectProps when edits.length > 0.
  2. Clear or check the dirty-edit buffer before submitting.
  3. Wrap the call in try/catch since this operation returns a raw rejection, unlike the structured-error operations.

Example fix

// before
await operations.effect.saveMultipleEffectProps({edits, undoLabel: 'Edit props'});

// after
if (edits.length > 0) {
  await operations.effect.saveMultipleEffectProps({edits, undoLabel: 'Edit props'});
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (request.edits.length > 0) {
  await operations.effect.saveMultipleEffectProps(request);
}

Try / catch

try {
  const result = await operations.effect.saveMultipleEffectProps(request);
} catch (error) {
  if (error instanceof Error && error.message === 'No effect prop edits to save') {
    return; // no-op save, nothing to do
  }
  throw error;
}

Prevention

When it happens

Trigger: Calling saveMultipleEffectProps({edits: [], ...}) — e.g. a bulk property-save flow where all pending edits were committed individually first, leaving an empty batch.

Common situations: Debounced auto-save that fires after the edit buffer was already flushed; form submit handlers that always call save even with no dirty fields.

Related errors


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