Direct and relayed, side by side
The encryption row is the important one. Relaying changes the route, not the protection. Your
files are encrypted before they reach the relay and decrypted only on the other device, so the
relay forwards packets it cannot read.
What it costs you
Speed, because every byte takes a detour through a third machine instead of going straight across. Size, because relay bandwidth costs real money. Relayed transfers are capped at 2 GB per session. See File size limits. A little more metadata exposure. The relay is an endpoint both devices connect to, so it sees both IP addresses and the timing and size of what it forwards. It cannot see contents. On floe.one the relay is Cloudflare’s Realtime TURN network, which means a relayed transfer does cross infrastructure Floe does not own. See Known limitations.Turning it off, and the opposite
In the browser, the Network relay fallback checkbox appears on the sending side once you have picked files. It is on by default. Off means only direct connections are attempted, and the transfer fails if none is possible. A browser recipient has no such control, so if you are receiving and a transfer will not start, this is the sender’s setting to check. In the CLI,--no-relay does the same thing, on either floe send or floe receive.
Terminal
--relay-only makes the relay the only path, so the
other person sees the relay’s address rather than yours, and every transfer is capped at 2 GB while
it is on. Set FLOE_RELAY_ONLY=1 to keep it on. The two flags cannot be combined.
Terminal
--relay-only: it makes the relay the only path, so the other person sees the relay’s address
rather than yours. That means every transfer is relayed and every transfer is capped at 2 GB while
it is on.
Nothing in Floe offers a direct-only mode in the desktop app, and the browser has no relay-only
mode.
How the route is chosen, and how Floe knows which it got
How the route is chosen, and how Floe knows which it got
ICE tries the candidate pairs it gathered and nominates one that works. Traffic is relayed when
the nominated pair has a
relay candidate on either side. Host and reflexive candidates are
still gathered and offered in that case; they simply lost.Turning the relay off does not veto a relayed connection after the fact. It removes the relay
entries from the address list the client uses, so it has nothing relayed to offer. The other
side can still offer one, though, and if that path wins the two surfaces then behave
differently. The browser notices and blocks the transfer before any file data moves. The
CLI does not: --no-relay is ICE filtering and nothing more, so a floe send --no-relay
whose peer supplied the winning relay candidate goes ahead over it. Treat the flag as “do not
offer a relay” rather than as a guarantee.The browser re-reads the connection statistics every five seconds and flips the badge to amber
when the nominated pair is relayed. Floe Desktop and the CLI each read it once, when the
connection is established, so their indicators are a snapshot rather than a live reading: the
desktop badge, and the CLI’s Connected (direct) or Connected (relay) line. When the CLI
cannot read the route it prints Connected alone and carries on. The sender consults the route
a second time only to decide whether the size cap applies.On floe.one the signaling server hands out three endpoints and no more: a STUN URL, a TURN URL
over UDP, and a TURN URL over TLS on port 443, which looks like ordinary HTTPS to a network that
blocks everything else. Cloudflare offers more variants, but every extra URL multiplies the
connectivity checks each client runs during setup, so the list is trimmed before it is served.