Skip to main content
A profile is the JSON document of values the browser presents. The browser composes one from the seed and passes it to every child process. You can also write one yourself and pass it with --apostate-profile, or with the profile option of the Python and Node packages. Custom profiles shows how. The schema is config/profile.schema.json, schema version 3. These rules apply to every section:
  • Every section and every field is optional. An absent one leaves that value to the host.
  • No other keys are allowed at any level. The packages refuse a profile with an unknown key, and scripts/validate-release-contract.py --kind profile checks one from the command line.
  • A profile you write replaces composition. The seed and persona switches then have no effect.
Check a profile before you launch it:

Sections

id and source_capture

platform

The User-Agent Client Hints and navigator.platform come from here.

browser

cpu and memory

gpu

GPU models lists the strings each GPU family measured. A renderer string should come with the gl_limits, gl_extensions, gl_precisions and webgpu of the same family, or a page can find the contradiction.

gl_limits

An object of numbers keyed by the WebGL parameter name, such as "MAX_TEXTURE_SIZE": 16384. getParameter() in every WebGL context returns these values on every host. A two-value parameter is two keys: ALIASED_LINE_WIDTH_RANGE_MIN and _MAX, ALIASED_POINT_SIZE_RANGE_MIN and _MAX, MAX_VIEWPORT_DIMS_WIDTH and _HEIGHT. Values can be zero, negative or fractional, as measured. The browser’s own drawing keeps the lower of these and the host’s, and an operation beyond what the host’s GPU can do still fails.

gl_extensions

An array of WebGL extension names as getSupportedExtensions() spells them, each matching ^[A-Za-z0-9_]+$. Extensions the host has and this list lacks are removed. An extension the host lacks is not added, except five that expose only constants: EXT_render_snorm, EXT_texture_norm16, WEBGL_blend_func_extended, WEBGL_compressed_texture_pvrtc and WEBGL_render_shared_exponent.

gl_precisions

getShaderPrecisionFormat() results. Each key is <SHADER>.<PRECISION>, where the shader is VERTEX_SHADER or FRAGMENT_SHADER and the precision is LOW_FLOAT, MEDIUM_FLOAT, HIGH_FLOAT, LOW_INT, MEDIUM_INT or HIGH_INT. Each value has all three fields:

webgpu

Without this section, WebGPU shows the host’s adapter. On Linux, requestAdapter() returns null in headless mode and in a headed launch as root, with or without it. See WebGPU in headless mode on Linux.

screen

window

locale

--fingerprint-locale with one tag writes application, and with a comma list writes accept_languages. Without either field, the UI locale is en-US.

theme

input

audio

media

speech

keyboard

fonts

Font lists has each persona’s families, and Fonts explains how to install them.

network

What navigator.connection reports, and the Save-Data header and the matching Client Hints.

battery

What navigator.getBattery() reports. Without this section, the host’s battery shows.

extensions

Complete example

This is the profile seed 42 composes for a Windows persona with --fingerprint-locale=en-US and --fingerprint-timezone=America/New_York, taken from the command line of the browser’s child processes. It was composed by 0.4.3 on an Apple silicon host, which is why platform.architecture is arm. On an x64 host it is x86. It validates against the schema, and launch(profile="profile.json") presents it.