Accounts & Sign-in
Permissions & Safety
Agents act in your signed-in Chrome, so they can do anything you can. chrome-use checks every action against the site it lands on: sensitive sites and risky actions stop and wait for you. The check runs in the CLI and leaves nothing a page can see.
When chrome-use asks first
While it drives your own Chrome through the extension, the first three wait for your decision by default; the last three are off until you turn them on:
| Case | Default | How it is detected |
|---|---|---|
| Sensitive sites: banking, brokerage, crypto exchanges, government ID | Every action there (opening, clicking, typing, uploading, downloading) asks until you choose "Always allow on this site" | A maintained list in the repo, cli/src/native/sensitive_sites.json. A domain covers its subdomains |
Typing into a payment card field (payment_input) | Ask every time, even on allowed sites | autocomplete cc-*, names or ids with card number, cvv, cvc, expiry and so on, accessible names such as "Card number" or "Security code". fill --from-env is judged by its target field and does not count by itself |
Purchases (purchase) | Ask every time, even on allowed sites | The clicked control is named like a purchase button: Buy now, Place order, Pay, Complete purchase, 立即购买, 提交订单, 購入する and similar |
Typing into a password or one-time-code field (password_input) | Off by default, because agents sign in on their own (auth login, fill --from-env, Bitwarden fills). Turn it on on the options page or in a policy's ask | type=password, autocomplete *-password / one-time-code, names or accessible names with password, passcode, verification code and so on |
Downloads (download) | Off by default, because download automations run unattended. Turn it on on the options page or in a policy's ask | download, download url |
| First action on a new site | Off by default; turn it on per category on the options page | A site with no "always allow" or block decision |
The detection is heuristic. Typing without a ref or selector (focus, then keyboard type) or a pay button with an unusual name can slip through. It is a gate for a person to look, not a sandbox.
--launch and --cdp sessions do not get these defaults (usually nobody is watching there). They follow your policy file only.
Approving
A gated command does not run. It exits with code 3 and prints a confirmation id:
$ chrome-use click @e7
Confirmation required:
click: www.chase.com is a banking or payments site; chrome-use asks before an agent acts there (click)
Site: www.chase.com
Ask the user to choose Allow once, Always allow on this site, or Decline
in the chrome-use side panel or its notification. Then:
Run: chrome-use confirm s_3f9a0c2b1d (waits up to 40s for the choice)
Or: chrome-use deny s_3f9a0c2b1d
Chrome shows a notification, and a card appears in the side panel and under "Permissions & safety" on the options page with three choices: Allow once, Always allow on this site and Decline. When the agent runs chrome-use confirm <id>, it waits up to 40 seconds for your choice and runs the original command if you allowed it.
Only you can approve in the extension: the agent running confirm does not let the action through. chrome-use deny <id> withdraws the request.
With --confirm-interactive at a terminal, the prompt becomes [y]es once / [a]lways on this site / [N]o. "always" lands in the extension's approved-sites list.
Without the extension (--launch, --cdp) or with an extension older than 0.5.93, confirm <id> approves directly, as with --confirm-actions.
Approved sites and permission history
The "Permissions & safety" card on the extension's options page lets you:
- turn the sensitive-site list on or off, and pick which actions always ask (payment card fields and purchases, plus password fields and downloads, which are off by default) and which categories ask the first time on a new site;
- see, add and remove approved and blocked sites (an agent may not act on a blocked site at all);
- read the last 200 permission events: each choice, requests the agent withdrew, and list changes.
Turning the defaults off or extending them
- Options page: turn off "Ask first on sensitive sites", or untick an item under "Always ask before".
- Environment:
CHROME_USE_SENSITIVE_SITES=0turns off the sensitive-site list (not when an organization policy pins it). - The
sitesblock of an--action-policyfile:
{
"deny": [],
"sites": {
"allow": ["intranet.example.com"],
"deny": ["evil.example"],
"confirm": ["payroll.example.com"],
"sensitiveSites": true,
"firstVisit": ["navigation", "upload"],
"ask": ["payment_input", "purchase", "download"]
}
}
allow skips asking, deny refuses, confirm puts a site on the ask-first list. sensitiveSites, firstVisit and ask mean the same as on the options page. A policy file's sites also applies to --launch and --cdp sessions. To add a site to the built-in list, open a PR against sensitive_sites.json.
Precedence, highest first: organization policy, your choices in the extension, the policy file, built-in defaults. A block always beats an allow, and the always-ask actions still ask on allowed sites.
Managed by an organization (Chrome enterprise policy)
The extension reads chrome.storage.managed (its manifest declares managed-schema.json). Values an administrator sets override the user's, and the options page shows them as "Managed" and read-only.
| Key | Effect |
|---|---|
allowedDomains | When not empty, agents may act only on these sites |
blockedDomains | Agents may not act on these sites |
confirmDomains | Every action on these sites asks, even after a user's "always allow" |
sensitiveSites / ask / firstVisit | Pin the matching setting |
actionPolicy | Same shape as an --action-policy file, on top of the local one: deny refuses, confirm needs the user's approval |
disabledAgents | The side panel stops offering these agents (codex, claude, opencode, pi) |
Chrome policy JSON for Windows and Linux (on Linux, in /etc/opt/chrome/policies/managed/):
{
"3rdparty": {
"extensions": {
"ciiljdlhdpfckdcfkphgmfalanpdejep": {
"allowedDomains": ["example.com", "corp.example.com"],
"blockedDomains": ["mail.example.com"],
"confirmDomains": ["payroll.example.com"],
"sensitiveSites": true,
"ask": ["payment_input", "purchase", "download"],
"actionPolicy": { "deny": ["upload", "eval"], "confirm": ["download_url"] },
"disabledAgents": ["opencode"]
}
}
}
}
A macOS .mobileconfig fragment (goes in the PayloadContent array):
<dict>
<key>PayloadType</key>
<string>com.google.Chrome.extensions.ciiljdlhdpfckdcfkphgmfalanpdejep</string>
<key>PayloadIdentifier</key>
<string>com.example.chrome-use.policy</string>
<key>PayloadUUID</key>
<string>9A6E0C1E-0000-4000-8000-000000000781</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowedDomains</key>
<array><string>example.com</string><string>corp.example.com</string></array>
<key>blockedDomains</key>
<array><string>mail.example.com</string></array>
<key>sensitiveSites</key>
<true/>
<key>actionPolicy</key>
<dict>
<key>deny</key>
<array><string>upload</string></array>
</dict>
<key>disabledAgents</key>
<array><string>opencode</string></array>
</dict>
Use the extension id of the build you deploy: the one above is the self-signed build's id; the Chrome Web Store build has its own. chrome://policy shows whether the policy took effect.
Under stealth mode
Every check runs in the CLI daemon. The site comes from the command's URL or the page address the daemon already tracks; whether a field is sensitive is read with CDP DOM.describeNode, so no script runs in the page. The approval UI lives in the extension's own pages (side panel, options page, notification). A page sees no new globals, DOM nodes, events or requests, and stealth mode is unaffected.