remotion-dev/remotion · error · Error

Renderer completed manifest references missing media object

Error message

Renderer completed manifest references missing media object ${key}

What it means

Same s3Renderer flow as the artifact case: after status.json reports 'completed', the orchestrator downloads the chunk's media objects (status.videoKey / status.audioKey) to the output directory as chunk-XXXXXXXX-{video,audio} files. A missing-object error (isMissingObjectError, S3 NoSuchKey/404) on either key throws this - the renderer's manifest promised media that is not in the bucket.

Source

Thrown at packages/serverless/src/stream-renderer.ts:461

					}

					const filename = join(
						outdir,
						`chunk-${String(payload.chunk).padStart(8, '0')}-${type}`,
					);
					let media;
					try {
						media = await providerSpecifics.readFile({
							bucketName: payload.bucketName,
							key,
							region,
							expectedBucketOwner,
							forcePathStyle: payload.forcePathStyle,
							requestHandler,
						});
					} catch (err) {
						if (isMissingObjectError(err)) {
							throw new Error(
								`Renderer completed manifest references missing media object ${key}`,
							);
						}

						throw err;
					}

					await pipeline(media, createWriteStream(filename));
					downloadedFiles.push(filename);
					downloadedKeys.push(key);
				}

				for (const emittedArtifact of emittedArtifacts) {
					const artifactRegistration = onArtifact({
						artifact: emittedArtifact,
						chunk: payload.chunk,
						attempt: payload.attempt,
					});

View on GitHub (pinned to b2f4e34732)

Solutions

  1. Retry the render with a fresh renderId - the missing chunk media cannot be recovered.
  2. Audit the bucket lifecycle rules so nothing deletes renders/* objects during a render.
  3. Guarantee unique renderIds and single-writer access per render prefix.
  4. Check the renderer's logs for upload errors on the exact key named in the message.
  5. If reproducible with matched versions, report it as a Remotion bug including the renderId and key.
Defensive patterns

Strategy: retry

Validate before calling

# Pre-render check: nothing may expire or transition render objects mid-render
aws s3api get-bucket-lifecycle-configuration --bucket "$BUCKET" \
  | jq '.Rules[] | select(.Filter | tostring | contains("renders"))' \
  | grep . && echo "WARNING: lifecycle rule touches renders/ prefix" || echo "renders/ prefix safe"

Try / catch

try {
  await renderMediaOnCloudRun({...input, renderId: makeRenderId()});
} catch (err) {
  if (err.message.includes('manifest references missing media object')) {
    // chunk media upload was lost - retry the whole render with a new renderId
    await renderMediaOnCloudRun({...input, renderId: makeRenderId()});
  } else {
    throw err;
  }
}

Prevention

When it happens

Trigger: The renderer uploaded the completed status before the large video/audio chunk uploads finished; a bucket lifecycle rule deleted the chunk objects; renderId reuse made one attempt's cleanup remove another's media; an oversized chunk upload failed server-side after the status was already written.

Common situations: Large chunk files timing out on upload in constrained networks; lifecycle rules racing long renders; concurrent renders sharing a bucket prefix; partially upgraded deployments writing inconsistent manifests.

Related errors


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