Skip to main content

Files and transfers

Your files go directly to the recipient’s device. In most cases they never touch a server at all. When a direct path cannot be found (strict corporate firewalls, carrier-grade NAT), Floe automatically falls back to an encrypted TURN relay. Even through a relay, the server sees only encrypted packets and cannot read your files.On floe.one that relay is Cloudflare’s managed TURN service rather than a Floe machine, so a relayed transfer does transit third-party infrastructure. It carries opaque encrypted packets either way, and if you self-host you point Floe at your own relay instead.See How It Works for a full explanation.
Direct connections have no size limit imposed by Floe. Files transfer directly between the two devices and no server bandwidth is consumed.Relay connections are capped at 2 GB per session to keep the service free. The cap applies everywhere: the web app, the CLI, and Floe Desktop all enforce it. On Floe Desktop, turning on “Hide my IP address” routes every transfer through the relay, so the cap applies to every transfer while that setting is on. Most home and mobile network transfers connect directly and have no limit. See The 2 GB Relay Limit for details and tips on obtaining a direct connection.One practical note about the browser: a browser receiver holds each incoming file in memory until that file is complete, so a very large file can exhaust a phone or a laptop tab. The CLI and desktop receivers write straight to disk and have no such ceiling, which makes them the better choice for multi-gigabyte transfers.
Yes, with one caveat about folders. In the browser you can select or drop multiple files, but not a folder: the web app has no folder picker, and dropping a folder does not add its contents. The CLI and Floe Desktop can send whole folders. Pass file or folder paths to floe send, or drop a folder onto Floe Desktop.
Terminal
Folder transfers preserve the directory structure when the receiver is the CLI or the desktop app, which rebuild the tree on disk. A browser receiver gets the same files, but as a flat list, because a browser download cannot create folders.
Transfer speed is limited only by the slower of the two connections involved. There is no artificial throttling. Direct transfers run at your internet connection speed. Relay transfers may be slightly slower depending on server load and network conditions, but the encryption overhead is minimal.
For the full duration of the transfer. Files stream directly from the sender’s device, so the browser tab, the CLI process, or the Floe Desktop window must stay open. The browser and the desktop app both ask the device to stay awake while a transfer is connected. The CLI does not, so check your machine’s own sleep settings before a long headless transfer.If the sender closes the tab or window, quits, or cancels mid-transfer, the session ends. Nothing half-written is left behind: a CLI or desktop receiver deletes the file it was writing, and a browser receiver offers no download for the file that was in flight. Files that finished earlier in the same batch are kept. Either way, a file that did not arrive whole is never handed to you looking complete. That holds even when the receiving app is killed outright or the machine loses power: an unfinished file only ever exists as a .part file, never under its final name.
No. Files are never stored on any server. They travel directly between the two devices in real time, and once the session closes the server keeps nothing about them: no file names, no contents, no per-transfer record. If a short code was issued for the room, that code maps to the room ID for up to 10 minutes and is then deleted. The only thing that survives for good is one anonymous number, the running total of bytes Floe has moved (see the counter question below).Floe Desktop also keeps a short local list of your recent transfers on your own machine, so you can find where files landed. That list never leaves the device.

Browser

Any modern browser with WebRTC support works: Chrome, Firefox, Safari, Edge, and most Chromium-based browsers. A secure context (HTTPS or localhost) is required.In-app browsers (the web views embedded in Facebook, Messenger, Instagram, TikTok, Snapchat, LINE, X (Twitter), and WeChat, plus generic Android web views) have limited support for file transfers. Floe recognizes these by their user agent and shows a full-screen prompt with instructions for opening the page in Chrome or Safari, plus a button that copies the link. The transfer UI is held back until you leave the in-app browser, so the page does not join the room in the meantime. A “Continue anyway” link lets you try regardless.
On iOS, use Download ZIP rather than downloading files individually. This is the most reliable option on Safari and iOS web views. Individual file downloads can behave inconsistently on iOS due to browser sandboxing.The ZIP option only appears when a transfer contains more than one file, and only once every file has arrived. A single file has just its own download button, and that is the only way to save it.
The indicator in the transfer card’s header shows connection state:
  • Green (Direct): Files transfer directly between devices, whether they share a network or connect peer-to-peer across the internet. No server involved. No size limit.
  • Amber (Relay): Files route through the encrypted TURN relay. The 2 GB cap applies.
  • Green (Ready): Floe has reached the signaling server and is still negotiating the peer-to-peer path. It switches to Direct or Relay within a few seconds of the two sides meeting.
  • Red (Offline): The connection to the signaling server is down. Floe reconnects on its own.
If the indicator stays on “Ready” for more than 30 seconds after both sides have joined, see Troubleshooting.
Because the connection really is direct. WebRTC uses a technique called NAT hole punching (with the help of a STUN server) to open a peer-to-peer path between two devices even when they sit on completely different networks, such as home Wi-Fi on one side and mobile data on the other. Once that path is open, file bytes flow straight from one device to the other and no server carries them.The relay only enters the picture when hole punching fails, which mostly happens on strict corporate firewalls or unusual carrier NAT setups. Most transfers, including those involving mobile data, connect directly.Transfer speed on a direct connection is set by the slower of the two internet connections involved (typically the sender’s upload speed or the receiver’s mobile signal), not by Floe. See Direct Connection for the full story.
This toggle appears on the sending side only. A browser receiver has no relay control at all.No, turning it off does not cancel anything. The toggle only controls whether Floe may fall back to a relay server when a direct connection cannot be established. It is checked once, when the connection is being set up.
  • If the connection is direct, the toggle has no effect. The transfer proceeds whether relay fallback is on or off, because no relay is involved.
  • If the connection would need a relay and the toggle is off, Floe leaves the relay servers out of its own connection setup, so it can only offer a direct path. Should the path end up relayed anyway, because the other side can still offer a relay of its own, Floe blocks the transfer before any file data moves. The sender is told to enable Network Relay to connect across restrictive networks, and the receiver is told to ask the sender to do it.
The toggle cannot affect a connection that is already established, which is why it is only shown before the share link is created.
No. The browser UI does not have a code entry field. To receive in the browser, the recipient must open the full link (or scan the QR code). Short codes work in the CLI (floe receive olive-tiger-castle) and in Floe Desktop, whose receive field accepts either a short code or a full link.

Desktop

Yes, in beta for Windows. Floe Desktop is a small native app that speaks the same protocol as the web app and the CLI, so any two Floe clients can transfer to each other. It sends folders without zipping, pastes screenshots and copied files straight from the clipboard, saves received files to a folder you choose, and posts a notification when a transfer finishes.Install it from the download page. It requires Windows 10 or later on an x64 machine, with the Microsoft Edge WebView2 runtime. The Microsoft Store build additionally needs Windows 10 version 2004 (build 19041). See Install Floe Desktop for the full walkthrough.
Paste either a short code or a full share link into the receive field and choose where the files should land. Unlike the browser, the desktop app writes files straight to disk and rebuilds any folder structure the sender used. See Receiving Files with Floe Desktop.
It routes every transfer through the encrypted relay so the other side never sees your IP. Because the connection is always relayed, transfers are slower and the 2 GB per-session cap applies to every transfer while the setting is on. Turn it off to send larger files.This is the inverse of the browser’s “Network relay fallback” checkbox, which permits a relay but prefers a direct path. Floe Desktop has no direct-only mode, and the browser has no relay-only mode. See Floe Desktop Settings.
Microsoft Store installs update themselves. A build installed from GitHub, including the portable zip, does not install anything on its own: builds 0.2.3 and later show a notice when a newer release exists (earlier builds show nothing), and either way you download the current installer and run it over your existing install. floe update applies to the CLI only and has no effect on Floe Desktop.

CLI

See CLI Installation for platform-specific steps. The quick version:
macOS and Linux
Windows
Yes. All three clients speak the same WebRTC transfer protocol, so any combination works: browser to CLI, CLI to desktop, desktop to browser, and so on. The CLI prints a browser link and the desktop app shows one, either of which any recipient can open, and a browser sender’s link can be pasted into floe receive or into Floe Desktop’s receive field. See the cross-platform transfers table.
Run floe update for script and manual installs. For package manager installs, use brew upgrade floe, winget upgrade jannskiee.floe, or scoop update floe. See Updating.
No. Floe peers on different versions interoperate, so you do not need to coordinate updates with the person on the other end. A patch or minor difference (for example v1.5.4 sending to v1.5.5) transfers normally.Floe negotiates a transfer protocol version separate from the release version. The only time a transfer is blocked is the rare case where a release changes the wire format in a breaking way and the two versions cannot bridge it. If that happens, Floe tells you before any data moves and shows the older side what to do: refresh the page in the browser, or run floe update on the CLI. Floe Desktop shows the same engine message, but there you update through the Microsoft Store or by reinstalling from GitHub. See the Protocol versioning reference for how this works.

Accounts and privacy

No. Floe requires no account, no sign-up, and no registration. Open floe.one, install Floe Desktop from the download page, or run the CLI, then share the link or short code with your recipient.
The signaling server tracks room IDs and connection metadata only for the duration of the session. No file content, file names, or transfer records are stored. Room state is discarded once both peers disconnect. If a short code was issued for the room, that code maps to the room ID for at most 10 minutes and is then deleted, so a room ID can outlive the session by that much. Nothing about the files themselves is ever stored.If a transfer falls back to a relay, its encrypted packets pass through Cloudflare’s managed TURN service on floe.one, which is infrastructure Floe does not own. The relay cannot read the packets, and a self-hosted instance uses whatever relay you configure.The one persistent value Floe keeps is a single anonymous total of bytes transferred across all users, shown by the counter on the homepage. It is a plain running number with no file names, no per-transfer records, and no link to you. See Security and Privacy for details.
It is a public, all-time total of how many bytes Floe has helped move across all users. When a transfer finishes, the receiving side reports just the size (never the file name or contents), and that size is added to one shared total. The figure is an honest best-effort metric, not an audited count, and reporting it never slows or blocks your transfer.The counter is viewable only in the browser. The CLI and desktop receivers contribute to it but never fetch or display the total. Senders never report, in any client.
Yes. The byte-count report is on by default but can be turned off on the receiving side.Browser: Uncheck “Contribute to global stats” on the receiver view before the first file arrives. The checkbox is hidden once files start landing. The preference is saved in your browser and applies to all future transfers from that device.CLI - single transfer:
Terminal
CLI - permanent (add to your shell profile):
Terminal
Desktop: Open Settings and turn off “Contribute to global stats”. The preference is stored with your other Floe Desktop settings and applies to every future transfer you receive.When opted out, no request is sent to Floe’s server and the global counter is not incremented for that transfer. The transfer itself is unaffected.
Yes. The full source for the web client, the signaling server, the CLI, and the desktop app is available on GitHub under the MIT license. You can also self-host your own instance on your own infrastructure.