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:
If Docker Desktop reaches Chrome but Chrome rejects the
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
Viewport size
.env
Timeout settings
Control how long Skyvern waits for various browser operations..env
When to adjust timeouts
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.
If you experience out-of-memory errors:
- 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
Storage Configuration
Store recordings and artifacts in S3 or Azure Blob

