Skip to main content
One session is one browser. Every page in a browser shares its machine, its proxy and its storage, so run one browser for each account or job you keep apart.

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 in directory/apostate/identity. Seeds and identity covers both.
Two browsers cannot use one user data directory at the same time. The second launch fails with:
A context from 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 sync launch() 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.
The first run draws the three machines, so yours differ. Every later run prints the same three lines. For sessions with fixed seeds and no stored profile, 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 locale and timezone makes one lookup, through its proxy. A failed lookup does not stop the launch. The persona then uses en-US and 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 :99 up.