{"record":{"id":"5033bd15e2c37c0d","repo":"remotion-dev/remotion","slug":"program-link-failed-log-no-log-5033bd","errorCode":null,"errorMessage":"Program link failed: ${log ?? '(no log)'}","messagePattern":"Program link failed: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"packages/effects/src/zoom-blur/zoom-blur-runtime.ts","lineNumber":58,"sourceCode":"};\n\nconst linkProgram = (\n\tgl: WebGL2RenderingContext,\n\tvs: WebGLShader,\n\tfs: WebGLShader,\n): WebGLProgram => {\n\tconst program = gl.createProgram();\n\tif (!program) {\n\t\tthrow new Error('Failed to create WebGL program');\n\t}\n\n\tgl.attachShader(program, vs);\n\tgl.attachShader(program, fs);\n\tgl.linkProgram(program);\n\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\tconst log = gl.getProgramInfoLog(program);\n\t\tgl.deleteProgram(program);\n\t\tthrow new Error(`Program link failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn program;\n};\n\nconst createProgram = (\n\tgl: WebGL2RenderingContext,\n\tvertexSource: string,\n\tfragmentSource: string,\n): WebGLProgram => {\n\tconst vs = compileShader(gl, gl.VERTEX_SHADER, vertexSource);\n\tconst fs = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);\n\tconst program = linkProgram(gl, vs, fs);\n\tgl.deleteShader(vs);\n\tgl.deleteShader(fs);\n\treturn program;\n};\n","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/zoom-blur/zoom-blur-runtime.ts#L40-L76","documentation":"The zoomBlur shader program failed to link, meaning the vertex and fragment shaders compiled individually but their interfaces (varyings, attribute locations) are incompatible. Since both shaders are internal constants, a link failure points to a GPU driver bug in the linker rather than a user error. The driver's info log is included.","triggerScenarios":"A driver bug where the vertex shader's output varyings do not match the fragment shader's inputs due to a precision or naming discrepancy in the driver's internal representation, or drivers with incomplete GLSL ES 3.00 linking support.","commonSituations":"Older mobile GPUs, virtualized graphics, headless rendering with incomplete WebGL2 driver support, or a GPU driver version with a known linker regression.","solutions":["Update the GPU driver or the browser/SwiftShader version.","Test on a different GPU to confirm driver-specific behavior.","Report the issue to Remotion with the program info log from the error message.","On CI, use a Docker image with a known-good GL stack."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  zoomBlur({ amount: 40 });\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('Program link failed')) {\n    console.error('Program link failed on this GPU:', err.message);\n  } else {\n    throw err;\n  }\n}","preventionTips":["Test the effect on the target GPU.","Keep GPU drivers updated.","Report linker failures with the info log to Remotion."],"tags":["webgl","effects","zoom-blur","gpu","shader","runtime"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}