Browser modes
TheBROWSER_TYPE setting controls how Skyvern runs the browser.
- Headful: visible browser window (default)
- Headless: no display, runs in the background
- Use Your Own Chrome: runs the installed Chrome app with your logged-in profile
- CDP Connect: connects to an already-running Chrome instance
Headful (default)
.env
Headless
.env
Some websites detect and block headless browsers. If you encounter issues with bot detection, try headful mode with a virtual display.
Use Your Own Chrome
.env
- Running automations with your saved logins and cookies
- Using your installed Chrome extensions
- Avoiding bot detection by using a real Chrome installation
CDP Connect (External Chrome)
.env
- Using your existing browser profile with saved logins
- Debugging with Chrome DevTools
- Running automations on a browser with specific extensions
Docker Compose self-host installs default
BROWSER_STREAMING_MODE to cdp.
Existing installs that already set this variable in .env keep their value.
To opt out of CDP livestreaming, set BROWSER_STREAMING_MODE=vnc in .env.Setting up Use Your Own Chrome
SetCHROME_EXECUTABLE_PATH to your Chrome installation path and Skyvern handles the rest. No need to manually start Chrome with debugging flags.
Step 1: Find your Chrome path
Step 2: Configure Skyvern
- Copy your Chrome profile to a working directory (
./tmp/user_data_dir) - Launch Chrome with remote debugging on port 9222
- Connect via CDP automatically
If port 9222 is already in use (e.g., from a previous session), Skyvern will connect to the existing instance instead of launching a new one.
Setting up CDP Connect
CDP (Chrome DevTools Protocol) lets Skyvern control an external Chrome browser instead of launching its own.Step 1: Enable Chrome remote debugging
For an already-running Chrome profile, prefer Chrome’s built-in remote debugging toggle:- Open
chrome://inspect/#remote-debuggingin Chrome. - Enable remote debugging for this browser instance.
- Keep Chrome open while Skyvern connects.
ws://.../devtools/browser/... URL if Chrome exposes only a WebSocket endpoint.
Docker-reachable isolated profile fallback
When Skyvern runs in Docker, Chrome’s built-in listener may bind to host loopback only. If the container cannot reach it, start a separate Chrome profile with a Docker-reachable CDP endpoint:--user-data-dir flag creates a separate profile for Skyvern, preserving
your main Chrome profile. Since Chrome 136,
--remote-debugging-port is ignored for the default Chrome data directory, so
only use these flags with a non-standard user data directory.
Windows Docker Desktop with chrome://inspect
Chrome’s chrome://inspect/#remote-debugging toggle can bind its debugging
server to host loopback only. Docker Desktop cannot connect to that listener
directly through host.docker.internal. Skyvern includes a Windows helper that
bridges Docker to Chrome and writes the exact WebSocket URL from Chrome’s
DevToolsActivePort file.
Open Chrome, go to chrome://inspect/#remote-debugging, enable remote
debugging, then run this from an Administrator PowerShell in the Skyvern repo:
Windows
0.0.0.0:9223 to Chrome’s
loopback debugging port, adds a matching firewall rule, reads the full browser
WebSocket path, and writes:
.env
Step 2: Configure Skyvern
.env
chrome://inspect flow that
only exposes a browser WebSocket, use the full direct
ws://.../devtools/browser/<id> URL.
When running Skyvern in Docker:
| Host OS | URL |
|---|---|
| macOS/Windows | http://host.docker.internal:9222/ |
| Linux | http://172.17.0.1:9222/ |
host.docker.internal
host name, Skyvern retries with the Docker host gateway IPv4 address. You can
also set BROWSER_REMOTE_DEBUGGING_URL directly to that IPv4 address.
If Windows Defender Firewall blocks the connection from Docker, allow inbound
TCP traffic on port 9222:
Windows
Step 3: Verify connection
For a classic HTTP CDP endpoint, test that Chrome is listening on port 9222:Windows
webSocketDebuggerUrl.
If you used the Windows chrome://inspect helper, the configured URL is a
direct ws://.../devtools/browser/<id> endpoint. In that mode, verify by
starting a Skyvern browser session after restarting the backend.
If
/json/version does not return Chrome version information from inside the
Skyvern container, verify Chrome is listening on 0.0.0.0:9222 or ::9222 and
that Windows Firewall allows inbound traffic on port 9222.Display settings
Configure how the browser appears to websites. These settings affect geolocation detection and content rendering.Locale and timezone
.env
| Region | BROWSER_LOCALE | BROWSER_TIMEZONE |
|---|---|---|
| US East | en-US | America/New_York |
| US West | en-US | America/Los_Angeles |
| UK | en-GB | Europe/London |
| Germany | de-DE | Europe/Berlin |
| Japan | ja-JP | Asia/Tokyo |
Viewport size
.env
Timeout settings
Control how long Skyvern waits for various browser operations..env
When to adjust timeouts
| Symptom | Adjustment |
|---|---|
| Actions fail on slow sites | Increase BROWSER_ACTION_TIMEOUT_MS |
| Screenshots timeout on complex pages | Increase BROWSER_SCREENSHOT_TIMEOUT_MS |
| Page load timeouts | Increase BROWSER_LOADING_TIMEOUT_MS |
| DOM analysis fails on large pages | Increase BROWSER_SCRAPING_BUILDING_ELEMENT_TREE_TIMEOUT_MS |
Advanced settings
Browser logging
.env
Maximum pages
.env
Chrome policies
.env
Video recording path
.env
Memory considerations
Browser instances are memory-intensive. These are approximate guidelines. Actual usage depends on page complexity and browser settings.| Concurrent tasks | Recommended RAM |
|---|---|
| 1-2 | 4GB |
| 3-5 | 8GB |
| 6-10 | 16GB |
| 10+ | 32GB+ |
- Reduce
BROWSER_MAX_PAGES_NUMBER - Use a smaller viewport (
BROWSER_WIDTH,BROWSER_HEIGHT) - Run in headless mode (
BROWSER_TYPE=chromium-headless) - Limit concurrent task execution
Scaling browsers
The default Docker Compose setup runs one browser instance inside the Skyvern container. For higher concurrency:Option 1: Vertical scaling
Add more RAM to your server and increaseMAX_STEPS_PER_RUN and BROWSER_MAX_PAGES_NUMBER.
Option 2: Horizontal scaling
Deploy multiple Skyvern instances behind a load balancer. Each instance runs its own browser. See Kubernetes Deployment for orchestrated scaling.Option 3: External browser pool
Use a browser pool service like Browserless or your own Playwright grid, then connect via CDP:.env
Next steps
Proxy Setup
Configure proxies to avoid bot detection
Storage Configuration
Store recordings and artifacts in S3 or Azure Blob

