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. Metadata here means facts about the transfer rather than the files themselves. The relay is an endpoint both devices connect to, so it sees the IP address of each device 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
Each app has its own switches for the relay. Turning the relay off means only direct connections are attempted, and the transfer fails if none is possible. Using only the relay hides your IP address from the other person, and caps every transfer at 2 GB while it is on.
In the browser, the Network relay fallback checkbox appears on the Send page once you have
picked files, and goes away when you click Create secure link, so set it before you click. The
receiving page has no such control. If you are receiving and a transfer will not start, this is
the sender’s setting to check.
In the CLI,
--no-relay stops your side offering the relay. The other side can still offer
one, as How the route is chosen
explains.
Terminal
--relay-only makes the relay the only path, so the other person sees the relay’s address
rather than yours. The two flags cannot be combined, and a typed --no-relay wins over
FLOE_RELAY_ONLY=1 for that one transfer.
Terminal
--relay-only.
How the route is chosen, and how Floe knows which it got
This section is the technical detail behind the badge, and you can skip it. In short, the badge reads Relay only when the path the two devices settled on runs through the relay. ICE, the step in which the two devices try the network paths between them, tries the candidate pairs it gathered and nominates, that is picks, one that works. A candidate pair is one address from each device, as Direct connections explains. Traffic is relayed when the nominated pair has arelay candidate on either side. Host
and reflexive candidates are still gathered and offered in that case; they simply lost.
Turning the relay off removes the relay entries from the address list that side uses, so it has
nothing relayed to offer. It does not stop the other side from offering one, and if that path
wins, the two surfaces behave differently:
- The browser notices and blocks the transfer before any file data moves. Its message begins
Connection failed. This link was made with Network relay fallback off. - The CLI does not:
--no-relayis ICE filtering and nothing more. Afloe send --no-relaywhose peer supplied the winning relay candidate goes ahead over it. Treat the flag as “do not offer a relay” rather than as a guarantee.
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. The
last 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.
What a firewall has to allow
A firewall has to let a transfer on floe.one reach these addresses.
The CLI and Floe Desktop use a WebSocket on
api.floe.one/ws, so a proxy in the way has to allow
the WebSocket upgrade. The web app can fall back to ordinary HTTPS requests.
A direct connection normally sends UDP straight to the other device, on ports picked for each
transfer. Where that is blocked, only the relay can carry the transfer.
An app that cannot fetch its connection list from api.floe.one uses Google’s public STUN servers
on UDP 19302 instead. They, and the GitHub addresses that installs and updates reach, are listed
under Other services floe.one relies on. A
self-hosted instance uses its own addresses.