One machine per browser
Give each browser either its own seed or its own user data directory.- A seed fixes the machine.
launch(fingerprint=seed)presents the same machine on every launch, with a temporary profile that the driver deletes on close. - A user data directory keeps the machine together with cookies and storage.
launch_persistent_context(directory)with no seed draws a machine on the first launch and stores its seed indirectory/apostate/identity. Seeds and identity covers both.
new_context() is off-the-record and shares its browser’s machine, so it does not make a second session. Known gaps has the details.
Run browsers concurrently
From 0.4.4, the Python sync API can keep several browsers open in one thread, and they share the thread’s driver. In 0.4.3 a second synclaunch() while one is open fails with an error that contains Sync API inside the asyncio loop. On 0.4.3, use the async API, as the example below does.
The example runs one persistent session per directory, each through its own proxy, with at most four browsers open at a time.
async_sessions.py and many-sessions.mjs launch seeds 1, 2 and 3 at once.
One proxy per browser
proxy applies to the whole browser, so every page you open from it uses that exit. Before each launch, the package looks up the exit’s location through that proxy and gives the persona its locale and timezone, so sessions behind different exits get different ones. When you know each exit’s location, pass locale and timezone and the launch makes no lookup. Proxies covers proxy URLs and sticky exits.
Memory
Memory per browser, each with one page open, headless, Windows persona, apostate 0.4.3, measured 2026-09-27:
On macOS the figure is the summed physical footprint that
footprint reports for the browser’s processes (7 per browser). On Linux it is the summed PSS from /proc/PID/smaps_rollup (9 to 11 processes per browser). Summed RSS counts shared pages once per process and reads 2.2 to 3.2 times higher. Ten browsers had launched and loaded example.com within 4.2 seconds on the Mac and 3.4 seconds in the container.
A headed launch on a server adds its own Xvfb, 37 MiB at the default 3840x2160.
Limits
- Memory. Plan for 350 to 450 MiB per browser on light pages, and measure your own pages.
- Cores. The browser caps every persona at the host’s logical CPU count, not at a share of it. All the browsers run on the same CPUs.
- GeoIP. Each launch without both
localeandtimezonemakes one lookup, through its proxy. A failed lookup does not stop the launch. The persona then usesen-USand the host’s timezone. Locale and timezone has the details. - Displays. Each headed launch on a server starts its own Xvfb, on the next free display number from
:99up.