// the find
kern/filepizza
:pizza: Peer-to-peer file transfers in your browser
FilePizza sends files directly from one browser to another over WebRTC, so nothing is uploaded to a server first. It suits someone who needs to hand a file to a specific person right now and would rather not sign up for a file host or wait for an upload to finish.
- The transfer path skips the intermediary entirely. The server handles only signalling and channel metadata, so the data never touches it, and the privacy claim holds up in the code.
- Downloads stream through a Service Worker (public/sw.js), so the receiving side does not have to buffer a large file in memory before saving it.
- Encryption comes from WebRTC's DTLS, not a custom layer. The optional password is an extra gate on top of that, not the only protection.
- docs/file-transfer-protocol.md documents the wire protocol. That is rare at this size and makes the client and server halves easier to review. TURN support is an opt-in COTURN_ENABLED flag, so a relay can be added for peers behind strict NAT without forking anything.
- The uploader has to keep the tab open for the whole transfer, and the FAQ says so. A laptop that sleeps or a phone browser that suspends the page will kill the transfer, and there is no resume to fall back on.
- Signalling defaults to PeerJS's public host (0.peerjs.com) and STUN to Google's server. Some connections behind symmetric NAT will not establish without a TURN relay, so self-hosting means running coturn and a PeerJS server yourself.
- Channel state falls back to in-memory storage when REDIS_URL is unset. That is fine for one instance, but with several instances behind a load balancer and no Redis, peers cannot find each other's channels, and every restart drops active ones.