Flockdeck docs

Self-hosting

Security and privacy

What a relay (yours or the shared one) can and can't see, so you can weigh that against what your own rules require.

End-to-end encrypted terminal traffic, with one caveat

Traffic between a desktop and a paired device is encrypted with TLS to the relay and from the relay onward. On top of that, terminal traffic (what you type and what an agent prints back) is end-to-end encrypted by the desktop app and the paired device themselves, using keys the relay hands out but never holds. The relay has to route it, to know which desktop a browser's request is for, but it cannot read it unless it actively tampers with the client it serves (below). This is true of the shared relay at remote.flockdeck.ai and of a relay you run yourself, in exactly the same way.

Only the terminal is end-to-end encrypted, and only when the desktop and the paired device have each registered a key. A terminal opened when either has none is served without it, in plaintext, and a relay that holds back a device's key can cause that: the manual check below cannot show that a key was withheld.

Everything else passes through the relay decrypted, so whoever operates the relay you use can see it: the chat view of a pane and what is typed into it, the state of a pane (what its agent has spent, its usage limits, and which model routing chose for it), the latest replies, photos attached from a phone, diffs and commit, push and pull request data, and an API key typed into a dialog.

End-to-end encryption defeats an honestly-run relay. It doesn't defend against a relay that's been actively compromised and tampered with to swap the keys it hands out at pairing. The Verify code beside each device in the desktop's Flockdeck Remote dialog is the check for that: compare it with the code the device shows on its own Devices page, and if they differ, unpair the device. Running your own relay narrows who mounting that attack would require compromising to your own infrastructure and the people who administer it, instead of Flockdeck's.

The relay also serves the web client's JavaScript itself: the files are built into the relay binary (or read from -client-dir) and served from its own origin, under a Content Security Policy that allows only its own scripts. With -desk-domain it also proxies each desktop's own pages on that desktop's origin. A relay that actively tampers, or an attacker who controls it, can serve altered client code or altered desktop pages, which can read what the browser types and shows, and can report matching codes in Verify. So the guarantee is that the relay can read nothing that passes through it unless it actively tampers with the client it serves: the web client's JavaScript, and the desktop pages it proxies on a desk origin. Neither the pairing handshake nor the manual check can detect that. The remedy is to run your own relay and trust its operator.

Whoever controls a relay decides which devices are paired and serves the web page browsers run. A compromised or malicious relay can pair a device of its own and use any desktop connected to it, and end-to-end encryption does not prevent that. Run only a relay you trust with the desktops on it.

Pages and what they may run

The web client's pages take scripts only from the relay (script-src 'self', no inline script) and open sockets only to it. The two small pages that run a verified registration (/auth/verify and /verify) are the exception: their script is inline, so their policy allows 'unsafe-inline' for scripts, and still allows no third-party script, style or connection.

What the relay routes, and what it stores

The relay proxies a desktop's Flockdeck window (every pane, every agent conversation, any photo attached from a phone) to a paired device, and back. None of that is written to the relay's storage; Storage and data lists what is kept, which is account and device records and never anything that passes between them. A desktop that registered and never connected is removed after 7 days, and only the desktop: its account stays. A desktop that did connect is never removed for being quiet. An account nothing has used for -account-retention (90 days by default) is deleted with its desktops and devices; see How long accounts are kept.

Push notifications are the exception

A push notification's content is encrypted on the desktop, for the specific device it's going to, before it reaches the relay. The relay delivers it without being able to read it, and the desktop pads every message to one length, so even its size tells the push service nothing. This is the one thing a self-hosted relay handles no differently from the shared one: neither can see what a notification says.

What reaches the relay from a desktop, and what doesn't

Turning on remote access is the only thing that makes a desktop talk to a relay at all. With it off, nothing about a desktop's agents, panes or projects is sent anywhere related to remote access. With it on, the desktop's outbound connection to the relay carries exactly what's described above: proxied window content for paired devices, and nothing about projects, agents or conversations that aren't being viewed remotely.

Plans and billing

A relay you run for yourself has no plans. A relay run with -enforce-plans (on by default once -billing-url is set, as the shared relay is) holds an account's plan and when its trial or paid time ends, and nothing about who pays: the billing service keeps that. When a paired browser asks to subscribe, the relay makes a link that names the account, is signed with a key the relay and the billing service share, and works for ten minutes, once; the browser carries it to the billing service, which opens Paddle. The relay itself calls nothing: the billing service calls it, to set the plan.

The audit log

-audit (see Configuration) turns on a log of who reached which desktop, from which device, and when. It never records what was typed or shown, since that's the terminal traffic above this relay can't read either way. -audit-ip adds the address each event came from, and -audit-retention bounds how long events are kept; both are refused without -audit itself on, and the relay won't start.

Operating a relay securely

Treat it like any other service that terminates or proxies encrypted traffic for your organisation: TLS between every hop (see Requirements), the admin API kept off the public network (-admin-addr defaults to loopback already; set it to empty to turn the admin endpoints off entirely, see Admin and invites), the data directory or database backed up and access-controlled, and the relay itself kept current (see Upgrading).