Skip to main content
Apostate runs on a Linux server with no GPU and no display. The persona’s WebGL values are served whatever the server renders with. The WebGPU adapter is served only in a headed launch as a regular user, as Headless or headed shows. The default persona on Linux is Windows, so a server needs the Windows fonts as well as the browser.

Set up the server

1

Install the system packages

The 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.
The libraries are what 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

On Debian 13 and Ubuntu 24.04, 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

A Windows persona shows only the Windows fonts installed on the host. The command installs them for the current user, so run it as the user that runs the browser. Fonts explains what it installs. To present the server’s own OS instead, pass 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

With headless=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.
The 143 includes a 56-pixel bar on the first tab, which Headless or headed explains. The display is the size of the screen you set with --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:
To run the browser binary headed without the packages, start it under 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-sandbox on 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-sandbox to 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:
On this 2-CPU host, seed 42 presents 2 cores. On a 14-core host the same seed presents 12. Hosts shows how many seeds keep their own cores and memory on each server size.

x86 or arm64

Use an x86 server for Windows and Linux personas. On an arm64 server they report arm 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.