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

Use puppeteer.connect() when the browser already runs in the cloud; use puppeteer.launch() only when Puppeteer should start a local browser. A cloud workflow therefore needs a provider-issued WebSocket/CDP endpoint, the provider’s authentication method, and an intentional session cleanup step. This guide connects to Cloudflare Browser Run, performs a page action, and explains how to adapt the pattern to other hosted browsers.

Launch versus connect: the distinction that determines your code

Puppeteer’s browser-management documentation says: “Usually, you start working with Puppeteer by either launching or connecting to a browser.” Those are different lifecycles:

  • puppeteer.launch(): starts a browser process that your machine or container owns. The full puppeteer package normally downloads a compatible Chrome during installation.
  • puppeteer.connect(): attaches to a browser that is already running. A cloud provider creates that browser and supplies a browserWSEndpoint (a WebSocket/CDP address), plus any required headers or tokens.

A hosted browser is optional. It is useful when you need a managed runtime, a remote region or proxy, isolated sessions, or capacity outside your application server. Confirm the provider’s supported browser/protocol, endpoint format, authentication headers, session lifetime, concurrency limits, data handling and billing before writing production code.

Prerequisites for this quickstart

  • Node.js and a project in which you can install packages.
  • A Cloudflare account with Browser Run enabled.
  • A Cloudflare API token with the Browser Rendering – Edit permission.
  • Your Cloudflare account ID and the Browser Run WebSocket endpoint format shown in Cloudflare’s “Using with Puppeteer (CDP)” guide, updated September 26, 2026.

Never place the token in source control, a browser bundle or a public log. Store it in environment variables or your secret manager.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Elebase USB to USB C Adapter for iPhone 18 Pro Max,USBC Car Charger Adapter
  • Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
  • Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
  • Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
  • Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
  • 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.

Install the library without downloading a local browser

For a remote browser, puppeteer-core is usually the clearest dependency: it provides the Puppeteer API but does not download Chrome. The full puppeteer package includes a compatible-browser download, which is useful for local launches but unnecessary when the provider supplies the browser.

mkdir puppeteer-cloud-demo
cd puppeteer-cloud-demo
npm init -y
npm install puppeteer-core

If your package manager blocks install scripts, the full package may finish without its browser download. That does not affect puppeteer-core, but it will make a local puppeteer.launch() workflow fail until the browser is installed and configured.

Connect to Cloudflare Browser Run with Node.js

The following program keeps the account ID and token outside the file, builds the provider-specific endpoint, sends the token as a bearer header during the WebSocket connection, visits a page, reads its title, saves a screenshot and closes the remote browser.

const puppeteer = require('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 exact Browser Run endpoint documented for your account.
// keep_alive is provider-specific and is expressed in milliseconds.
const browserWSEndpoint =
  `wss://api.cloudflare.com/client/v4/accounts/${accountId}/browser-rendering/connect?keep_alive=60000`;

(async () => {
  const browser = await puppeteer.connect({
    browserWSEndpoint,
    headers: {
      Authorization: `Bearer ${token}`
    }
  });

  try {
    const page = await browser.newPage();
    await page.goto('https://example.com', {
      waitUntil: 'networkidle2',
      timeout: 60000
    });

    console.log('Title:', await page.title());
    await page.screenshot({ path: 'example.png', fullPage: true });
  } finally {
    await browser.close();
  }
})();

Run it with environment variables supplied by your shell or secret manager:

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.
export CLOUDFLARE_ACCOUNT_ID='your-account-id'
export CLOUDFLARE_API_TOKEN='your-browser-rendering-token'
node index.js

The endpoint shown above is illustrative of the documented Cloudflare pattern: account ID in the URL, a keep_alive query value in milliseconds, and a bearer token in the WebSocket handshake. Do not copy that URL to another vendor. Each service defines its own host, path, query parameters and authentication contract.

Rank #2
Anker USB-C Hub, 5-in-1 USB Hub for Laptops, 4K HDMI Multiport Adapter
  • 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
  • 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
  • Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
  • 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
  • What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.

What the script does

  1. puppeteer.connect() attaches to the already-created cloud browser.
  2. browser.newPage() creates a tab in that remote instance.
  3. page.goto() navigates and waits until network activity is mostly idle.
  4. page.title() proves that JavaScript can communicate with the page.
  5. page.screenshot() writes bytes returned by the remote browser to your local filesystem.
  6. The finally block closes the browser even when navigation or capture throws.

Cleanup: disconnect or close?

browser.disconnect() only detaches Puppeteer. The cloud browser and its pages remain alive, which can continue consuming a provider’s session time or concurrency allocation. Use it when another process owns the browser and will close it later.

browser.close() gracefully closes the browser and its pages. Use it when your script created or exclusively owns the session. Follow the provider’s cleanup rules; some APIs require a separate “close session” request after the WebSocket ends.

Isolate workflows with browser contexts

A browser context has separate cookies and local storage from other contexts. Create one when parallel jobs must not share login state, carts or consent decisions:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const context = await browser.createBrowserContext();
const page = await context.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await context.close();

Context support and limits are provider-dependent. Check whether the hosted browser permits multiple contexts and whether they count toward concurrency.

Adapting the pattern to another cloud provider

Every service should be evaluated on the same practical axes:

Rank #3
Sale
Anker USB C Hub, 7in1 Multi-Port USB Adapter, 4K@60Hz USBC to HDMI Splitter
  • Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
  • Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
  • Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
  • Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
  • What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
Question Why it matters
How is a session created? Some services give you a WebSocket URL directly; others require an API call first and return an address.
How is authentication sent? It may be a WebSocket header, a URL token, a short-lived signed URL or a separate API credential.
How long does it live? Keep-alive, idle timeout and maximum duration determine whether long jobs survive.
What can run concurrently? Limits affect queue design, parallel tests and cost.
Where does traffic originate? Region, proxy and data-processing requirements can affect compliance and page behavior.
How is it billed? Providers may meter browser hours, sessions, requests or other units.

CloudBrowser’s documented two-step workflow

CloudBrowser describes a different sequence: call its API to open a cloud browser, receive an address, connect with Puppeteer over WebSocket/CDP, perform actions, then close the browser. Its site advertises live remote desktop, saved sessions, proxies and concurrent-browser allowances; those are vendor descriptions rather than independent performance evaluations.

CloudBrowser currently lists these vendor-published plans (recheck terms before purchase):

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Plan Monthly price Browser hours Concurrent instances Tabs per 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 same page advertises a seven-day Basic trial, annual billing with two months free and a 14-day money-back guarantee. These are CloudBrowser’s published commercial terms, not a recommendation or an independent comparison.

Reliability and performance practices

Set explicit waits and timeouts

Use a navigation timeout appropriate to the target and wait for a meaningful selector when the page has important client-rendered content:

await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
await page.waitForSelector('[data-ready="true"]', { timeout: 30000 });

networkidle2 can be unsuitable for pages with analytics, streams or long polling. A selector or application-level readiness signal is often more deterministic.

Rank #4
Sale
UGREEN USB to USB C Adapter Combo 4-Pack, 10Gbps USB C Converter Space Gray
  • Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
  • Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
  • Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
  • Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
  • Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft

Control resource usage

  • Close pages and contexts as soon as a job finishes.
  • Reuse a browser only when the provider permits it and your isolation model is safe.
  • Limit parallel sessions to the provider’s concurrency allowance; queue excess work rather than repeatedly retrying.
  • Use a bounded retry policy for transient connection failures, with backoff and a maximum attempt count.
  • Capture diagnostics such as URL, status, elapsed time and a redacted session identifier. Never log authorization headers.

Plan for page variability

Bot checks, consent dialogs, geolocation, authentication and third-party scripts can produce different DOMs in a cloud region. Set the required user agent, cookies, viewport and timezone through the provider or Puppeteer only when that provider supports them. Do not assume a local browser’s profile, fonts, IP reputation or installed extensions exist remotely.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Troubleshooting common failures

WebSocket connection rejected

Check the account ID, endpoint path, token value and required permission. Cloudflare’s example requires Browser Rendering – Edit. Confirm that the token is sent as a bearer authorization header during the connection and that Browser Run is enabled for the account.

“Cannot find module ‘puppeteer’” or browser executable errors

Install the package you actually import. Use npm install puppeteer-core for a remote endpoint and import puppeteer-core. If you intended a local launch, install puppeteer and ensure its browser download was not blocked by package-manager policy.

Navigation times out

Verify that the target is reachable from the provider’s network, increase the timeout carefully, and replace a blanket networkidle2 wait with domcontentloaded plus waitForSelector. A page that requires a login, region or proxy may never become ready without those settings.

The process exits but the cloud session remains

Ensure cleanup is in a finally block and use browser.close() when your code owns the session. If the provider has a separate session API, call that documented close operation as well. browser.disconnect() alone intentionally leaves the remote browser running.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Anker USB C Hub, 5-in-1 USBC to HDMI Splitter with 4K Display
  • 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
  • Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
  • Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
  • HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
  • What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.

Parallel jobs see each other’s cookies

Create a separate browser context per workflow, or use separate browser sessions if contexts are not supported. Never share a context between users who must remain isolated.

Or skip the browser setup

If your goal is a clean website image or PDF rather than interactive browser automation, ScreenshotNeo provides a one-request screenshot API and an MCP server for AI clients. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups and chat widgets; each step can be disabled. Only clean shots are billed: bot checks or CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and response headers identify the page verdict and billing status.

Use the API documentation at https://screenshotneo.com/docs/ for all options. A minimal call is:

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

ScreenshotNeo also offers take_screenshot, get_page_info and capture_pdf MCP 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. Sign up for the free plan.

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

When a cloud browser is the right tool

  • Choose puppeteer.connect() when a managed service owns the browser and gives you a WebSocket/CDP endpoint.
  • Choose puppeteer.launch() when you want to own the browser process locally or in your container.
  • Use contexts or separate sessions for cookie and local-storage isolation.
  • Close sessions deliberately, and verify provider-specific limits, pricing and data policies before production deployment.

Frequently Asked Questions

Can I use the full Puppeteer package with a cloud browser?

Yes, but it may download a local Chrome that you do not need. For a remote-only workflow, puppeteer-core avoids that download.

Does puppeteer.connect() create a browser session?

No. It attaches to an already-running browser. Session creation is handled by the cloud provider’s API or endpoint.

What is CDP in this setup?

CDP is Chrome DevTools Protocol, the protocol used by many hosted Chromium services for remote control.

Should I disconnect or close after a job?

Close when your code owns the session; disconnect only when another component is responsible for keeping and closing the browser.

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

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.