BrowserGateway is the open router for cloud browsers. Route Puppeteer and Playwright across every provider you already pay for: Browserless, Steel, Browserbase, Cloudflare Browser Rendering, or your own Chrome. Automatic failover, persistent login profiles across providers, session replay, MCP server, REST API, and observability. Self-host it or use cloud at browsergateway.com.
Hey Product Hunt. I am Isaac.
A few months back, I was running a fleet of headless browsers and kept hitting the same wall. Every browser service I used had different strengths, different offerings, and different limitations. Some were tuned for stealth, some for raw capacity, some for the lowest cost floor. Picking one meant inheriting its limitations everywhere else. Vendor lock-in. And when a provider had a bad day, my app stability was affected.
That was the thing that got me building browser-gateway.
Some providers are good at stealth. Some are good at capacity. Some are good at cost. The router lets me use each one for what it's best at from a single connection URL, and swap between them without touching app code. Anything that speaks CDP works unchanged: Stagehand, browser-use, Puppeteer, Playwright, and any MCP client (Claude Code, Cursor). Failover, capacity gating, and routing strategies (priority chain, round-robin, least-connections, weighted, latency-optimized) all live in the router.
Beyond routing, it captures browser profiles (cookies + localStorage) at session end and injects them on the next connect. Profiles survive across providers. Session recording captures CDP screencast frames and encodes to MP4 in the background. The MCP server lets Claude Code and Cursor spin up browsers on demand. For agents running large batches of tasks, hitting the gateway once lets you distribute load across every provider you have without picking a favorite in advance.
Another use case emerged as I built it: cross-provider testing and benchmarking. If you're checking the reliability of a target site, benchmarking, or running automation research, being able to hit the same URL through several different browser providers gives you a signal you can't get from one.
The approach keeps evolving. Started as a failover proxy. Turned into a state persistence problem when I wanted profiles to survive the swap. Now it's a general-purpose control plane.
Try it:
npm install -g browser-gateway
docker run -p 9500:9500 ghcr.io/browser-gateway/server:latest
Repo: github.com/browser-gateway/browser-gateway
Docs: docs.browsergateway.com
Would love honest feedback. Does this shape make sense to you?