How to check it yourself
Here is what Connect does with your connection, claim by claim, where to check it in the source, and where the limits are.
Cloudflare carries the connection
When you link a machine, we create one Cloudflare Tunnel for it and one DNS name, m- followed by 16 hex characters. The tunnel's only route is that name to a port on your machine's loopback address; anything else gets a 404. We set that route through Cloudflare's API with a key limited to tunnels and DNS on runagentos.com, and the app only ever writes a loopback address. Your machine runs Cloudflare's connector, a pinned release checked against its published SHA-256. The connector dials out, so no port opens on your router. Your phone's HTTPS is handled by Cloudflare's network, with its certificate for runagentos.com, on the way down the tunnel. Our servers aren't in that path.
- lib/security/auth.ts · tunnel traffic is never trusted as this machine: it must carry a paired device's token
The client is open source
The part of Connect that runs on your machine is in the AgentOS repository under an open-source licence, and the README's Connect section lists where each piece lives. You can read it, run its tests, and build AgentOS from source instead of installing it from npm.
- README.md#connect-in-development · the Connect section: what runs where
- lib/connect/guard.ts · only the real AgentOS server opens the tunnel: not a dev build, not a second copy
git clone https://github.com/saadnvd1/agent-os && cd agent-os && npm install && npm testDevices get in by pairing
Everything that arrives through the tunnel gets the same check as a stranger on your Wi-Fi: it must carry the token of a paired device. It is never treated as your machine itself, even if it claims to be localhost. New devices are added with a one-time code from your machine or your tailnet. A paired phone can use AgentOS but can't add other devices, and nothing on our side can add one.
- lib/security/auth.ts · who is trusted: this machine, your tailnet, or a paired device
- lib/security/auth.test.ts · tests that tunnel traffic is never trusted as this machine, even with auth off
Approvals use passkeys
Your Connect account signs in with a passkey; we store only its public key. On your machine, approving a new passkey, a hard-line decision or a resume needs a passkey with Face ID or Touch ID, on a challenge tied to that one request, valid once for two minutes. An agent running on your machine can reach every page but can't make your fingerprint reader sign.
- lib/security/presence.ts · the per-request passkey check on your machine
- lib/security/passkeys.ts · how passkeys are added and revoked, and why each change raises an ask
Your work never touches our servers
This site holds your account and the list of your machines. Your code, terminal, agents' output and every key stay on your machine. That's the complete list of what crosses to us, and the section below names the parts that are visible to us.
- lib/connect/config.ts · what your machine keeps locally, and that the keys stay there
The limits
What this design doesn't protect against, so you can decide with the whole picture.
A stolen paired device has full access until you revoke it
A paired phone can do anything you can do in AgentOS. If one goes missing, remove it in AgentOS under Devices (it's cut off at once), or run agent-os disconnect on the machine to switch Connect off entirely.
We can see some things
Your machines' names, whether each is online, your account email, and billing details if you're on Pro. Not the contents of anything.
Cloudflare carries the connection
Your traffic runs on Cloudflare's network, over HTTPS and then the encrypted tunnel to your machine, so you're relying on Cloudflare as a carrier, as much of the web does. Your machine still checks for a paired device on every request. If you'd rather keep everything on a network you run, AgentOS also works over Tailscale or your own VPN.
We hold the key that sets your machine's route
Our servers keep the Cloudflare key that creates your tunnel and its address. It's limited to tunnels and DNS on runagentos.com, and kept out of logs. Whoever held it could change where your address points, which is why the pairing check runs on your machine and not here.
Your machine's address is public
Its hostname is a public DNS name in our zone: m- plus a digest of a random id, not your name. Anyone who learns it reaches Cloudflare's 404 or your machine's pairing screen, nothing more.
Found something that doesn't hold up? Email [email protected].