Email sign-in is pairing. Mac, iPhone, web, Windows, Linux: devices on the same Continuum account auto-join the mesh. Traffic is end-to-end encrypted. Advanced users still get MagicDNS and QR. Push arrives for turn complete and plan attention. Know which machines are controllers vs hosts, and revoke anything you don't trust.
You don't juggle a separate "pair token" for every new laptop. Sign in with email on a device and it joins the same account mesh. Sessions, devices, and push targets follow the identity.
Open a session on the Mac, pick it up on the phone, approve from the web. Same pool described on sessions.
The old model was pairwise: this phone knows that Mac, and a third machine means a third ceremony. It breaks the moment you add a work laptop, reinstall an OS, or hand a spare Mac to a teammate. Identity-first pairing collapses all of that into one question, asked once per device: are you signed in?
"It just works" is a description, not a mechanism. Here is what actually runs when a fresh device finishes sign-in, so you can reason about what breaks and what a revoke takes away.
Magic link or OAuth, on whichever client you opened first. Nothing is copied off another machine, so a laptop with no existing install is not a second-class citizen.
The device registers against the account and holds its own credential. Devices never share one long-lived secret, which is what makes per-device revoke meaningful instead of cosmetic.
Hosts, sessions, and push targets are looked up by identity. A newly signed-in browser sees the same session pool your Mac has been staring at all morning.
This is why a borrowed machine is useful within a minute. Sign in at continuumcode.ai/app and the browser is a full controller with no install, no repo clone, and no provider keys of its own. If you have been driving agents through a terminal on a jump box, the tradeoff is worth comparing against running Claude Code over SSH, where every new client means another key, another tmux habit, and another thing to forget to revoke.
Controllers reach hosts over an end-to-end encrypted relay. The relay never holds plaintext prompts or diffs. Prefer your own network? Use MagicDNS and Tailscale so traffic never leaves the tailnet.
The wire format is XChaCha20-Poly1305 sealed envelopes. What the relay can read is deliberately short: protocol version, sender role, envelope type, byte counts, connection timing. Your prompts, diffs, plan text, and approval decisions are sealed under a key it does not hold.
Legacy and advanced flows still support QR pairing and explicit URLs for air-gapped or special setups. Deep security notes on security.
They are not fallbacks in a chain you cannot see. Each one is a real path with a different trust boundary, and you can pick the one that matches your network.
The default, and the one that works from a hotel network or a phone on cellular. Ciphertext in, ciphertext out. Each pairing derives fresh keys, so nothing long-lived persists across pairings.
Turn on Prefer MagicDNS host in pairing QR and the pairing URL carries a stable hostname instead of an IP. Sleep, wake, switch Wi-Fi: the name still resolves, so you never re-scan a dead code.
The Mac's own UI talks to its own daemon over loopback. It is the same authenticated contract the phone uses, which is why a bug you hit on the desk reproduces on the phone.
All three land on the same gate. The host daemon listens on a local HTTP and WebSocket port pair, accepts connections only from loopback, the CGNAT range Tailscale uses, and the Tailscale IPv6 block, and requires a bearer credential on every endpoint. Anything arriving from outside loopback is additionally checked against the tailnet's own identity service, and that check fails closed: if it cannot verify the peer, the request is refused rather than waved through.
When a turn finishes or a plan needs attention, push finds the controllers on your account, not only the machine that started the run. Tap through into the live session.
The notification says why it fired: which session, which repo, how long the turn ran, and what it wants. A plan waiting on approval reads differently from a finished run, so you can triage from the lock screen instead of unlocking to find out. That matters most when you are running several agents at once and cannot personally watch every one.
The push gateway is as blind as the relay. It sees a hashed device token, the bundle id, the topic, and the payload's byte length. The body itself is sealed with the per-pairing key, so only your phone can read what the banner says. Quiet hours and chimes on mobile stay under your control: the mesh decides who can receive, you decide when it is noisy. Pair with widgets & chimes.
Continuum
ContinuumControllers start, steer, approve, and review. Hosts execute: the Mac Continuum daemon, or continuum-agent on Linux and Windows hardware you enroll. A phone is almost always a controller; a Hetzner box is almost always a host. The host runs the vendor CLI you already pay for, so joining a device adds reach without changing what Claude Code is doing on it.
There are only two host implementations, held to the same wire contract: the Swift daemon inside the Mac app, and the Go agent you install on a Linux or Windows box. Enrolling one runs a single setup script on the target that installs the agent, registers it as a service, sets up the CLIs, and writes its token. The Mac tails the progress live, so you watch it install step by step instead of staring at a spinner. The mirror-image wipe script removes exactly what setup put there. Bringing up a fresh box usually starts with installing the agent CLI on Linux or on Windows.
Some Macs are both. That's fine. The mesh shows the role so you never wonder why a tablet "can't compile."
A fleet flaps constantly. A MacBook sleeps, Wi-Fi switches, a relay link re-mints. A device chip that re-derives its default from whatever is online right now quietly turns your explicit choice into "whichever box happens to be awake." We shipped that bug, then fixed it, so the rule is written down.
An explicit pick survives disconnects, list refreshes, and app relaunches. It is retired only when the target is gone from the account for good. Two consequences follow, and both matter: a pin resolves against every host your account knows, never the online subset, and an empty device list means "not loaded yet", never "removed." A host blip cannot walk off your choice.
The one legitimate re-derivation is a device switch. The same repo sits at a different absolute path on a different host, so an explicit repo pick follows its name across rather than its path. If the name is ambiguous there, the pick is kept instead of guessed: starting a session in the wrong repo is worse than asking. Continuum Cloud is a device pick too, stored the same way, so a cloud run is a peer of your Macs, not a special mode. See cloud for what that host is.
Every joined device is listed. Revoke drops it from the mesh: no more relay access, no more push, no more session control from that client. Rotate host pairing material when a machine leaves the company bag.
Because each device holds its own credential, revoking one does not disturb the others. You are not rotating a shared secret and then re-pairing five machines to recover from one lost phone. The cafe laptop stops working; your desk does not notice.
Revocation is part of the product, not a support ticket. Treat devices like sessions: easy to add, easy to end.
Short answers here, long answers in the docs.
Account sign-in covers the common case. QR and MagicDNS remain for advanced, local-only, or recovery flows, especially when you're wiring a host without a browser sign-in.
Yes. Controllers on the same account see the same session pool. Live turn state is shared; it's one conversation on many screens.
Controllers can still sign in, but nothing runs until a host is available again: your Mac daemon or an enrolled continuum-agent box. Sessions don't magically move to the cloud.
No. You can poll from open apps. Push is how plan attention and turn complete find you when Continuum is in the background.
No. It routes sealed envelopes and can read the header only: protocol version, sender role, envelope type, byte counts, timing. Prompts, diffs, plan text, and approvals are encrypted under a key it never holds.
It drops out of the online list and its sessions stop making progress until it wakes. Your pinned device choice is not cleared by that, and neither is the repo you picked. An empty list is treated as "not loaded", never as "removed".
Sign in on Mac, then open Continuum on your phone with the same email.
see also · sessions · devices · mobile · security · vs Conductor