ScalebrowserDOCS

Configuration

Every setting the daemon reads: the four layers and which wins, the TOML blocks with their defaults, and the environment variables that override them.

Last updated

Four layers, later ones win:

  1. built-in defaults
  2. a TOML file, passed with --config
  3. environment variables
  4. command-line flags

Every field has a default, so a daemon with no configuration at all starts and serves.

The top level

KeyDefaultWhat it does
bind_addr127.0.0.1:8787The native API: REST, MCP over HTTP, the CDP WebSocket. Non-loopback requires [tls].
adspower_bindoffThe AdsPower adapter. Loopback only, and off until you set it.
data_dir%ProgramData%\ScalebrowserDatabase, engines, profile directories, the at-rest key.
engines_dirfollows data_dirSet it only to split the tree deliberately. Once set, it stops following.
profiles_dirfollows data_dirSame.
bearer_tokengenerated on first startThe token clients send.
webui_dirthe embedded bundleServe the management interface from a directory instead.
ja4t_reflector_urlnoneAn endpoint that reports the TCP fingerprint it saw. Fetched through the proxy during a check, which is the only way to learn the exit device's fingerprint.
error_reportingfalseCrash reports. Off by default: on an anti-detect product, telemetry nobody asked for is a surprise that costs the relationship.
error_dsnnoneWhere they go. Empty disables reporting whatever the flag says.
log_jsonfalseMachine-readable log lines. On where something parses them, off where a person reads them.

[secret]

Where the at-rest master key comes from. One of the two:

KeyWhat it does
key_envName of the environment variable holding it.
key_filePath to a file holding it.

[capacity]

Hard limits, so a launch is refused rather than the host running out of memory.

KeyDefaultWhat it does
max_concurrent64Browsers on this machine at once.
ram_budget_mb24576Memory the pool may use.
vram_budget_mbnoneVideo memory, when you want a ceiling on it.

Three limits apply to a launch and the strictest wins: these two, and the host's measured free memory. Exceeding any of them is error 4003.

[tls]

KeyWhat it does
cert_pathPEM certificate chain.
key_pathPEM private key.

Required for a non-loopback bind, optional on loopback, and honoured there too if set.

[mcp]

Everything here is decided server-side. No tool call can widen the catalog or leave read-only mode.

KeyDefaultWhat it does
profiles["core"]Which tool profiles are served.
read_onlyfalseMutating tools are neither listed nor executed.
lease_ttl_secs900How long a reservation lives by default.
lease_ttl_max_secs14400Ceiling on what a caller may ask for. Four hours.
url_allowlist[]Exceptions to the open_page address rule. Exact hosts or host:port.
artifact_quota256How many artifacts are kept. One store per daemon, shared by every profile.
artifact_max_bytes24 MiBCeiling on one artifact.
artifact_ttl_secs14400Retention. Matches the lease ceiling, so an artifact from the start of a long run is still there at the end.
allowed_hosts[]Extra Host values the MCP transport accepts, on top of loopback and the configured bind.
snapshot_full_every5Force a full page map every N steps. 0 disables it.
transcribe_command[]Your program for audio challenges. One argument in, text out.
inbox_command[]Your program for non-IMAP inboxes, such as an SMS service.
inbox_require_proxyfalseRefuse an inbox read that would leave over this machine's own connection.

url_allowlist empty is the safe state. Empty means open_page permits public http and https only: no file:, no loopback, no private or link-local networks, no cloud metadata address. Every entry you add is a door into your own network that an agent can walk through.

[observability]

KeyDefaultWhat it does
sample_interval_ms3000Cadence of the background sampler behind GET /v1/metrics.
enable_prometheusfalseThe opt-in scrape endpoint.
prometheus_bind127.0.0.1:9464Its listener. Unauthenticated plaintext; keep it on loopback.

[runs]

KeyDefaultWhat it does
shotstrueKeep a still per step in the activity trail.
shots_max_gb20Disk ceiling for them.
shots_max_age_days30Retention.
page_watchertrueFollow what the bound tab is showing.

[exit]

The exit-address rule.

KeyDefaultWhat it does
enabledtrueThe whole rule.
probe_urlhttps://probe.scalebrowser.net/v1/addrWhere the address is measured.
neighbour_hardfalseTreat two addresses in one IPv4 /24 as a collision, not advice.
heartbeat_secs30Keep-alive beat, where a provider documents an idle cut-off.
check_secs120Address check.
max_draws5How many session tags a start may try before refusing with 4013.

[strict]

What geo_mode = strict_expected does per check, beyond the country. See coherence.

Each key takes one of three words: required refuses the start with error 4002, advisory lets it start and records the finding, off skips the check.

What required refuses depends on the check, and the difference is deliberate. For timezone and observation it means "no start without this evidence", so a check that could not run refuses too. For exit_class it means "a proven datacenter refuses": an exit nobody can place still starts, because without the optional network dataset an ordinary home connection cannot be recognised as one, and refusing on that would turn away every normal proxy.

KeyDefaultWhat it checks
exit_classrequiredA datacenter or hosting exit. Anti-bot systems score the network before any JavaScript runs, so this is the one finding worth a refused start on its own.
timezoneadvisoryThe zone the geo endpoint reports for the exit, against the profile's. Reported, never measured, so a provider that mislabels a city would otherwise lock the profile out.
observationadvisoryThe JA4T observation of the exit. Without ja4t_reflector_url there is nothing to observe and the verdict stays unobserved.

The exit country is not in this table. It is what strict_expected promises, it stays fail closed, and no key weakens it.

Setting observation = "required" makes a reachable reflector part of running this installation: an exit nobody observed then does not start.

[sync] and [remote]

Profile sync and remote access have their own blocks. Both have a switch in the management app, and for remote access that switch is the one to use: the daemon reads it on every beat, so it takes effect without a restart.

Environment variables

Every one of these overrides the TOML.

VariableSets
SCALEBROWSER_BEARER_TOKENThe API token clients send.
SCALEBROWSER_MASTER_KEYThe at-rest key.
SCALEBROWSER_API_TOKENThe pairing token for this machine.
SCALEBROWSER_DATA_DIRdata_dir.
SCALEBROWSER_ENGINES_DIRengines_dir.
SCALEBROWSER_PROFILES_DIRprofiles_dir.
SCALEBROWSER_BIND_ADDRbind_addr.
SCALEBROWSER_ADSPOWER_BINDadspower_bind. Takes the word off.
SCALEBROWSER_WEBUI_DIRwebui_dir.
SCALEBROWSER_CONTROL_PLANE_URLWhere the account lives.
SCALEBROWSER_MCP_PROFILES[mcp] profiles, comma separated.
SCALEBROWSER_MCP_READ_ONLY[mcp] read_only.
SCALEBROWSER_ENABLE_PROMETHEUS[observability] enable_prometheus.
SCALEBROWSER_PROMETHEUS_BIND[observability] prometheus_bind.
SCALEBROWSER_SAMPLE_INTERVAL_MS[observability] sample_interval_ms.
SCALEBROWSER_ERROR_DSNerror_dsn.
SCALEBROWSER_ERROR_REPORTINGerror_reporting.

Two more are about the host rather than the daemon: SB_HOST_GPU_CLASS and SB_HOST_GPU_VENDOR skip the boot GPU probe.

Never set SB_HOST_GPU_CLASS on a machine you are actually running profiles on, unless you also set the vendor. The skipped probe never learns which GPU family the host has, and the profile can then ship a GPU string from the wrong one, which is a contradiction a page finds in one comparison.

Next

Run it on your own machine

Seven days to try it with your own agents on your own sites. Starting the trial needs a card.

Get started