Free tools Windows power users keep installed
One-click scans. No signup required.
To automate a cloud browser with Puppeteer, connect to the provider’s running browser instead of launching a local one. In code, that means using puppeteer.connect() with a provider-specific browserWSEndpoint, then creating pages, performing your actions, and closing or disconnecting according to the provider’s session rules. This guide uses Cloudflare Browser Run’s current WebSocket/CDP workflow as a concrete example, while explaining what changes with other services.
Launch versus connect: the distinction that matters
Puppeteer’s official browser-management documentation says: “Usually, you start working with Puppeteer by either launching or connecting to a browser.” Those are different operating modes:
puppeteer.launch(): Puppeteer starts a browser process, normally on the machine running your Node.js program.puppeteer.connect(): Puppeteer attaches to a browser that is already running. A cloud provider starts that browser and gives you a WebSocket endpoint (often calledbrowserWSEndpoint).
A hosted browser is not required for Puppeteer. It becomes useful when you need a browser outside your application server, provider-managed isolation, remote debugging, a different network location, or capacity that you do not want to operate yourself. Endpoint format, authentication headers, browser version, session lifetime, concurrency, data handling and billing are provider-specific; never copy one vendor’s URL or options to another.
The examples below use Cloudflare Browser Run. Cloudflare’s guide was updated September 26, 2026, and requires a Cloudflare account with Browser Run enabled plus an API token containing Browser Rendering – Edit permission. Verify the current permission name and terms before deploying.
#1 Best Overall
- Storage: 16GB Flash Memory
- OS: Chrome OS
- Screen Size: 11.6"
Prerequisites and package choice
Node.js and credentials
- A supported Node.js runtime and a project with a
package.json. - A cloud-browser account and an enabled browser product.
- An API token with the provider’s required permission.
- The provider’s WebSocket/CDP endpoint template, account identifier and session-duration rules.
puppeteer or puppeteer-core?
The full puppeteer package downloads a compatible Chrome during installation. puppeteer-core is the library-only package and does not download a browser. For a remote browser, puppeteer-core is usually the clearer choice because the provider supplies Chrome. If your package manager blocks install scripts, the full package’s browser download can fail; that does not prevent a connection to a hosted browser when you use puppeteer-core.
- Create a directory and initialize it:
mkdir puppeteer-cloud-demo && cd puppeteer-cloud-demo && npm init -y. - Install the connection library:
npm install puppeteer-core. - Keep the API token in an environment variable, secret manager or CI secret. Do not commit it to source control.
Cloudflare Browser Run: connect, act, and clean up
Cloudflare’s documented pattern passes a bearer token during the WebSocket connection. The endpoint includes your account ID and a keep_alive value in milliseconds, which controls how long the session remains active. The exact URL is a Cloudflare contract, not a universal Puppeteer endpoint.
Set environment variables
Set these in your shell or deployment secret store:
export CLOUDFLARE_ACCOUNT_ID="your-account-id"
export CLOUDFLARE_API_TOKEN="your-browser-rendering-token"
Use the current endpoint shown in Cloudflare’s Using with Puppeteer (CDP) guide for your account and plan. The following complete example demonstrates the connection shape; keep the endpoint path and query parameters aligned with that guide.
Runnable Node.js example
import puppeteer from "puppeteer-core";
const accountId = process.env.CLOUDFLARE_ACCOUNT_ID;
const token = process.env.CLOUDFLARE_API_TOKEN;
if (!accountId || !token) {
throw new Error("Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN");
}
// Use the current Browser Run endpoint documented by Cloudflare.
const browserWSEndpoint =
`wss://api.cloudflare.com/client/v4/accounts/${accountId}` +
`/browser-rendering/puppeteer/connect?keep_alive=60000`;
const browser = await puppeteer.connect({
browserWSEndpoint,
headers: {
Authorization: `Bearer ${token}`
}
});
try {
const page = await browser.newPage();
await page.goto("https://example.com", {
waitUntil: "domcontentloaded",
timeout: 30000
});
console.log("Title:", await page.title());
await page.screenshot({ path: "example.png", fullPage: true });
} finally {
// Close when this job owns the remote session. Use disconnect()
// instead when the provider expects the session to remain alive.
await browser.close();
}
Save it as index.mjs and run node index.mjs. A successful run prints the page title and writes example.png. If Cloudflare’s current example uses a different endpoint path or connection option, copy that documented value exactly; the authentication and cleanup concepts remain the same.
Rank #2
- Intel Celeron N4120: 4 Cores & Threads, 1.1GHz Base Clock, Up to 2.6GHz Boost Clock, 4MB Cache, Intel UHD Graphics 600. The perfect combination of performance, power consumption, and value helps your device handle multitasking smoothly and reliably with four processing cores to divide up the work.
- 14" HD Display: 14.0-inch diagonal, HD (1366 x 768), micro-edge, anti-glare. See your digital world in a whole new way. Enjoy movies and photos with the great image quality and high-definition detail of 1 million pixels.
- Memory & Storage: 4 GB LPDDR4x & 64 GB eMMC Storage. Adequate high-bandwidth RAM to smoothly run multiple applications and browser tabs all at once. An embedded multimedia card provides reliable flash-based storage.
- Ports:2 x USB 3.0 Type-A,1 x USB 3.0 Type-C,1 x HDMI,1 x Headphone Jack
- Chrome OS: Chromebook is a computer for the way the modern world works, with thousands of apps. Enjoy the seamless simplicity that comes with Google Chrome and Android apps, all integrated into one laptop. It’s fast, simple, and secure.
Why the finally block matters
Remote browsers consume a session while they remain open. Put cleanup in finally so navigation failures, selector timeouts and assertion errors do not leave an orphaned session. browser.close() gracefully closes the browser and its pages. browser.disconnect() only detaches Puppeteer; the browser and pages stay open. Choose deliberately:
- Use
close()for a one-job browser that should be destroyed at the end. - Use
disconnect()when a provider-managed session must remain available for another worker or later reconnect.
Follow the provider’s session and billing rules: some services close idle sessions, while others charge until an explicit close or expiry.
Useful Puppeteer patterns after connecting
Wait for the page you actually need
await page.goto("https://your-site.example/dashboard", {
waitUntil: "networkidle2",
timeout: 60000
});
await page.waitForSelector("main[data-ready='true']", { timeout: 30000 });
const heading = await page.locator("h1").innerText();
Use domcontentloaded for a fast first document, networkidle2 when client-side resources must settle, and an explicit selector when the application exposes a reliable readiness marker. Avoid indefinite waits; cloud sessions should have a bounded timeout.
Isolate state with browser contexts
A browser context isolates cookies and local storage from other contexts in the same browser. This is useful for parallel users or tests that must not share login state.
const context = await browser.createBrowserContext();
const page = await context.newPage();
await page.goto("https://example.com");
await context.close();
Context support and limits can vary by hosted browser, so check the provider’s documentation before creating many contexts concurrently.
Rank #3
- FOR HOME, WORK, & SCHOOL – With an Intel processor, 14-inch display, custom-tuned stereo speakers, and long battery life, this Chromebook laptop lets you knock out any assignment or binge-watch your favorite shows..Voltage:5.0 volts
- HD DISPLAY, PORTABLE DESIGN – See every bit of detail on this micro-edge, anti-glare, 14-inch HD (1366 x 768) display (1); easily take this thin and lightweight laptop PC from room to room, on trips, or in a backpack.
- ALL-DAY PERFORMANCE – Reliably tackle all your assignments at once with the quad-core, Intel Celeron N4120—the perfect processor for performance, power consumption, and value (2).
- 4K READY – Smoothly stream 4K content and play your favorite next-gen games with Intel UHD Graphics 600 (3) (4).
- MEMORY AND STORAGE – Enjoy a boost to your system’s performance with 4 GB of RAM while saving more of your favorite memories with 64 GB of reliable flash-based eMMC storage (5).
Pass data safely
Use environment variables for tokens, and pass application credentials through the provider’s supported headers, cookies or secret mechanisms. Do not place secrets in URLs, screenshots, logs or page source. If you set custom headers for the page, distinguish those from the authorization header used to open the browser session.
Provider alternatives and how to compare them
Cloudflare is one documented route. CloudBrowser describes a different workflow: call its API to open a cloud browser, receive an address, connect with Puppeteer over WebSocket/CDP, perform work, then close the browser. Its site advertises live remote desktop, saved sessions, proxies and concurrent-browser allowances; these are vendor claims rather than independent performance evaluations.
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 →| Question | Cloudflare Browser Run | CloudBrowser |
|---|---|---|
| How a session starts | Connect to the documented Browser Run WebSocket/CDP endpoint. | Call the API to open a browser, then connect to the returned address. |
| Authentication/setup | Cloudflare account, Browser Run enabled and token with Browser Rendering – Edit permission. | Account and the vendor’s API credentials; exact requirements are provider-specific. |
| Capacity and concurrency | Confirm current limits in Cloudflare’s service terms. | Published plan allowances are shown below. |
| Remote visibility | Use capabilities documented for Browser Run. | Vendor advertises live remote desktop and saved sessions. |
| Network/proxy needs | Check Cloudflare’s supported egress and data-handling rules. | Vendor advertises proxies; verify locations and acceptable-use terms. |
| Performance | Not established by the cited documentation. | Not independently established; do not infer speed from plan limits. |
CloudBrowser’s own pricing page currently lists the following vendor-published terms (recheck them before purchase):
| Plan | Published price | Browser hours/month | Concurrent instances | Tabs/browser |
|---|---|---|---|---|
| Basic | $25/month, billed monthly | 250 | 10 | 3 |
| Premium | $90/month, billed monthly | 1,000 | 25 | 3 |
| Custom | Contact vendor | Not stated | Not stated | Not stated |
The page also states a 7-day Basic trial, annual plans with two months free and a 14-day money-back guarantee on paid plans. These are CloudBrowser’s terms, not market-wide standards. Decide whether you need a hosted browser at all: for a small, trusted workload, local launch() may be simpler and cheaper; for isolation, remote networking or managed capacity, compare the provider’s limits, data region, retention, concurrency and billing model.
Or skip the browser setup
If your actual goal is a clean screenshot rather than interactive browser automation, ScreenshotNeo is the first service to try: it removes cookie banners, newsletter popups and chat widgets before capture, bills only clean shots, and has the lowest paid plan listed here.
One GET request returns PNG, JPEG, WebP or PDF. The API accepts a URL and key, while options cover full-page capture with lazy images, CSS-selector elements, dark mode, device presets, retina scale, PDF paper and page ranges, custom CSS/JavaScript, clicks, waits, blocked resources, headers, cookies, user agent, timezone, geolocation, transparency, resizing, caching, signed links, asynchronous webhooks and bulk capture of up to 100 URLs. Failed loads, blank pages, bot checks/CAPTCHAs and cache hits are not billed, and response headers identify the page verdict and billing result.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Rank #4
- 14" fhd ips touchscreen display with 360 flip; Intel 4k graphics
- Intel n100 processor 4-core up to 3.40ghz, 4gb ddr5 ram, 64gb storage
- 1x usb type c, 1x usb type a, 1x headphone microphone jack,
- Super fast 6th gen wifi and bluetooth 5, 720p webcam with integrated dual array digital microphones
- Chrome os, serenity blue color, ac charger included
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo API documentation for parameters and response headers. An MCP server also exposes take_screenshot, get_page_info and capture_pdf to Claude, Cursor and other MCP clients. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.
Troubleshooting remote Puppeteer sessions
WebSocket connection fails immediately
- Cause: wrong account ID, endpoint path, query parameter or token header.
- Fix: copy the current provider endpoint exactly, verify the token is active and confirm the required permission. Check that your runtime can make outbound WebSocket connections.
Unauthorized or forbidden response
- Cause: token scope is insufficient or the product is not enabled.
- Fix: enable Browser Run and grant the documented Browser Rendering – Edit permission, then rotate the token if it was exposed.
Session expires during navigation
- Cause:
keep_aliveor provider idle limits are shorter than the job. - Fix: set a documented keep-alive value long enough for the workflow, reduce unnecessary waits, and still close the session when finished.
Navigation timeout or blank content
- Cause: the target site is slow, blocks the provider’s network, requires authentication, or depends on scripts that have not finished.
- Fix: raise the navigation timeout within a global job limit, choose an appropriate
waitUntil, wait for a specific selector, and inspect the provider’s network and domain restrictions. Do not retry indefinitely.
Browser process or memory limits
- Cause: too many pages, contexts or simultaneous sessions.
- Fix: close pages and contexts, cap concurrency with a queue, reuse a session only when isolation permits, and confirm the provider’s documented limits.
Screenshot differs from local Chrome
- Cause: hosted browser version, viewport, timezone, geolocation, fonts or network path differs.
- Fix: set these values explicitly where supported, record the browser/provider version, and compare against a controlled local run.
Reliability, security and cost checklist
- Pin compatible Node.js and Puppeteer versions, and review the Puppeteer documentation version currently displayed (25.12.0 when checked).
- Use bounded timeouts for connection, navigation, selectors and the overall job.
- Always clean up in
finally; chooseclose()ordisconnect()intentionally. - Keep tokens in a secret manager, restrict token permissions and redact them from logs.
- Measure session duration, page count, retries and provider errors so billing surprises are visible.
- Confirm supported Chrome/CDP protocol versions, concurrency, geographic processing, retention and acceptable-use rules with the provider.
- Retry transient connection failures with backoff, but do not retry authentication errors or destructive page actions blindly.
FAQ
Can I use the full puppeteer package with a cloud browser?
Yes, but it downloads a local compatible Chrome during installation. For a provider-supplied browser, puppeteer-core avoids that download.
Does browser.disconnect() stop the cloud browser?
No. It detaches Puppeteer while leaving the browser and pages running. Use browser.close() when the session should end.
Is Cloudflare’s endpoint compatible with every hosted browser?
No. The endpoint, authentication, keep-alive parameter and limits in the example are Cloudflare-specific. Other providers may require an API-created session and a returned WebSocket address.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallCrashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteDo I need Puppeteer to create a screenshot API call?
No. ScreenshotNeo accepts a single authenticated GET request when you need rendered output rather than an interactive browser session.
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.

