remotion-dev/remotion · error · Error

Radial progressive blur program link failed: ${log ?? '(no l

Error message

Radial progressive blur program link failed: ${log ?? '(no log)'}

What it means

The radial-progressive-blur effect links the compiled vertex and fragment shaders into a single GPU program via gl.linkProgram. If linking fails (gl.LINK_STATUS is false), the effect deletes the program and throws with the driver-supplied info log. Link failures occur when shaders are individually valid but incompatible when combined, or when the driver hits an internal limit.

Source

Thrown at packages/effects/src/radial-progressive-blur/radial-progressive-blur-runtime.ts:74

};

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(
			`Radial progressive blur program link failed: ${log ?? '(no log)'}`,
		);
	}

	return program;
};

const createProgram = (
	gl: WebGL2RenderingContext,
	vertexSource: string,
	fragmentSource: string,
): WebGLProgram => {
	const vs = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
	const fs = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
	const program = linkProgram(gl, vs, fs);
	gl.deleteShader(vs);
	gl.deleteShader(fs);
	return program;

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Read the info log in the error message to identify the mismatched varying, attribute, or exceeded limit
  2. Update GPU drivers to eliminate known link-time false negatives
  3. If the info log indicates a limit (e.g. too many uniforms), reduce shader complexity
  4. Report the bug with driver info and the info log text
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const effect = radialProgressiveBlur({ radius: 10 });
} catch (err) {
  if (err instanceof Error && err.message.includes('program link failed')) {
    console.error('Shader program link failed:', err.message);
    // fall back to a non-WebGL effect or skip
  }
  throw err;
}

Prevention

When it happens

Trigger: Vertex and fragment shaders declare varying/attribute interfaces that do not match; exceeding the driver's maximum number of uniforms, varyings, or attributes during link-time validation; shader source referencing built-in functions removed in the active GLSL ES version.

Common situations: Effect source code changes that alter varyings without updating both shader stages; GPUs with stricter link-time validation than the development machine; driver bugs that report false link failures under memory pressure.

Related errors


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