Set up the server
1
Install the system packages
The The libraries are what
lib packages are the libraries the browser links against. fontconfig and git are for the fonts, xvfb is for headed launches, zstd lets Python below 3.14 unpack the browser archive, and python3-venv is for the next step.- Debian 13, Ubuntu 24.04
- Debian 12, Ubuntu 22.04
ldd reports missing for the 0.4.3 browser on a minimal image. With them, the browser started headless on Debian 12, Debian 13, Ubuntu 22.04 and Ubuntu 24.04 (arm64 containers, 2026-09-27).2
Install the package and the browser
pip install outside a virtual environment fails with externally-managed-environment. The Node package needs Node 22 or later. Installation covers the cache and offline installs.3
Install the Windows fonts
fingerprint_platform="linux" (Node: fingerprintPlatform: "linux"), which needs no fonts installed.Headless launches
headless=True (Node: headless: true) is the default and needs no display. The package passes --headless=new. The browser leaves HeadlessChrome out of the User-Agent, where stock Chromium writes it in headless mode.
Headed launches
Withheadless=False on a host where WAYLAND_DISPLAY is unset and DISPLAY names no X server that answers, the package starts Xvfb, gives its display to the browser, and stops it when the browser closes. It takes the first free display from :99 up and sets DISPLAY only in the browser’s environment.
--fingerprint-screen-width and --fingerprint-screen-height, or that a profile names, and 3840x2160 otherwise. Each headed launch has its own Xvfb, which used 37 MiB at 3840x2160 (PSS, Debian 13 container). Without Xvfb installed, a headed launch fails with:
xvfb-run, which needs the xauth package, and pass --no-first-run for a new user data directory. Raw binary has the command.
Headless or headed
Two values a page can read differ between the modes. Measured on 2026-09-27 with 0.4.3 in a Debian 13 container (linux-arm64, no GPU), seed 42, Windows persona, run as a regular user:
The same launches in an amd64 container gave the same WebGPU result. Known gaps tracks it. On a Mac, headless also read 87 for
outerHeight - innerHeight and served the adapter.
The headed 143 is the same 87 plus Chromium’s bar for --no-sandbox, 56 pixels high, which the headed launch showed on its first tab. The packages pass that flag as root and in a container, where the sandbox cannot start. Google Chrome never shows the bar. A bar on the first tab has the workaround, and Browser chrome height compares 87 with real Windows.
Run headed on a server when the pages you visit use WebGPU.
Run as a regular user
Under root,navigator.gpu.requestAdapter() returned null in headed launches too (same container and date). Run the browser as a regular user. Run apostate install and apostate fonts install windows as that user too, because both install into the user’s home directory.
If you run as root anyway:
- The packages work as they are. Their driver, Patchright or Playwright, passes
--no-sandboxon every launch. - The browser binary run on its own exits with
Running as root without --no-sandbox is not supported. See https://crbug.com/638180.Add--no-sandboxto its switches.
Server size
A persona never claims more cores or memory than the host has. The browser counts the logical CPUs its process may run on and the physical memory the kernel reports.--fingerprint-explain prints both:
x86 or arm64
Use an x86 server for Windows and Linux personas. On an arm64 server they reportarm in Sec-CH-UA-Arch next to a desktop Intel or NVIDIA GPU. No real Windows machine has that pair, and iphey.com flags it. Hosts explains why.
Check the server
Verify has a script that prints what a page, a worker and the request headers show. Run it on the server, with--headed for a headed launch.