From 14044fdc15fef2a27d3113c7c370fd34c1bbbd8b Mon Sep 17 00:00:00 2001 From: Nika Siradze Date: Fri, 21 Aug 2026 15:42:17 +0400 Subject: [PATCH] Give the clip renderer the same delayRender budget the episode renderer has Root.tsx holds the render open with delayRender("Waiting for DM Sans") until the webfonts resolve, and that wait is measured against Remotion's 30s default while the whole bundle is evaluated alongside it. The bundle gained a third composition and about a thousand lines this release, and the Windows runner stopped finishing inside 30s: it timed out, fell through to ASS, and the end-to-end render refuses that fallback. render-full-episode.mjs already carried timeoutInMilliseconds: 120000 for this, so the number is not new, only its reach. render.mjs is the path every clip takes and never had it. v2.6.0 renders all four styles on all three runners; main fails on windows-latest twice in a row and passes on ubuntu and macos, which is the shape of a budget that got tighter rather than something broken. --- remotion/render-audiogram.mjs | 6 ++++++ remotion/render.mjs | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/remotion/render-audiogram.mjs b/remotion/render-audiogram.mjs index 8e6094fa..b62c4ab5 100644 --- a/remotion/render-audiogram.mjs +++ b/remotion/render-audiogram.mjs @@ -22,6 +22,10 @@ */ import { renderMedia, selectComposition } from "@remotion/renderer"; + +// Same reason as remotion/render.mjs: the 30s default is measured against +// the font delayRender competing with the whole bundle. +const DELAY_RENDER_TIMEOUT_MS = 120_000; import { getCachedBundle } from "./bundle-cache.mjs"; import path from "path"; import fs from "fs"; @@ -80,6 +84,7 @@ async function main() { onBundle: () => console.log(" Remotion: bundling (first run, or src/config changed)..."), }); const composition = await selectComposition({ + timeoutInMilliseconds: DELAY_RENDER_TIMEOUT_MS, serveUrl: bundleLocation, id: "Audiogram", inputProps, @@ -95,6 +100,7 @@ async function main() { ); await renderMedia({ + timeoutInMilliseconds: DELAY_RENDER_TIMEOUT_MS, composition: { ...composition, durationInFrames, fps, width, height }, serveUrl: bundleLocation, codec: "h264", diff --git a/remotion/render.mjs b/remotion/render.mjs index 5b2ce349..18578e12 100644 --- a/remotion/render.mjs +++ b/remotion/render.mjs @@ -52,6 +52,11 @@ function clampCaptionFontScale(raw) { } +// Remotion's 30s default is measured against the font delayRender in Root.tsx, +// which competes with evaluating the whole bundle. That bundle has three +// compositions now, and the slowest CI runner does not finish inside 30s. +const DELAY_RENDER_TIMEOUT_MS = 120_000; + async function main() { const opts = parseArgs(); @@ -197,6 +202,7 @@ async function main() { serveUrl: bundleLocation, id: "CaptionedClip", inputProps, + timeoutInMilliseconds: DELAY_RENDER_TIMEOUT_MS, }); const cpus = os.cpus().length; @@ -227,6 +233,7 @@ async function main() { outputLocation: captionOverlay, inputProps, concurrency, + timeoutInMilliseconds: DELAY_RENDER_TIMEOUT_MS, onProgress: ({ progress }) => { const pct = Math.round(progress * 100); if (pct > lastPct + 9) {