The schema
The schema isconfig/profile.schema.json, schema version 3. Every section is optional. Every object in it is closed, so an unknown field is an error.
Profile schema documents every field.
A minimal profile
Save this asprofiles/laptop.json:
profile option. It takes a file path, a dict in Python or an object in Node:
platform section, so navigator.platform is the host’s. This output is from a Mac.
Missing sections are the host’s
The browser composes nothing for a profile you write. A section you leave out keeps the host’s value, not a persona’s. That includes the host’s User-Agent, GPU, fonts, voices and every other surface. The profile above, launched on a Linux server, presents that server’s own User-Agent and GPU. To present a whole machine, fill every section. The next section starts from a composed machine. Theapplication field of locale names one tag, and navigator.languages is then Chrome’s default list for it, as with --fingerprint-locale (Locale and timezone). accept_languages sets the list exactly.
Start from a composed machine
From a checkout of the repository,scripts/profile_resolver.py writes the whole profile a seed composes. It is a Python copy of the browser’s compositor, checked against it with golden digests.
profile. Run the script on the host you will launch on. It caps cores and memory at that host’s and records its CPU architecture, as a launch does. The file has no locale section, so GeoIP or the locale and timezone options fill it.
GeoIP and a profile
GeoIP runs for a profile as for a seed. Its answer, and thelocale and timezone options, replace the profile’s own locale and timezone. Pass geoip=False in Python or geoip: false in Node to keep the values in the file, as the example above does.
Seeds and switches do not apply
A profile you write replaces composition, so the seed and the per-field switches have nothing to act on:--fingerprintinargstogether with a profile is refused:Python raisesProfileError, and Node raisesProfileResolutionErrorwith the codeAPOSTATE_ENVELOPE_SEED_CONFLICT.- The
fingerprintoption is ignored with a profile. --fingerprint-platformand the per-field switches such as--fingerprint-hardware-concurrencyhave no effect.
--fingerprint-explain does not report a profile you wrote. Read the values from a page, as above.
Run it without the packages
The browser takes the profile as base64-encoded JSON in--apostate-profile:
Validate a profile
From a checkout of the repository, the release contract checker validates a file against the schema:ProfileResolutionError profile.cpu.logical_cores must be integer. for the same profile. The schema checks types and fields, not coherence. Nothing checks that your GPU, screen and User-Agent belong to one machine.