{"record":{"id":"c2eafb586a653dff","repo":"heygen-com/hyperframes","slug":"neither-puppeteer-nor-puppeteer-core-found","errorCode":null,"errorMessage":"Neither puppeteer nor puppeteer-core found","messagePattern":"Neither puppeteer nor puppeteer-core found","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"packages/engine/src/services/browserManager.ts","lineNumber":60,"sourceCode":"    renderer.includes(\"llvmpipe\") ||\n    renderer.includes(\"lavapipe\") ||\n    renderer.includes(\"softpipe\") ||\n    renderer.includes(\"mesa offscreen\") ||\n    renderer.includes(\"microsoft basic render driver\") ||\n    renderer.includes(\"software rasterizer\")\n  );\n}\n\nasync function getPuppeteer(): Promise<PuppeteerNode> {\n  if (_puppeteer) return _puppeteer;\n  try {\n    const mod = await import(\"puppeteer\" as string);\n    _puppeteer = mod.default;\n  } catch {\n    const mod = await import(\"puppeteer-core\");\n    _puppeteer = mod.default;\n  }\n  if (!_puppeteer) throw new Error(\"Neither puppeteer nor puppeteer-core found\");\n  return _puppeteer;\n}\n\nasync function probeHardwareWebGlInfo(\n  ppt: PuppeteerNode,\n  options: {\n    args: string[];\n    browserTimeout: number;\n    executablePath: string | undefined;\n  },\n): Promise<WebGlProbeInfo> {\n  let probeBrowser: Browser | undefined;\n  try {\n    probeBrowser = await ppt.launch({\n      headless: true,\n      args: options.args,\n      defaultViewport: { width: 64, height: 64 },\n      executablePath: options.executablePath,","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/heygen-com/hyperframes/blob/c2996c8626135db5253519359d8a063d3bafad8d/packages/engine/src/services/browserManager.ts#L42-L78","documentation":"Thrown by getPuppeteer() when both dynamic import('puppeteer') and the fallback import('puppeteer-core') fail. The engine needs a Puppeteer-compatible module to launch headless Chrome for frame capture and audio FX processing. Without it, no rendering can proceed.","triggerScenarios":"getPuppeteer() is called during browser acquisition (acquireBrowser or probeHardwareWebGlInfo). The first import('puppeteer') throws (module not installed), then the catch tries import('puppeteer-core') which also throws. If both resolve but _puppeteer is still falsy (malformed module), the final guard throws.","commonSituations":"Neither puppeteer nor puppeteer-core is in the engine's dependencies (incomplete install, bun install ran in wrong workspace). The packages are installed but node_modules is corrupted or the .pnp.cjs is misconfigured. A monorepo hoisting issue left the module in a sibling package's node_modules.","solutions":["Install the browser dependency: bun install in the engine package root.","Verify the module resolves: run node -e \"require.resolve('puppeteer-core')\" from packages/engine.","If using a custom Puppeteer fork, ensure it exports a default object with a launch() method.","Check for monorepo hoisting issues: if using bun workspaces, verify packages/engine/package.json lists puppeteer or puppeteer-core."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\n\nfunction assertPuppeteerInstalled(): void {\n  try { require.resolve('puppeteer'); return; } catch {}\n  try { require.resolve('puppeteer-core'); return; } catch {}\n  throw new Error('Install puppeteer or puppeteer-core: bun add puppeteer-core');\n}\n\nassertPuppeteerInstalled();","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure packages/engine/package.json lists puppeteer or puppeteer-core as a dependency.","Run bun install in the repo root after cloning or pulling.","In CI, cache node_modules to avoid partial installs.","Use require.resolve at startup to fail fast if the module is missing."],"tags":["browser","puppeteer","dependencies","install","critical"],"backgroundTag":null,"analyzedSha":"c2996c8626135db5253519359d8a063d3bafad8d","analyzedAt":"2026-08-12T22:18:56.877Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}