remotion-dev/remotion · error · Error
Outline program link failed: ${log ?? '(no log)'}
Error message
Outline program link failed: ${log ?? '(no log)'} What it means
gl.linkProgram() failed for the outline() effect's shader program and the driver link log is embedded in the message. The shaders are library-internal and compiled successfully, so a link failure points to a WebGL2 implementation bug or a degraded context - not to any outline() parameter such as width or color.
Source
Thrown at packages/effects/src/outline.ts:260
const createProgram = (gl: WebGL2RenderingContext): WebGLProgram => {
const vertexShader = compileShader(gl, gl.VERTEX_SHADER, OUTLINE_VS);
const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, OUTLINE_FS);
const program = gl.createProgram();
if (!program) {
throw new Error('Failed to create WebGL program');
}
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
const log = gl.getProgramInfoLog(program);
gl.deleteProgram(program);
throw new Error(`Outline program link failed: ${log ?? '(no log)'}`);
}
return program;
};
const createTexture = (gl: WebGL2RenderingContext): WebGLTexture => {
const texture = gl.createTexture();
if (!texture) {
throw new Error('Failed to create WebGL texture');
}
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.bindTexture(gl.TEXTURE_2D, null);
return texture;View on GitHub (pinned to 10db9de073)
Solutions
- Re-run the render or restart Studio to get a fresh context
- Update Chrome/Chromium and @remotion/effects to the latest versions
- Check the embedded driver log - if it mentions context loss, lower --concurrency to reduce GPU pressure
- Report to Remotion with the full link log if it reproduces on a specific machine
Defensive patterns
Strategy: try-catch
Try / catch
try {
await renderMedia({composition, codec: 'h264'});
} catch (err) {
if (
err instanceof Error &&
err.message.startsWith('Outline program link failed:')
) {
// log the driver-provided reason and fall back / retry once
console.error(err.message);
await renderMedia({composition: noOutlineComposition, codec: 'h264'});
} else {
throw err;
}
} Prevention
- Keep Chrome and @remotion/effects current (linker bugs get patched upstream)
- Reduce concurrent WebGL effect setups in one browser profile
- Preserve the full error message when reporting - the link log is the diagnostic
When it happens
Trigger: Applying outline() on a WebGL2 context where program linking fails (driver bug, SwiftShader edge case, context lost between compile and link). The text after 'Outline program link failed:' is the driver's stated reason.
Common situations: Headless Chrome with buggy GPU/SwiftShader; GPU blocklisted builds; renders that survive shader compilation but fail at link time under memory pressure. Rare in normal desktop use.
Related errors
- Failed to create WebGL shader
- Outline shader compile failed: ${log ?? '(no log)'}
- Failed to create WebGL program
- Failed to create WebGL vertex array
- Failed to create WebGL buffer
AI-assisted analysis of remotion-dev/remotion@10db9de073 (2026-08-22).
Data as JSON: /api/errors/92d49e03d356e0ac.
Report an issue: GitHub.