{"record":{"id":"a06d245000ec7d9b","repo":"remotion-dev/remotion","slug":"no-sequence-prop-edits-to-save","errorCode":null,"errorMessage":"No sequence prop edits to save","messagePattern":"No sequence prop edits to save","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/browser-studio/src/browser-studio-operations.ts","lineNumber":2280,"sourceCode":"\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfromFrame: keyframe.fromFrame,\n\t\t\t\t\t\t\t\t\ttoFrame: keyframe.toFrame,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}));\n\t\t\tconst keyframeResult =\n\t\t\t\tsequenceMutations.length > 0 || effectMutations.length > 0\n\t\t\t\t\t? await mutateKeyframesInProject({\n\t\t\t\t\t\t\tproject: propResult?.project ?? project,\n\t\t\t\t\t\t\tsequenceMutations,\n\t\t\t\t\t\t\teffectMutations,\n\t\t\t\t\t\t})\n\t\t\t\t\t: null;\n\t\t\tif (propResult === null && keyframeResult === null) {\n\t\t\t\tthrow new Error('No sequence prop edits to save');\n\t\t\t}\n\n\t\t\tconst firstTarget = request.edits[0] ?? request.captionPatches?.[0];\n\t\t\tcontroller.applyMutation({\n\t\t\t\ttimelineSelection: null,\n\t\t\t\tfileName:\n\t\t\t\t\tfirstTarget?.fileName ??\n\t\t\t\t\tsequenceMutations[0]?.fileName ??\n\t\t\t\t\t'Keyframes',\n\t\t\t\tnodePathMutationFiles: null,\n\t\t\t\tmutate: () => keyframeResult?.project ?? propResult!.project,\n\t\t\t});\n\t\t\tif (propResult) {\n\t\t\t\treturn propResult.response;\n\t\t\t}\n\n\t\t\tconst firstSequenceMutation = keyframeResult?.appliedSequenceMutations[0];\n\t\t\treturn firstSequenceMutation && keyframeResult","sourceCodeStart":2262,"sourceCodeEnd":2298,"githubUrl":"https://github.com/remotion-dev/remotion/blob/b2f4e34732f3c6c222ea029413e22dc402218cd7/packages/browser-studio/src/browser-studio-operations.ts#L2262-L2298","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Only call saveSequenceProps when at least one edit, caption patch, added keyframe, or moved keyframe exists","Track a dirty flag and skip the call when nothing changed","Catch the rejection defensively around debounced auto-save","If you expect edits but get this error, log the request payload — your edit collection logic is dropping changes"],"exampleFix":"// before\nawait operations.saveSequenceProps({\n  fileName,\n  edits: [],\n  addedKeyframes: [],\n  movedKeyframes: {sequenceKeyframes: [], effectKeyframes: []},\n}); // rejects: No sequence prop edits to save\n\n// after\nconst hasWork =\n  edits.length > 0 ||\n  addedKeyframes.length > 0 ||\n  movedKeyframes.sequenceKeyframes.length > 0 ||\n  movedKeyframes.effectKeyframes.length > 0;\nif (hasWork) {\n  await operations.saveSequenceProps({fileName, edits, addedKeyframes, movedKeyframes});\n}","handlingStrategy":"validation","validationCode":"const hasWork =\n  edits.length > 0 ||\n  (captionPatches?.length ?? 0) > 0 ||\n  (addedKeyframes?.length ?? 0) > 0 ||\n  (movedKeyframes?.sequenceKeyframes.length ?? 0) > 0 ||\n  (movedKeyframes?.effectKeyframes.length ?? 0) > 0;\nif (hasWork) {\n  await operations.saveSequenceProps({fileName, edits, captionPatches, addedKeyframes, movedKeyframes});\n}","typeGuard":null,"tryCatchPattern":"try { await operations.saveSequenceProps(request); } catch (error) { /* empty or malformed request — clear the dirty flag and move on */ }","preventionTips":["Maintain a dirty flag; skip auto-save when the pending change queue is empty","In debounced savers, bail out early if the diff is empty","Log request payloads when this fires unexpectedly — your edit collector is dropping changes"],"tags":["props","keyframes","save","empty-request","browser-studio"],"backgroundTag":"empty-payload","analyzedSha":"b2f4e34732f3c6c222ea029413e22dc402218cd7","analyzedAt":"2026-08-22T21:45:17.748Z","contentChangedAt":"2026-08-22T21:45:17.748Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}