projectdiscovery/nuclei · error
the chrome browser is not installed
Error message
the chrome browser is not installed
What it means
Raised when the headless engine is forced to use a system-installed browser — either because options.UseInstalledChrome is set (CLI flag -system-chrome) or a musl-based build (Alpine) makes the downloaded Chromium unusable — and launcher.LookPath() finds no chrome/chromium executable in PATH. Nuclei refuses to fall back to downloading in these modes, so it errors out.
Source
Thrown at pkg/protocols/headless/engine/engine.go:76
Delete("use-mock-keychain").
UserDataDir(dataStore)
if MustDisableSandbox() {
chromeLauncher = chromeLauncher.NoSandbox(true)
}
executablePath, err := os.Executable()
if err != nil {
return nil, err
}
// if musl is used, most likely we are on alpine linux which is not supported by go-rod, so we fallback to default chrome
useMusl, _ := fileutil.UseMusl(executablePath)
if options.UseInstalledChrome || useMusl {
if chromePath, hasChrome := launcher.LookPath(); hasChrome {
chromeLauncher.Bin(chromePath)
} else {
return nil, errors.New("the chrome browser is not installed")
}
}
if options.ShowBrowser {
chromeLauncher = chromeLauncher.Headless(false)
} else {
chromeLauncher = chromeLauncher.Headless(true)
}
if options.AliveHttpProxy != "" {
chromeLauncher = chromeLauncher.Proxy(options.AliveHttpProxy)
}
for k, v := range options.ParseHeadlessOptionalArguments() {
chromeLauncher.Set(flags.Flag(k), v)
}
launcherURL, err = chromeLauncher.Launch()
if err != nil {View on GitHub (pinned to 265b3a3dec)
Solutions
- Install Chrome or Chromium and ensure it is on PATH (e.g. `apt-get install -y chromium` or install google-chrome-stable)
- Drop the -system-chrome flag so go-rod downloads and caches a compatible Chromium automatically
- On Alpine/production images, add the chromium package since musl builds cannot use the downloaded browser
- Verify with `which chromium || which google-chrome` before launching headless scans
Example fix
# before (Dockerfile, alpine, headless fails) FROM alpine:latest RUN apk add --no-cache nuclei # after FROM alpine:latest RUN apk add --no-cache nuclei chromium chromium-chromedriver ENV PATH="/usr/bin/chromium-browser:$PATH"
Defensive patterns
Strategy: validation
Validate before calling
// precheck in a wrapper script before headless scans:
// if !command -v chromium && !command -v google-chrome; then install or drop -system-chrome; fi
if _, hasChrome := launcher.LookPath(); !hasChrome {
return errors.New("system chrome requested but not found; install chromium or omit -system-chrome")
} Prevention
- Verify `which chromium || which google-chrome` in CI before any headless job
- Bake chromium into Docker images that will run headless templates
- Remember Alpine/musl always requires a system browser — the downloaded one will not be used
When it happens
Trigger: Running `nuclei -headless -system-chrome ...` on a machine with no Chrome/Chromium installed; running headless templates in an Alpine-based container without the chromium package (musl detection forces the system-chrome path).
Common situations: Minimal Docker images and CI runners where Chrome was never installed; -system-chrome passed to avoid the Chromium download, but the binary exists only under an unexpected name or is not on PATH; Alpine images where go-rod's bundled browser cannot run.
Related errors
- max sleep count
- js must be at least 1
- payload concurrency must be at least 1
- Invalid action type: %s
- Element did not appear in the given amount of time
AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15).
Data as JSON: /api/errors/ec998ab7130dbfca.
Report an issue: GitHub.