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
- Guard the call: only invoke saveMultipleEffectProps when edits.length > 0.
- Clear or check the dirty-edit buffer before submitting.
- 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
- This operation is not wrapped in a structured-error handler — always try/catch it.
- Track dirty edits and skip the call when the buffer is empty.
- Clear the edit buffer atomically after each successful save.
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
- <Solid>: `pixelDensity` must be a positive finite number. Re
- The "width" and "height" props must be numbers on <Img> when
- The ${formatPropList(conflictingProps)} prop${conflictingPro
- No effects were specified for deletion
- No effects were specified for duplication
AI-assisted analysis of remotion-dev/remotion@b2f4e34732 (2026-08-22).
Data as JSON: /api/errors/13db20ac1a94ca92.
Report an issue: GitHub.