remotion-dev/remotion · error · Error

Failed to create program

Error message

Failed to create program

What it means

Thrown by the tv-signal-off effect's createProgram helper when gl.createProgram() returns null after both vertex and fragment shaders compiled successfully. createProgram returns null only when the GL context is lost or has exhausted its internal object table. The library aborts immediately since linking requires a valid program handle.

Source

Thrown at packages/effects/src/tv-signal-off.ts:158

	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
		const info = gl.getShaderInfoLog(shader) ?? 'Unknown shader compile error';
		gl.deleteShader(shader);
		throw new Error(info);
	}

	return shader;
};

const createProgram = (
	gl: WebGL2RenderingContext,
	vertexSource: string,
	fragmentSource: string,
): WebGLProgram => {
	const vertex = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
	const fragment = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
	const program = gl.createProgram();
	if (!program) {
		throw new Error('Failed to create program');
	}

	gl.attachShader(program, vertex);
	gl.attachShader(program, fragment);
	gl.linkProgram(program);
	gl.deleteShader(vertex);
	gl.deleteShader(fragment);

	if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
		const info = gl.getProgramInfoLog(program) ?? 'Unknown program link error';
		gl.deleteProgram(program);
		throw new Error(info);
	}

	return program;
};

const createTvSignalOffState = (

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Reduce concurrent render load to keep GL context object counts within driver limits
  2. Register a webglcontextlost listener and re-run the render after the context is restored
  3. Ensure GPU drivers are up to date and the rendering environment provides a stable GL implementation
  4. If rendering server-side, increase available GPU memory or switch to a GPU instance with more VRAM
Defensive patterns

Strategy: try-catch

Try / catch

try {
  renderWithEffect(canvas, tvSignalOff({amount: 1}));
} catch (err) {
  if (err instanceof Error && err.message === 'Failed to create program') {
    // GL context lost after shader compilation — context is unrecoverable here.
    // Restart the render process or browser instance.
    await restartRenderProcess();
  } else {
    throw err;
  }
}

Prevention

When it happens

Trigger: Both shaders in createProgram compiled without error, but gl.createProgram() returns null. This happens when the WebGL2 context transitions to a lost state between shader compilation and program creation, or when the driver refuses to allocate another program object due to resource limits.

Common situations: GPU driver crash or context loss mid-setup during a long render; headless rendering environments with SwiftShader that enforce strict object limits; running dozens of effects concurrently on a single GPU.

Related errors


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