remotion-dev/remotion · error · Error

Failed to create WebGL program

Error message

Failed to create WebGL program

What it means

Thrown by wave-runtime's linkProgram when gl.createProgram() returns null. A null program object means WebGL refused the allocation on context loss or object-limit exhaustion. Wave links its compiled shaders into this program, so it cannot continue without one.

Solutions

  1. Reload to reset the WebGL2 context.
  2. Lower concurrent WebGL effect count.
  3. Confirm hardware-accelerated WebGL2 and update drivers.
  4. Free effects on offscreen/unmounted sequences.

Example fix

// before
const effect = wave({amplitude: 60, wavelength: 240});

// after
const effect = (() => {
  try { return wave({amplitude: 60, wavelength: 240}); } catch { return null; }
})();
Defensive patterns

Strategy: try-catch

Try / catch

let effect = null;
try {
  effect = wave({amplitude: 60, wavelength: 240});
} catch (err) {
  console.warn('wave program alloc failed, skipping effect', err);
}

Prevention

When it happens

Trigger: wave setup calls createProgram -> linkProgram after both shaders compile; gl.createProgram() returns null because the context is lost or the program-object budget is reached.

Common situations: Context loss with many concurrent effects; driver/GPU object caps; headless Chrome under memory pressure.

Related errors


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

Appendix: source

Thrown at packages/effects/src/wave/wave-runtime.ts:50

	gl.shaderSource(shader, source);
	gl.compileShader(shader);
	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
		const log = gl.getShaderInfoLog(shader);
		gl.deleteShader(shader);
		throw new Error(`Shader compile failed: ${log ?? '(no log)'}`);
	}

	return shader;
};

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(`Program link failed: ${log ?? '(no log)'}`);
	}

	return program;
};

const createProgram = (
	gl: WebGL2RenderingContext,
	vertexSource: string,
	fragmentSource: string,

View on GitHub (pinned to 78fe4bb3fd)