BrowserBox Documentation

05 Make it yours

Customer Policy Surface

Customer guide · v19.3.1 · September 29, 2026

In this chapter

5.1 What policy controls #

BrowserBox policy is the customer-facing runtime control surface that answers two distinct questions:

  • Which sensitive actions are allowed or denied?

  • Which browsing targets may the remote browser reach?

The canonical persisted policy file lives at:

~/.config/dosaygo/bbpro/policy/policy.json

BrowserBox normalizes and validates that file before applying it. If a field is omitted, BrowserBox fills in safe defaults for the current schema.

The allowed values listed in this section are based on BrowserBox’s current runtime validation and normalization surface, not on a separate aspirational specification. In practice, customers should be able to trust this section because these values are the same ones BrowserBox validates at load time.

5.2 Canonical policy fields #

The customer-relevant policy bundle currently includes these high-level surfaces:

Field Meaning
transport.certificateErrors Whether BrowserBox enforces certificate validation or explicitly allows self-signed / invalid certificates.
navigation.mode Top-level navigation mode: open, allowlist, or blocklist.
navigation.allowlist Allowed navigation targets when navigation.mode=allowlist. Supports exact host, exact origin, exact URL, and wildcard host patterns.
navigation.blocklist Denied navigation targets when navigation.mode=blocklist.
navigation.privateNetwork.mode Whether private/local targets are denied by default or controlled through an allowlist.
navigation.privateNetwork.allowlist Explicit private/local destinations that may be reached, including exact hosts, IPs, and IPv4 CIDRs.
featureControls.copy Controls copy actions, including modifier shortcuts and context-menu copy paths.
featureControls.paste Controls paste actions, including text insertion into the remote browser.
featureControls.downloads Controls download routes and archive-serving surfaces. When set to deny, the download is cancelled at the browser level before any data is written to disk, and the connected client receives a policy-denied notification.
featureControls.uploads Controls upload routes and file input surfaces.
featureControls.devtools Controls DevTools access.
featureControls.audio Controls the audio sidecar service.
featureControls.automation Controls the BrowserBox automation surface used by the webview API.
featureControls.contextMenu Controls whether the remote-page context menu may open.
featureControls.browserChrome Controls BrowserBox’s own visible browser chrome mode rather than allowing or denying an action.

5.3 Allowed values and defaults #

The most important values customers need to know are listed here directly.

5.3.1 Binary feature controls #

Unless stated otherwise, feature controls are binary decisions:

Field Allowed values Default / note
featureControls.copy allow, deny Required in the persisted policy bundle.
featureControls.paste allow, deny Required in the persisted policy bundle.
featureControls.downloads allow, deny Required in the persisted policy bundle.
featureControls.uploads allow, deny Required in the persisted policy bundle.
featureControls.devtools allow, deny Required in the persisted policy bundle.
featureControls.audio allow, deny Required in the persisted policy bundle.
featureControls.automation allow, deny Required in the persisted policy bundle.
featureControls.contextMenu allow, deny If omitted, BrowserBox currently defaults this field to allow for backward compatibility.

5.3.2 Enumerated policy fields #

Field Allowed values Default / note
transport.certificateErrors enforce, ignore-all Defaults to enforce.
navigation.mode open, allowlist, blocklist Required in the persisted policy bundle.
navigation.privateNetwork.mode deny, allowlist Defaults to deny.
featureControls.browserChrome toggle, api, always-show, always-hide Defaults to toggle.

5.3.3 Identity and access configuration #

Three fields govern identity integration for authenticated BrowserBox deployments:

Field Allowed values Note
identity.authMode magic-link, sso-saml How users authenticate. magic-link uses email-based one-time links; sso-saml routes through an IdP.
identity.ssoProvider none, okta, entra, custom The IdP in use when authMode=sso-saml. Use custom for non-enumerated providers.
identity.peerCapabilityModel shared, scoped Whether multiple connected clients in the same session share capabilities (shared) or each client has its own scoped capability set (scoped).

5.3.4 List-valued policy fields #

Field Allowed entry form
navigation.allowlist Array of non-empty strings. Entries may be exact hosts, exact origins, exact URLs, or wildcard host patterns.
navigation.blocklist Array of non-empty strings. Entries follow the same matching forms as the navigation allowlist.
navigation.privateNetwork.allowlist Array of non-empty strings. Entries may be exact hosts, exact IPs, or IPv4 CIDRs.

5.3.5 Where customers can verify allowed values #

Customers do not have to guess. BrowserBox exposes the current policy surface through the customer-facing policy CLI:

  • bbx policy show --scope global|user prints one persisted policy source.

  • bbx policy show prints the normalized effective policy that BrowserBox is actually using.

  • bbx policy validate --file policy.json validates a candidate policy file against the current code and reports invalid enum values directly.

For example, if a customer uses an unsupported mode, BrowserBox validation reports the current accepted set, such as:

featureControls.browserChrome must be one of:
toggle, api, always-show, always-hide

5.4 Sensitive actions BrowserBox can allow or deny #

These actions currently route through BrowserBox’s policy authorization layer:

Action Customer-visible effect
navigate Page navigation, history navigation, new-tab target creation, and clean-slate navigation flows.
uploads File upload routes and file chooser / file input flows.
downloads Download and archive-serving routes. When denied, the download is cancelled before any data reaches the server’s download directory, and the user sees a policy-denied notification in the BrowserBox client UI.
devtools BrowserBox DevTools service and its websocket bridge.
audio BrowserBox audio service.
copy Keyboard and context-menu copy paths.
paste Keyboard and API-driven paste / insert-text paths.
automation The automation methods exposed through the webview API, such as selector waits, clicks, typing, and evaluation.
contextmenu The remote-page context menu UI.

All of these controls are binary allow / deny decisions except featureControls.browserChrome, which uses explicit UI visibility modes described below.

5.5 Navigation and private-network policy #

BrowserBox separates public browsing control from private/local reachability:

  • navigation.allowlist answers “where may the RBI tab browse?”

  • navigation.privateNetwork.allowlist answers “which private or local destinations may any request reach?”

  • ALLOWED_EMBEDDING_ORIGINS is separate and only controls which parent pages may embed BrowserBox

Mode Behavior
open Any browsing target is allowed, subject to the separate private-network boundary.
allowlist Only configured allowlist entries may be reached.
blocklist All targets are allowed except those matching the configured blocklist.

Allowlist and blocklist entries support:

  • exact host names, for example example.com

  • exact origins, for example https://secure.example.com

  • exact URLs, for example https://secure.example.com/tools?mode=estimate

  • wildcard host patterns, for example *.customer.example

The page a user reaches when a navigation is denied can be replaced with your own; see §4.8.

Note on path-prefix wildcards: patterns such as google.com/maps/* are not yet supported. Matching is currently against the host, origin, or full URL, not against a partial URL path. To permit a specific subdomain, use a subdomain entry such as maps.google.com instead of a path-prefix form. Path-prefix wildcard support is planned for a future release.

5.5.2 Private-network controls #

Private-network policy defaults to deny. Customer policy may widen that boundary explicitly:

Field Meaning
mode=deny Denies private and local targets such as RFC1918 addresses, localhost, and the unspecified addresses 0.0.0.0 and :: by default.
mode=allowlist Keeps the private/local boundary in place but permits explicit entries.
allowlist entries Exact hosts, exact IPs, and IPv4 CIDRs, for example 10.0.0.5, 10.0.0.0/8, and localhost.

IPv4-mapped IPv6 addresses such as ::ffff:10.0.0.5 are classified as the IPv4 address they carry, so they cannot be used to bypass an IPv4 rule. An allowlist entry containing / must be a valid IPv4 CIDR; an invalid or IPv6 CIDR is ignored rather than treated as a host. Run bbx policy validate after editing the allowlist and bbx policy check --action navigate --url <url> to confirm the result for a specific destination.

5.6 Certificate-error policy #

Certificate handling is now policy-driven rather than hidden behind a permanent launch flag.

Mode Behavior
enforce Default. BrowserBox enforces certificate validation and will not silently accept certificate errors.
ignore-all Explicit opt-in for environments that need to reach self-signed or otherwise invalid HTTPS targets.

5.7 Browser chrome policy modes #

featureControls.browserChrome does not allow or deny a risky action. Instead, it governs whether BrowserBox’s own visible browser chrome is shown, hidden, or user-toggleable.

Mode Visible UI User toggle Meaning
toggle visible by default yes Legacy-compatible mode. The user may show or hide BrowserBox chrome unless the embedder locks it.
api visible by default no The embedder may drive UI visibility through the API, but the end user may not toggle it directly.
always-show always visible no BrowserBox chrome must remain visible.
always-hide always hidden no BrowserBox chrome stays hidden for kiosk-style or tightly embedded experiences.

If the embedder sets ui-visible or allow-user-toggle-ui, those values may further restrict the experience. They cannot widen what the server policy allows.

Navigation in always-hide mode: when chrome is hidden, BrowserBox’s built-in back/forward buttons are not visible to the user. However, tab history is preserved internally. Embedders can navigate the remote browser’s history programmatically through the webview API:

await webview.callApi('goBack');
await webview.callApi('goForward');

A context-menu back option is not currently available; it is planned for a future release. In the meantime, embedders that need end-user back navigation in always-hide mode should add their own back button wired to the goBack API call above.

5.8 Per-destination feature controls #

featureControls settings such as downloads and paste are currently global — the same setting applies to all browsing destinations regardless of which site the user is on. Per-destination feature controls (different featureControls per allowlist entry) are planned but not yet supported. If your use case requires different download or clipboard behavior on different sites, the recommended approach is to run separate BrowserBox instances each with a distinct policy configuration.

5.9 Server policy versus embedder policy #

BrowserBox has three relevant policy layers:

  1. Global server policy, stored in /etc/browserbox/policy.json, which applies to every Unix user and Fleet seat.

  2. User server policy, stored in the user’s existing BrowserBox policy directory, which may tighten but never loosen the global policy.

  3. Embedder policy hints, supplied through the canonical webview surface, which may only restrict and never widen the effective server policy.

  • An action is allowed only when every active server-policy scope allows it.

  • With no global policy, the user policy behaves exactly as before.

  • User and embedder restrictions may narrow capabilities further.

  • An embedder cannot override a server-side deny into an allow.

5.10 Customer policy CLI #

BrowserBox ships a policy CLI so customers can inspect, initialize, validate, and test the effective policy surface.

bbx policy help
bbx policy where [--scope global|user] [--json]
bbx policy baselines
bbx policy controls [--json]
bbx policy show [--scope global|user]
bbx policy get [--scope global|user]
bbx policy resolve
bbx policy check --action <name> [--url <https://...>] [--source <tag>]
bbx policy trace [--last <n>]
bbx policy init [--scope global|user] [--baseline regulated|compat]
bbx policy reset [--scope global|user] [--baseline regulated|compat]
bbx policy set [--scope global|user] --file <path/to/policy.json>
bbx policy validate [--scope global|user] [--file <path/to/policy.json>]

5.10.1 Useful commands #

Command Meaning
bbx policy where Prints the resolved Unix principal plus global and user policy paths and status.
bbx policy baselines Lists supported baseline names.
bbx policy controls –json Prints the documented NIST 800-53 and FIPS 140 control surfaces.
bbx policy show Prints the effective policy actually enforced, with source and principal diagnostics.
bbx policy show –scope global Prints the raw stored global policy; use --scope user for the user’s raw policy.
bbx policy resolve Compatibility alias for the compiled / normalized effective policy snapshot.
bbx policy check –action ... Evaluates a single action decision. Exit code 0 means allow; exit code 2 means deny.
bbx policy trace –last 20 Shows recent policy decisions from the decision trace log.
bbx policy init –scope user –baseline compat Creates the selected scope from a named baseline.
bbx policy reset –scope global –baseline regulated Replaces the selected scope with a named baseline.
bbx policy set –scope user –file policy.json Loads, validates, and atomically persists a policy at the selected scope.
bbx policy validate Validates the current persisted policy or an explicitly supplied file.

5.10.2 Recipe: global policy with a per-user tightening #

Set the administrator-owned policy that applies to every BrowserBox Unix user and Fleet seat:

bbx policy set --scope global --file global-policy.json

Optionally set a stricter policy for one Unix user. The operator reads the source file and BrowserBox writes it in the target user’s policy store, so the target account does not need access to the operator’s file:

bbx policy set --scope user --file policy.json --for user-bbx-0901

Inspect the effective policy actually enforced for that user, then inspect the raw user layer if needed:

bbx policy show --for user-bbx-0901
bbx policy show --scope user --for user-bbx-0901
bbx policy where --for user-bbx-0901

The user layer may tighten the global policy but cannot weaken it. Reset only that user’s layer to a named baseline with:

bbx policy reset --scope user --baseline compat --for user-bbx-0901

5.11 Operational visibility #

When policy blocks an action, BrowserBox emits both customer-visible and operator-visible signals:

  • a policy-denied notification in the client UI when a connected client is present at the time of the block

  • server log entries prefixed with [policy-decision]

  • a persistent trace file at /̃.config/dosaygo/bbpro/policy/decisions.ndjson

Actions that currently produce client-visible notifications include:

Action Notification trigger
navigate A navigation to a blocked destination.
downloads A browser download that was cancelled before any bytes reached disk.
copy, paste, devtools, uploads, automation, contextmenu The corresponding action was attempted while denied by policy.
tab-limit A new tab or popup was blocked because the session is at the configured tab cap (BBX_MAX_TABS).

Tab-limit blocks that occur during service startup are silent—they close excess tabs without showing a client notification, since no client is connected yet.

BrowserBox · Published by DOSAYGOHappy browsing.