404PrivacyDocs

Profile anatomy

A profile is a JSON document in the profiles/ catalog. It describes a target browser identity across several layers. STATIC resolves the file, materializes seeded choices once per process, and shares the resulting active profile between requests and the local control API.

Read a profile from the outside in

The shipped chrome-windows.json, edge-windows.json, and firefox-windows.json profiles are concrete examples. This shape omits most real values:

{
  "profile_identity": { "family": "chromium-like", "variant": "chrome", "platform": "windows" },
  "extends": ["primitives/windows-tcp.json"],
  "replace": [["User-Agent", "…"]],
  "replaceDynamic": [["Accept", { "default": "…", "text/html": "…" }]],
  "pass": ["Cookie", "Authorization"],
  "fingerprint": { "user_agent": "…", "platform": "Win32" },
  "tls": { "schema_version": 1, "hello_variants": [], "http2": {} },
  "seeded_overlays": { "screen_profiles": [], "hardware_profiles": [] }
}
SectionReader’s questionConsumer
profile_identityWhich family, variant, and presented platform?Catalog, family checks, JS runtime, packet defaults.
extendsWhich parent JSON should be merged first?Profile loader; relative paths and cycle detection.
remove, replace, replaceArbitrary, replaceDynamic, set, append, passWhich HTTP request headers are targeted?Header stage; pass is parsed but the current stage does not actively filter on it.
fingerprintWhich values and feature flags should the page runtime use?Browser-side configuration and coherence validation.
tls, including http2Which supported outbound transport behavior is desired?TLS plan and wreq fetcher.
seeded_overlaysWhich screen, hardware, media-device, or packet variant is chosen?Materializer before a Flow is processed.

Resolution and selection

The loader recursively discovers JSON profiles, skips non-runtime files such as manifest.json and primitives, resolves extends, and deep-merges parents before applying the child. Seeded overlays are chosen using a startup seed and merged into the materialized profile. That choice stays stable in the running process; a restart may choose another variant. This is not a new random persona per HTTP request.

Proxy startup requires an explicit --profile or configured default profile. The control plane can later select another catalog entry. New Flows read the shared selection; already active Flows retain the profile metadata they captured. Manual operators should use a Chromium-family profile on a Chromium browser and a Firefox-family profile on Firefox. STATIC logs coherence warnings but does not reject every mismatch.

Keep layers coherent

When editing a profile, compare its User-Agent header with fingerprint.user_agent, Client Hints with fingerprint.ua_data, TLS hello variants with browser family, and HTTP/2 settings with the TLS ALPN candidates. A profile value is a target, not a guarantee that the browser, transport library, or packet path can express it.

Follow the same profile into Request headers, TLS, HTTP/2, and JavaScript runtime. See the shipped profiles and ProfileStore implementation.