Plan: I’ll (1) suggest the simplest way to give your VPS a real browser (headless Chromium) your bot can drive, (2) provide copy-paste install commands for common VPS OSes, and (3) show two working approaches: Playwright (recommended) or Puppeteer/Selenium, including a tiny test script to prove it works. You’ve basically got 3 solid ways to give a VPS “Chrome” so your Clawdbot can browse: 1. **Use Playwright + bundled Chromium (easiest, most reliable)** 2. **Install system Chromium/Chrome and drive it with Playwright/Puppeteer/Selenium** 3. **Run a remote browser (Chromium in Docker / browserless) and connect to it over CDP** Below are copy-paste recipes for each. If you follow **Option A**, you usually don’t need Chrome “installed” at all—Playwright downloads a compatible Chromium for you. --- ## Option A (recommended): Playwright with its own Chromium ### Node.js ```bash # in your bot project folder npm i playwright npx playwright install --with-deps chromium ``` Quick test: ```bash node - <<'NODE' const { chromium } = require('playwright'); (async () => { const browser = await chromium.launch({ headless: true }); const page = await browser.newPage(); await page.goto('https://example.com', { waitUntil: 'domcontentloaded' }); console.log(await page.title()); await browser.close(); })(); NODE ``` ### Python ```bash pip install playwright python -m playwright install --with-deps chromium ``` Quick test: ```bash python - <<'PY' from playwright.sync_api import sync_playwright with sync_playwright() as p: b = p.chromium.launch(headless=True) page = b.new_page() page.goto("https://example.com", wait_until="domcontentloaded") print(page.title()) b.close() PY ``` **Why this works:** your bot stops caring whether “Chrome” exists system-wide because Playwright brings a browser runtime that “just works” on servers. --- ## Option B: Install Chromium/Chrome on the VPS and point your bot at it ### Ubuntu / Debian (Chromium) ```bash sudo apt-get update sudo apt-get install -y chromium-browser || sudo apt-get install -y chromium chromium --version || chromium-browser --version ``` If your bot wants `google-chrome` specifically, install Google Chrome (Ubuntu/Debian): ```bash sudo apt-get update sudo apt-get install -y wget gnupg ca-certificates wget -qO- https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-linux.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-linux.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list sudo apt-get update sudo apt-get install -y google-chrome-stable google-chrome --version ``` Then in Playwright/Puppeteer/Selenium, set the executable path, e.g. Playwright (Node): ```js const browser = await chromium.launch({ headless: true, executablePath: '/usr/bin/google-chrome' // or /usr/bin/chromium }); ``` **Common gotcha on VPS:** you often need these launch args (especially in containers): * `--no-sandbox` * `--disable-dev-shm-usage` Example: ```js const browser = await chromium.launch({ headless: true, args: ['--no-sandbox','--disable-dev-shm-usage'] }); ``` --- ## Option C: Remote “browser service” (great if you want stability + scaling) Run a headless browser in Docker and connect to it: ### Browserless (CDP endpoint) ```bash docker run -d --name browserless -p 3000:3000 --restart unless-stopped browserless/chrome ``` Then connect from Puppeteer: ```js const puppeteer = require('puppeteer-core'); (async () => { const browser = await puppeteer.connect({ browserWSEndpoint: 'ws://127.0.0.1:3000' }); const page = await browser.newPage(); await page.goto('https://example.com'); console.log(await page.title()); await browser.close(); })(); ``` This is awesome if you want the bot and the browser isolated, or you run multiple bots. --- ## If your Clawdbot uses a “browser tool” abstraction Many agents/frameworks assume a Chrome binary exists at one of: * `/usr/bin/google-chrome` * `/usr/bin/chromium` * `/usr/bin/chromium-browser` So after installing via **Option A**, you may still need to **tell it the executable path** (or configure it to use Playwright’s bundled one). If the framework only checks for `google-chrome`, **Option B** fixes it immediately. --- ## Fastest “do this now” path If you want the least fuss on a typical Ubuntu VPS: ```bash # Node bot npm i playwright npx playwright install --with-deps chromium ``` …and change your bot’s “browse” implementation to Playwright (or point its browser executable to Playwright’s chromium, if your framework supports it). --- If you tell me **(1)** your VPS OS (Ubuntu/Debian/etc) and **(2)** whether Clawdbot is **Node or Python** and what it uses (Puppeteer/Selenium/Playwright/“browser tool”), I’ll give you the exact minimal config lines for *your* setup.