Product·Security

Your code stays
on your hardware.

Agents run local-first on machines you control. Secrets sit in the Keychain, not in our database. Remote control rides an end-to-end encrypted relay (or your own tailnet). Multi-account is config-isolated. Shared links are server-redacted. Transcripts can be crypto-shredded. Audit logs keep a hash-only trail. On BYOK, Continuum is not a markup proxy.

SettingsCodeUsage
security
local-first

code + agents on your hosts

e2e relay

relay sees envelopes, not bytes

keychain

tokens never in plaintext files

audit

hash-only JSONL on the host

your hardware · your keysno markup proxy
01 · Local-first

Compute where the repo already is.

Sessions spawn on a Mac daemon or an enrolled device: your laptop, a Hetzner box, your own cloud account. Continuum orchestrates; it doesn’t become the place your tree lives. The local daemon is the trust root by design. Compromising it compromises everything, and compromising any other tier does not.

Worktrees, PTYs, and agent CLIs stay on that host. Controllers (phone, web, desktop) send commands; they don’t hold the sandbox. The daemon’s listener only accepts peers from loopback and the Tailscale CGNAT ranges, every endpoint requires a bearer token, and non-loopback callers are additionally identity-checked against the tailnet, failing closed if that check errors rather than waving the request through.

Provider CLIs are treated as sandboxed children, not as parts of Continuum. Each one owns its own auth state and its own network egress; Continuum does not proxy or inspect their traffic. If you would rather add a second wall, agents run fine inside a container or on a remote box over SSH, and the control surfaces don’t change.

your hosts your worktrees your CLIs
Code
hosts
this macrepo on disk
hetzner-arm64your account
aws-ec2enrolled
controllers steerhosts execute
Settings
keychain
Keychain · Continuum
claude · primary••••••••••••
claude · work••••••••••••
openrouter · byok••••••••••••
partitioned per instance · not in provider-instances.json
02 · Secrets

Keychain, not a shared secrets file.

Provider tokens and OAuth material live in the OS Keychain, with a separate item per account when you run more than one subscription. Config roots hold non-secret state. The multi-account store intentionally stores no secrets, which is also why a corrupted store can never take your default account away: primaries are seeded in memory and never written to that file at all.

Isolation is per config directory, not a swapped HOME. Continuum sets the provider’s own config variable for the account you pinned and leaves HOME alone, because overriding it broke git, ssh, and gh inside worktrees. Before each spawn the environment is scrubbed of inherited credential variables across every provider prefix, and the account’s own secrets are injected after the scrub, so a variable planted in your shell cannot bleed into a child agent.

Pin resolution fails closed. An unknown pin, a provider that cannot be config-isolated, or a second Claude account with no stored token all refuse to spawn rather than quietly falling back to your primary subscription and billing the wrong plan. Log lines name the account, never its config path. Pair with managed env vars for repo secrets that never leave the host, and see where the CLI keeps its own settings.

03 · E2E relay

The relay can’t read your session.

Paired devices talk through an end-to-end encrypted relay (XChaCha20-Poly1305). The service can see envelope lengths and routing, not prompts, not diffs, not tokens. It never holds the session key, so “trust us not to look” is not part of the design. Prefer zero third parties? Use Tailscale and MagicDNS on your own tailnet and the relay is out of the path entirely.

Every remote write path is rate-limited on the host: roughly one send per second and one configuration swap per five seconds per session, answered with a structured 429 rather than a silent drop. Every one of them is audit-logged. See pairing for the account mesh.

iPhone controller
E2E relay · ciphertext only
Mac host decrypt · execute
Settings
pairing
key material protected at restQR expires in 15 min
04 · Pairing keys

Persistent key material is protected at rest.

Pairing runs an X25519 exchange between the two devices and derives channel keys with HKDF-SHA256, salted with the session id and given a different info string per channel so a leak in one cannot open the other. Frames are sealed with XChaCha20-Poly1305 and random 24-byte nonces.

The QR exchange uses fresh X25519 key pairs, but paired devices retain the derived traffic key and bearer secrets in the system Keychain so they can reconnect. Account-mesh hosts also keep a durable X25519 identity under owner-only file permissions. Those controls protect key material at rest, but they do not provide forward secrecy after an endpoint compromise: someone who later obtains the retained key material may be able to decrypt traffic they captured earlier.

Replay is blocked by a monotonic counter per direction, and the protocol version is bound into the key derivation, so a downgrade attempt derives a different key and simply fails to authenticate. Each side gets its own bearer token; the service stores only their hashes and compares them in constant time, so a screenshotted QR authorizes at most one side and expires fast. Revoking a pairing drops both, closes the socket, and tombstones the session id.

05 · Agent file access

The agent asks. We check.

Some agents don’t touch the filesystem themselves; they ask the client to read and write on their behalf. Continuum does not obey blindly. The file capability is off by default and is only advertised for a repository you have explicitly trusted. An untrusted repository is told the capability does not exist, and every request is refused.

When it is on, every path is canonicalized before any disk touch: .. segments collapsed and symlinks fully resolved, with the resolved result required to sit under the repository root. That defeats traversal, absolute-path escape, and a symlink planted inside the repo pointing at /etc. The handler then operates on the resolved path it was handed rather than re-resolving the agent’s string, which is what closes the gap between check and use.

Reads are byte-capped so a hostile request cannot pin the host, command policy default-denies privilege escalation and catastrophic patterns like recursive deletes and pipe-to-shell, and each operation is logged with a hash of the path rather than the path itself. If you want the same reasoning applied to the agents themselves, read AI coding agent security and how permission modes work.

Code
fs gate
resolve, then usehash-only op log
Code
share · audit
unlisted links · high entropy idsno client widen
06 · Share, shred, audit

Publish carefully. Erase for real.

Shareable transcripts are redacted only on the server, and the redactor is an allowlist walker: messages are rebuilt from a known set of fields and anything it doesn’t recognize is dropped. A field added to the transcript next month cannot leak through a link published today, because the default is exclusion. Raw tool-input JSON is never stored at all. Clients can’t widen what a link exposes. Full product story on share.

Crypto-shred destroys the key material so stored ciphertext is unreadable. Host audit logs are hash-oriented JSONL streams for sends, model swaps, autopilot toggles, and mobile commands, rotating by size and age. They record that something happened and who asked, never the prompt, the diff, or the repo path. Optional Continuum Cloud paths stay opt-in.

07 · BYOK honesty

No markup proxy on your keys.

Bring your own subscriptions and API keys. Continuum drives each provider through its own login path. We don’t sit in the middle reselling tokens at a markup. Optional hosted inference is a separate, explicit product line, and picking it is a decision you make in the model picker rather than something that happens to you.

Multi-account stays config-isolated: work and personal never share a credential store. Wrong pins fail closed instead of billing the primary by accident. See multi-account.

This is the structural difference from a hosted agent product, where your repository is uploaded to the vendor’s sandbox and the vendor holds the model relationship. Compare with Devin, or with a single-vendor CLI in Continuum vs Codex.

BYOK Continuum adds $0

your plans · your keys · your hosts

hosted inference optional

only if you choose Continuum models

08 · Questions

The honest fine print.

Short answers here, long answers in the docs.

No. Code and agent sandboxes stay on hosts you enroll. Cloud paths cover account mesh, optional relay, optional hosted inference, and features you opt into (like share links you publish).

No. Payloads are end-to-end encrypted. The relay routes ciphertext. For zero third-party transport, put controllers and hosts on Tailscale and prefer that path.

Hash-oriented records of sensitive actions (sends, model swaps, mobile commands), not a full transcript dump. Logs rotate by size and age on the host, and live on the host, not in a service you have to trust.

Revoke the pairing. Both bearer tokens are dropped, any open socket is closed, and the session id is tombstoned so it can’t be reused. Re-pairing generates fresh keys and a fresh session; there is no transcript continuity carried across, which is the point. Pairing material also expires on its own after fifteen minutes, so a QR you left on a screen yesterday is already dead.

Not through Continuum. When an agent asks the client to read or write on its behalf, the capability is only advertised for a repository you trusted, and every path is canonicalized with symlinks resolved before the resolved result is required to sit under the repository root. Requests outside it are refused and logged. What the agent’s own process does with its own file access is governed by that CLI’s permission settings, and by the sandbox you run it in.

They’re unlisted with high-entropy IDs and server-side redaction. Anyone with the link can read the published snapshot, so treat links like secrets and shred when you’re done.

09 · Begin

Own the hardware.
Own the keys.

Install on a machine you control and pair the rest of the mesh.

see also · cloud · share · devices · env