remotion-dev/remotion · error · Error

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

Error message

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

What it means

Thrown by linkProgram in pixelate.ts when gl.getProgramParameter(program, gl.LINK_STATUS) is false after gl.linkProgram. Both shaders compiled (otherwise 805 would have fired), so a link failure means the vertex and fragment shaders are mutually incompatible at the linker step on this driver, or the driver's linker is buggy. The program's info log is captured before deletion and included in the message.

Source

Thrown at packages/effects/src/pixelate.ts:117

};

const linkProgram = (
	gl: WebGL2RenderingContext,
	vs: WebGLShader,
	fs: WebGLShader,
): WebGLProgram => {
	const program = gl.createProgram();
	if (!program) {
		throw new Error('Failed to create WebGL program');
	}

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

	return program;
};

const createPixelateState = (gl: WebGL2RenderingContext): PixelateState => {
	const vs = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);
	const fs = compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
	const program = linkProgram(gl, vs, fs);
	gl.deleteShader(vs);
	gl.deleteShader(fs);

	const vao = gl.createVertexArray();
	if (!vao) {
		throw new Error('Failed to create WebGL vertex array');
	}

	gl.bindVertexArray(vao);

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Read the interpolated info log in the error — linker errors typically name unmatched varyings or unsupported precision.
  2. Reproduce on stable desktop Chrome; success there points to the render environment.
  3. On Lambda use the published Chrome for Testing layer; avoid custom Chromium builds.
  4. Update or roll back the GPU driver on the failing machine.
  5. If the linker log shows a genuine mismatch, file a Remotion issue with the log and version.

Example fix

// before
import {pixelate} from '@remotion/effects';
const effect = pixelate(); // 'Pixelate program link failed: ...'

// after — log driver identity for triage
try {
  pixelate();
} catch (err) {
  const msg = (err as Error).message;
  if (msg.includes('program link failed')) {
    const dbg = document.createElement('canvas').getContext('webgl2')?.getExtension('WEBGL_debug_renderer_info');
    console.error(msg, 'renderer:', dbg && document.createElement('canvas').getContext('webgl2')?.getParameter(dbg.UNMASKED_RENDERER_WEBGL));
  }
}
Defensive patterns

Strategy: try-catch

Try / catch

try {
  pixelate();
} catch (err) {
  const msg = (err as Error).message;
  if (msg.startsWith('Pixelate program link failed')) {
    // log renderer and info log; this is a driver/library defect, not user error
    console.error(msg);
  }
  throw err;
}

Prevention

When it happens

Trigger: pixelate setup: vertex and fragment shaders both compiled, gl.linkProgram ran, LINK_STATUS is false. The thrown message includes gl.getProgramInfoLog output.

Common situations: Driver bug in the program linker (more common on older mobile GPUs and some virtualized GPUs); a Chrome for Testing build with a stripped or buggy GLSL linker; very rarely, a library change that introduced a vertex/fragment attribute or varying mismatch.

Related errors


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/00d692d1ca5512c8. Report an issue: GitHub.