Recommended Free Tools
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.
#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:
loadwaits for the page’s load event.networkidle0waits 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.
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:
Rank #2
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.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →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.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Rank #3
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.
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
- 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.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsFix: 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.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.
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
- 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.
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
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.

