Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use Puppeteer’s headless: 'shell' launch option to run the separate chrome-headless-shell binary. Install the full puppeteer package so Puppeteer downloads a compatible Chrome for Testing build and shell binary, then launch, automate, and close the browser in a try/finally block. The shell can suit performance-sensitive automation that does not require every Chrome feature, while headless: true uses newer regular headless Chrome behavior.

Install Puppeteer and the shell binary

For the simplest setup, install the end-user package:

npm i puppeteer

The puppeteer package downloads a browser version selected to work with that Puppeteer release. The chrome-headless-shell binary has been included in Puppeteer installations since v21.6.0, according to the installation guide. Browser downloads can be skipped by package-manager policy or CI configuration. If that happens, install the browser explicitly:

npx puppeteer browsers install

Run this command in the project whose Puppeteer installation will launch the browser. If you use a custom cache directory, review Puppeteer’s configuration interface documentation so the install command and runtime look in the same location.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall

Check the runtime before debugging

  • The current system-requirements page lists Node.js 22.12 or newer.
  • Supported Chrome for Testing platforms include Windows x64, macOS x64 and arm64, Debian/Ubuntu Linux x64 and arm64, and openSUSE/Fedora Linux architectures. Linux system packages vary by distribution.
  • Verify the live system requirements page for your Puppeteer release and operating system before deploying.

These requirements are version-sensitive. Do not copy a Linux dependency list from another distribution and assume it applies to yours.

Launch chrome-headless-shell from Node.js

Use an ES module file such as shell-shot.mjs:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({ headless: 'shell' });
try {
  const page = await browser.newPage();
  await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
  console.log(await page.title());
} finally {
  await browser.close();
}

The important setting is the string 'shell'. Puppeteer’s supported headless modes guide documents this value for the separate shell binary. The finally block closes Chromium even when navigation or page code throws, preventing orphaned processes in scripts and workers.

Wait for the page your task actually needs

domcontentloaded waits for the initial document, not every image, font, or API request. Choose a wait condition deliberately:

  • load waits for the page’s load event.
  • networkidle0 waits until there are no active network connections for the required quiet period; analytics or long polling can prevent it from completing.
  • A selector wait is often more reliable for applications that render after an API call:
await page.goto('https://example.com/app', { waitUntil: 'domcontentloaded' });
await page.waitForSelector('[data-ready="true"]', { timeout: 15000 });

Set explicit navigation and selector timeouts for predictable failure handling rather than allowing an indefinite wait.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Shell mode versus regular headless Chrome

Decision point headless: 'shell' headless: true
Browser path Separate chrome-headless-shell binary Newer headless mode in Chrome for Testing
Best fit Performance-sensitive automation that does not need the complete Chrome feature set Tasks where regular Chrome headless behavior and compatibility matter
Behavior Does not completely match regular Chrome Uses the regular Chrome code path described by Puppeteer’s supported-browsers guidance
Selection Explicit string 'shell' Boolean true

Puppeteer describes shell mode as potentially better for suitable automation, but the documentation does not provide a universal speed multiplier. Measure your own workload if latency or throughput determines the choice. Use regular headless Chrome when your automation depends on browser behavior that shell does not reproduce exactly.

Capture a screenshot with shell mode

A complete example loads a page, waits for a meaningful element, and writes a full-page PNG:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({ headless: 'shell' });
try {
  const page = await browser.newPage();
  await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 1 });
  await page.goto('https://example.com', {
    waitUntil: 'domcontentloaded',
    timeout: 30000
  });
  await page.waitForSelector('body', { timeout: 10000 });
  await page.screenshot({ path: 'example.png', fullPage: true });
} finally {
  await browser.close();
}

For a single element, use an element handle and its bounding box:

const card = await page.waitForSelector('.pricing-card');
await card.screenshot({ path: 'pricing-card.png' });

Whether a site renders correctly in shell mode depends on the site’s JavaScript, browser APIs, and resource requirements. If a visual regression or PDF workflow must match users’ Chrome closely, repeat it with headless: true before deciding that a shell difference is a page bug.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use puppeteer-core with a separately managed browser

puppeteer-core does not download Chrome. It is intended for remote browsers or installations managed by your operating system, container, or browser service. Supply an executable path for a local binary:

import puppeteer from 'puppeteer-core';

const browser = await puppeteer.launch({
  headless: 'shell',
  executablePath: '/opt/chrome-headless-shell/chrome-headless-shell'
});
try {
  const page = await browser.newPage();
  await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
  console.log(await page.title());
} finally {
  await browser.close();
}

Use channel when selecting an installed Chrome channel is appropriate for your environment. The exact executable and channel names are platform-dependent; consult Puppeteer’s LaunchOptions interface. Puppeteer guarantees compatibility with its bundled browser, not every arbitrary browser version. With a separately managed binary, pin and validate the browser and Puppeteer versions together.

Keep browser versions and deployments reproducible

Check the support mapping

Puppeteer’s supported browsers page contains the current release-to-Chrome mapping. A captured example listed Puppeteer v25.12.0 with Chrome for Testing 154.0.8037.57; that pairing is version-specific and should not be hard-coded into evergreen deployment documentation. Check the table for the release installed in your project.

Run in Docker only when it helps your deployment

Docker is optional for local development. Puppeteer documents an image and launch pattern that includes Chrome for Testing and required dependencies. Its example uses --init to manage child processes and --cap-add=SYS_ADMIN for the documented sandboxed browser configuration. Follow the current Docker guide for the image, user, sandbox, and security settings; do not add privileged flags without understanding your container policy.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Reuse a browser, isolate pages

Launching a browser for every URL adds startup overhead. A long-running worker can launch one browser and create a new page or incognito context per job. Always close pages and contexts after each job, cap concurrency, and restart the browser after repeated crashes or suspected memory growth. Do not share cookies between tenants unless that is intentional.

Troubleshoot common failures

“Could not find Chrome” or a missing shell executable

Cause: install scripts were blocked, the browser cache is different from the runtime cache, or the download did not complete.

Fix: run npx puppeteer browsers install, confirm the command succeeds in the deployment image, and inspect the configured cache directory. If using puppeteer-core, provide a valid executablePath or connection choice; it never downloads a browser itself.

Navigation times out

Cause: the site is slow, waiting for networkidle0 never settles because of analytics or sockets, DNS is unavailable, or a proxy/firewall blocks Chromium.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fix: test with domcontentloaded, wait for a specific application selector, set a realistic timeout, and verify outbound DNS/HTTPS access from the same machine or container. Capture the URL and timeout in logs.

The page is blank or missing dynamic content

Cause: the script captured before rendering finished, required resources failed, or shell behavior differs from regular Chrome.

Rank #4
Headless Knight On Horse Pumpkin Halloween Costume Men Women Hardcover Journal, Black
  • Grab this Headless Knight On Horse Pumpkin design as an easy, lazy, last minute costume idea for Halloween for men women boys girls kids adults & teens! Collect candy wearing this spooky scary trick or treat tee clothing pj pajama design apparel
  • Tired of dressing up as a scary Witch, Pumpkin, Ghost or Skeleton? Then grab this vintage DIY Headless Knight On Horse Pumpkin design for the next Halloween party! Browse our brand for costume clothes for kids, boys, girls, men, women and family
  • Hardcover journal with 240 line-ruled pages (120 sheets)
  • Built-in elastic closure and ribbon bookmark
  • Includes an expandable inner storage pocket and a pen holder

Fix: wait for the application’s ready selector, inspect console and request failures, and compare with headless: true. If regular Chrome is required for fidelity, use that mode instead of forcing shell.

Linux launch errors mention libraries or sandboxing

Cause: distribution-specific system packages are absent, or the process user and sandbox policy do not match the container setup.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fix: follow the current system requirements for your Linux distribution and the official Docker guidance. Avoid copying flags such as --no-sandbox as a universal fix; changing sandboxing affects security and should be an explicit infrastructure decision.

An alternate browser behaves differently

Cause: the executable is not the version Puppeteer expects.

Fix: prefer the bundled browser, or pin and test your separately managed binary. Review Puppeteer’s support table and record the actual browser version in build logs.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server for developers. One GET request returns PNG, JPEG, WebP, or PDF without managing Chromium yourself. Its cleanup steps accept cookie/consent banners and remove more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be disabled. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing result.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Using the API requires an access key. The same endpoint accepts options for full-page captures with lazy images, CSS-selector element shots, dark mode, 12 device presets or custom viewports, retina scale, PDF paper sizes/margins/landscape/page ranges, custom CSS and JavaScript, pre-capture clicks, hidden selectors, selector/delay/network-idle waits, blocked ads/trackers/requests/resource types, custom headers/cookies/user agents/Authorization, timezone and geolocation, transparent backgrounds, resizing, configurable-TTL caching, signed public-image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage reporting, and an OpenAPI specification. Common screenshot-API parameter names are accepted to ease migration.

Best Value
Headless Horseman Starry Night Halloween Costume Men Women Hardcover Journal, Black
  • Grab this Headless Horseman Starry Night design as an easy, lazy, last minute costume idea for Halloween for men women boys girls kids adults & teens! Collect candy wearing this spooky scary trick or treat tee clothing pj pajama outfit apparel
  • Tired of dressing up as a scary Witch, Pumpkin, Ghost or Skeleton? Then grab this vintage DIY Headless Horseman Starry Night design for the next Halloween party! Browse our brand for costume clothes for kids, boys, girls, men, women and family
  • Hardcover journal with 240 line-ruled pages (120 sheets)
  • Built-in elastic closure and ribbon bookmark
  • Includes an expandable inner storage pocket and a pen holder

cURL:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

See the ScreenshotNeo documentation for parameters and response headers. An MCP server provides take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients. The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.

Cost and reliability choices

Local Puppeteer has no per-shot API charge, but you operate browser downloads, CPU, memory, OS libraries, retries, queueing, and upgrades. A bundled browser gives the clearest compatibility contract. A managed binary or remote browser can fit controlled infrastructure, but you own version validation and connectivity. ScreenshotNeo shifts browser operations to an API and bills only clean shots; compare its plan limits and your own infrastructure costs against the reliability and cleanup features you need.

Frequently Asked Questions

Does headless: 'shell' mean headed mode?

No. It is still headless automation; the value selects the separate chrome-headless-shell binary.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Can I use shell mode with a remote browser?

puppeteer-core supports separately managed or remote browsers, but the connection details depend on that browser service. The bundled-browser compatibility guarantee does not extend to arbitrary versions.

Where are Puppeteer’s browser files stored?

The location depends on Puppeteer’s configuration and cache settings. Keep the browser-install command and runtime configuration aligned, then consult the configuration documentation when customizing the cache.

Quick Recap

Bestseller No. 1
Headless
Headless
$2.99
Bestseller No. 4
Headless Knight On Horse Pumpkin Halloween Costume Men Women Hardcover Journal, Black
Headless Knight On Horse Pumpkin Halloween Costume Men Women Hardcover Journal, Black
Hardcover journal with 240 line-ruled pages (120 sheets); Built-in elastic closure and ribbon bookmark
$16.99
Bestseller No. 5
Headless Horseman Starry Night Halloween Costume Men Women Hardcover Journal, Black
Headless Horseman Starry Night Halloween Costume Men Women Hardcover Journal, Black
Hardcover journal with 240 line-ruled pages (120 sheets); Built-in elastic closure and ribbon bookmark
$16.99

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.