Security model
bobby drives real browsers on behalf of authenticated callers, so it denies by default. Do not expose the runtime to untrusted networks. Reach it over loopback or a boundary you control.
Guarantees
- Fail closed. Authentication and authorization deny unless a rule allows.
- Scoped tokens. Each token carries a set of capabilities, re-checked on every dispatch, including on long-lived MCP and CDP connections.
- Bounded issuance. Only
authority:admincan mint tokens. Issued tokens are a subset of the issuer's capabilities and expire. The runtime stores digests, never bearers. - No secrets in URLs, logs or committed configuration. Credentials travel in the
Authorizationheader only. - Opt-in JavaScript and vision. Each needs a capability, a session
executionPolicyflag, and for vision a configured provider. Vision tokens live in environment variables named bytoken_env. - Per-principal isolation. Sessions, pages, idempotency keys and quotas belong to one principal. Request, frame and result sizes are bounded.
- Egress control. Outbound requests from the runtime deny private and loopback addresses unless
[http]allows them.
Deployment checklist
- Bind
[server]to loopback unless a trusted network path exists. - Create credentials with
bobby initor a secret manager. Never commit bearers. - Give each job or tenant a principal with the least capabilities it needs, and revoke it when done.
- Keep
[http]egress settings tight. - For vision, use
httpsendpoints (or loopbackhttp) and rotatetoken_envsecrets outside source control. - Treat CDP and MCP as equal in trust to HTTP. The same bearer rules apply.