remotion-dev/remotion · critical · Error

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

Error message

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

What it means

Thrown by linkProgram() inside the waves effect when gl.getProgramParameter(program, gl.LINK_STATUS) returns false. This means the vertex and fragment shaders compiled individually but failed to link into an executable program. The error includes the GL driver's info log. Since the shaders are static library constants, this is a driver/GPU compatibility issue.

Source

Thrown at packages/effects/src/waves.ts:397

};

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(`Waves 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. Update GPU drivers and browser to the latest versions.
  2. Check chrome://gpu for any WebGL2-related warnings or denylisted features.
  3. For server-side rendering, use the latest @remotion/renderer with its bundled Chrome, which is tested for WebGL2 effect compatibility.
  4. Try a different GPU or toggle hardware acceleration to isolate driver vs SwiftShader issues.
  5. Report with the full info log from the error message and GPU details.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const state = setupWaves(canvas);
} catch (e) {
  if ((e as Error).message.startsWith('Waves program link failed')) {
    console.warn('GPU driver failed to link waves program:', (e as Error).message);
    // fall back to a non-WebGL effect or different rendering approach
  }
}

Prevention

When it happens

Trigger: Called transitively from setupWaves() at packages/effects/src/waves.ts:446. Fires when the GL driver cannot link the compiled WAVES_VS and WAVES_FS — e.g., due to mismatched varying/in-out declarations from a driver bug, exceeding uniform/attribute limits on constrained hardware, or a driver-specific linker issue.

Common situations: GPU driver bug rejecting valid linked GLSL ES 3.00 programs; older mobile/integrated GPUs with low uniform limits (the waves fragment shader has many uniforms); software rasterizer with incomplete linker; outdated Chrome/Chromium with a WebGL2 regression.

Related errors


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