remotion-dev/remotion · error · Error

Outline program link failed: ${log ?? '(no log)'}

Error message

Outline program link failed: ${log ?? '(no log)'}

What it means

gl.linkProgram() failed for the outline() effect's shader program and the driver link log is embedded in the message. The shaders are library-internal and compiled successfully, so a link failure points to a WebGL2 implementation bug or a degraded context - not to any outline() parameter such as width or color.

Source

Thrown at packages/effects/src/outline.ts:260

const createProgram = (gl: WebGL2RenderingContext): WebGLProgram => {
	const vertexShader = compileShader(gl, gl.VERTEX_SHADER, OUTLINE_VS);
	const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, OUTLINE_FS);
	const program = gl.createProgram();
	if (!program) {
		throw new Error('Failed to create WebGL program');
	}

	gl.attachShader(program, vertexShader);
	gl.attachShader(program, fragmentShader);
	gl.linkProgram(program);
	gl.deleteShader(vertexShader);
	gl.deleteShader(fragmentShader);

	if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
		const log = gl.getProgramInfoLog(program);
		gl.deleteProgram(program);
		throw new Error(`Outline program link failed: ${log ?? '(no log)'}`);
	}

	return program;
};

const createTexture = (gl: WebGL2RenderingContext): WebGLTexture => {
	const texture = gl.createTexture();
	if (!texture) {
		throw new Error('Failed to create WebGL texture');
	}

	gl.bindTexture(gl.TEXTURE_2D, texture);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
	gl.bindTexture(gl.TEXTURE_2D, null);
	return texture;

View on GitHub (pinned to 10db9de073)

Solutions

  1. Re-run the render or restart Studio to get a fresh context
  2. Update Chrome/Chromium and @remotion/effects to the latest versions
  3. Check the embedded driver log - if it mentions context loss, lower --concurrency to reduce GPU pressure
  4. Report to Remotion with the full link log if it reproduces on a specific machine
Defensive patterns

Strategy: try-catch

Try / catch

try {
  await renderMedia({composition, codec: 'h264'});
} catch (err) {
  if (
    err instanceof Error &&
    err.message.startsWith('Outline program link failed:')
  ) {
    // log the driver-provided reason and fall back / retry once
    console.error(err.message);
    await renderMedia({composition: noOutlineComposition, codec: 'h264'});
  } else {
    throw err;
  }
}

Prevention

When it happens

Trigger: Applying outline() on a WebGL2 context where program linking fails (driver bug, SwiftShader edge case, context lost between compile and link). The text after 'Outline program link failed:' is the driver's stated reason.

Common situations: Headless Chrome with buggy GPU/SwiftShader; GPU blocklisted builds; renders that survive shader compilation but fail at link time under memory pressure. Rare in normal desktop use.

Related errors


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