Sending and receiving
The page says my browser is not supported
The page says my browser is not supported
The transfer never starts or is stuck connecting
The transfer never starts or is stuck connecting
- The sender must keep their browser tab open for the entire transfer. If the sender closes the tab, the session ends.
- The recipient must actually open the shared link (or run
floe receive). The transfer begins automatically once both sides connect. - On strict networks, a direct path may not be possible. Make sure Network Relay Fallback is enabled (it is on by default) so Floe can route through the encrypted relay.
Transfer blocked: relay limit exceeded
Transfer blocked: relay limit exceeded
- Use a standard home or personal Wi-Fi network.
- Disconnect from any VPN.
- Avoid strict corporate or university networks.
- Try a personal mobile hotspot.
The transfer is slow
The transfer is slow
Downloads fail or behave oddly on iOS
Downloads fail or behave oddly on iOS
My short code does not work
My short code does not work
CLI
The CLI cannot reach the server
The CLI cannot reach the server
https://api.floe.one by default. If you are using a self-hosted instance, pass --server with your signaling server URL, and make sure both the sender and receiver use the same value. See Against a Self-Hosted Server.A browser recipient cannot join my CLI transfer
A browser recipient cannot join my CLI transfer
floe send with browser recipients, and the code with CLI recipients.The CLI is slow to connect when a VPN or virtual machine is running
The CLI is slow to connect when a VPN or virtual machine is running
--iface more than once to allow several interfaces. Temporarily quitting the VPN during a transfer also resolves it.The CLI says the version is incompatible
The CLI says the version is incompatible
Self-hosting
The browser cannot connect to my signaling server
The browser cannot connect to my signaling server
NEXT_PUBLIC_SOCKET_URL in .env and recreate the container. No rebuild is needed, because the client reads its server address at runtime:socketUrl means the browser will use its own origin, which is correct only when both services sit behind one reverse proxy. Otherwise confirm the URL is reachable from the end user’s browser: http://localhost:3001 only works when the browser runs on the same machine as the server. See how the client finds the server.Browser requests are blocked by CORS
Browser requests are blocked by CORS
CLIENT_URL to your client’s public origin (e.g. https://app.your-domain.com). It is added to the server’s CORS allow-list. http://localhost:3000 is already allowed by default. See Production Deployment.I am being rate limited (429 or Rate limit exceeded)
I am being rate limited (429 or Rate limit exceeded)
TRUSTED_PROXY_COUNT to the number of proxy hops so the server reads real client IPs instead of the proxy IP. See Configuration.The TURN relay is not working
The TURN relay is not working
CLOUDFLARE_TURN_KEY_ID and CLOUDFLARE_TURN_KEY_API_TOKEN are set in .env, then run curl http://localhost:3001/api/turn-credentials. A working setup returns turn.cloudflare.com entries with a username and credential. If it returns STUN servers only, one of the two variables is missing or the API token is invalid (roll it in the Cloudflare dashboard under Realtime, then TURN Server).Self-hosted coturn: the bundled coturn service uses host networking, so it runs on a Linux host with a public IP, a domain, and TLS certificates. On macOS or Windows with Docker Desktop, run coturn separately or on a Linux VM. Confirm that TURN_SECRET and TURN_DOMAIN in .env match coturn’s static-auth-secret and realm, then start the stack with docker compose --profile turn up -d. See TURN Relay.