SECURITY

A browser you rent should never become a way into anything.

Two threat models sit on top of each other here: an untrusted page being rendered inside our infrastructure, and an untrusted caller — human or agent — trying to reach content, money or other tenants. Both are enforced in the same request path, and neither depends on a caller behaving well.

single-use sandboxesno long-lived API keyssigned content deliveryhash-chained audit logsafe-harbour disclosure

Render isolation

SANDBOX

One browser, one request, then destroyed

Every render runs in a single-use sandboxed container with a fresh profile. Nothing survives the response: no cookies, no cache, no disk, no shared memory between tenants.

kernel-level syscall filter · no reuse across callers
EGRESS

SSRF is closed at the network, not in code

The browser’s egress path resolves DNS itself and refuses RFC1918, link-local, loopback, IPv6-mapped and cloud metadata ranges — including after a redirect or a DNS rebind mid-render.

deny 169.254.0.0/16 · 10/8 · 127/8 · re-checked per hop
SCRIPT SCOPE

Your script cannot escape the page

/v1/eval runs in page context with no Node bridge, no file system, no fetch to internal hosts and a hard CPU and wall-clock budget. A script that tries to spawn or read outside the tab fails closed.

no CDP passthrough · 30s wall · 2 vCPU cap
RESOURCE

A hostile page cannot take the fleet down

Per-render memory, CPU, socket and download ceilings, plus a bomb detector for zip, SVG and font payloads. Exceeding any ceiling kills the container and returns 504 unpaid.

512MB · 200 sockets · 25MB body cap
OUTPUT

Responses are data, never instructions

Extracted text and HTML are returned as inert payloads with content-type pinned and prompt-injection markers preserved but escaped, so a downstream agent sees page text as quoted evidence rather than commands.

text/plain · injection markers flagged in meta
TENANCY

No shared state to poison

Caches are keyed per caller and per URL, so one tenant can never seed a response another tenant will read. Sessions are pinned to the wallet that opened them.

cache key = sha256(caller, url, params)

ABUSE MODEL

What a caller cannot do, no matter how it asks.

Ask the renderer to fetch 169.254.169.254 for cloud credentials
Egress resolves and re-checks every hop against a private-range denylist, including redirects and DNS rebinds mid-render.
403 blocked_egress · unpaid
Replay a captured X-PAYMENT header for free renders
Nonces are single-use, bound to the request hash and the wallet, and expire in 120 seconds.
409 nonce_reused
Quote a $0.01 Markdown call, then swap the body for a PDF render
The quote signature covers a hash of the exact body; any change re-quotes at the correct price.
402 re-quote
Prompt-inject the agent through page text to make it publish content
Extracted text is inert data, and the CMS service identity that agents use cannot approve or publish anything.
403 scope_denied
Use the AI assistant to push a change past review
AI and automations write drafts only; promotion needs a human identity distinct from the author.
diff awaits approval
Escalate a translator account into a publisher
Authorization is checked server-side per field write, scoped by model, locale and environment — the UI is not the boundary.
403 · logged with actor and IP
Upload an SVG logo carrying a script payload
Assets are parsed and re-encoded with scripts and external references stripped, then served from an isolated asset host.
asset rewritten · script dropped

HONEST LIMITS

What we do not claim

No vendor can promise an unbypassable system, and a page that says otherwise is selling you something. What we can promise is that every control above is enforced server-side, in the request path, with no client-supplied flag able to switch it off — and that we publish where the edges are.

We cannot vouch for the pages you render

A target site can serve you anything. We isolate it and label it; judging its content is your agent’s job.

Prompt injection is mitigated, not solved

We mark and escape injection patterns and keep page text out of the privileged path. A model that chooses to obey quoted text is still a risk you own.

Your wallet policy is your perimeter

We enforce the caps you set. Set none, and a compromised agent can spend up to your balance.

We hold no certifications yet

We are not currently SOC 2 or ISO 27001 certified, and we will not claim it before an auditor signs it off. Ask us for the current control documentation and we will send what we actually have.

DISCLOSURE

security@MY_DOMAINNAME · PGP 0x9F2C 81A4

First response within one business day. Safe-harbour for good-faith research, bounty paid in USDC, no NDA required to report. Our machine-readable policy lives at /.well-known/security.txt.