heygen-com/hyperframes · critical · Error

Neither puppeteer nor puppeteer-core found

Error message

Neither puppeteer nor puppeteer-core found

What it means

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.

Source

Thrown at packages/engine/src/services/browserManager.ts:60

    renderer.includes("llvmpipe") ||
    renderer.includes("lavapipe") ||
    renderer.includes("softpipe") ||
    renderer.includes("mesa offscreen") ||
    renderer.includes("microsoft basic render driver") ||
    renderer.includes("software rasterizer")
  );
}

async function getPuppeteer(): Promise<PuppeteerNode> {
  if (_puppeteer) return _puppeteer;
  try {
    const mod = await import("puppeteer" as string);
    _puppeteer = mod.default;
  } catch {
    const mod = await import("puppeteer-core");
    _puppeteer = mod.default;
  }
  if (!_puppeteer) throw new Error("Neither puppeteer nor puppeteer-core found");
  return _puppeteer;
}

async function probeHardwareWebGlInfo(
  ppt: PuppeteerNode,
  options: {
    args: string[];
    browserTimeout: number;
    executablePath: string | undefined;
  },
): Promise<WebGlProbeInfo> {
  let probeBrowser: Browser | undefined;
  try {
    probeBrowser = await ppt.launch({
      headless: true,
      args: options.args,
      defaultViewport: { width: 64, height: 64 },
      executablePath: options.executablePath,

View on GitHub (pinned to c2996c8626)

Solutions

  1. Install the browser dependency: bun install in the engine package root.
  2. Verify the module resolves: run node -e "require.resolve('puppeteer-core')" from packages/engine.
  3. If using a custom Puppeteer fork, ensure it exports a default object with a launch() method.
  4. Check for monorepo hoisting issues: if using bun workspaces, verify packages/engine/package.json lists puppeteer or puppeteer-core.
Defensive patterns

Strategy: validation

Validate before calling

import { createRequire } from 'module';
const require = createRequire(import.meta.url);

function assertPuppeteerInstalled(): void {
  try { require.resolve('puppeteer'); return; } catch {}
  try { require.resolve('puppeteer-core'); return; } catch {}
  throw new Error('Install puppeteer or puppeteer-core: bun add puppeteer-core');
}

assertPuppeteerInstalled();

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of heygen-com/hyperframes@c2996c8626 (2026-08-12). Data as JSON: /api/errors/c2eafb586a653dff. Report an issue: GitHub.