AirDrop only works between Apple devices. Most alternatives require an app install, a cloud account, or route files through a third-party server.
I wanted something simpler:
Open a URL → discover nearby devices → send files.
So I built LocalDrop — a peer-to-peer file transfer app that works entirely in the browser over local Wi-Fi.
GitHub: https://github.com/akshaykdadheech/localdrop
Live Demo: https://localdrop-4fddd39fb6ad.herokuapp.com
How It Works
Devices connected to the same Wi-Fi network automatically discover each other through a lightweight signaling server.
Once discovered, WebRTC establishes a direct peer-to-peer connection:
Browser A ──► Signaling Server ◄── Browser B
└──────── WebRTC P2P ────────┘
The signaling server only helps devices find each other. File transfers happen directly between browsers via WebRTC and are DTLS encrypted, so the server never sees your files.
Interesting Challenges
Backpressure Handling
WebRTC DataChannels on Chromium have a ~16 MB buffer limit. Sending data too aggressively can crash the tab.
I solved this using:
bufferedAmountLowThreshold- Flow control based on drain events
Cross-Platform Compatibility
Different browsers expose different capabilities.
- Android Chrome supports the File System Access API
- iOS Safari does not
This required separate file-receiving flows for each platform.
Large File Transfers
Keeping multi-gigabyte files in memory isn't practical.
On Chrome, showSaveFilePicker() is triggered after the transfer completes, allowing transfer progress to remain visible throughout the process without buffering everything in RAM.
Tech Stack
- Svelte 5 + Vite
- TypeScript
- WebRTC DataChannel
- Node.js + ws
- Docker
Self-Hosting
git clone https://github.com/akshaykdadheech/localdrop
cd localdrop
docker compose up -d
Then open:
http://your-ip:3001
from any device connected to the same Wi-Fi network.
I'd love feedback from anyone who's worked with WebRTC DataChannels, especially on mobile browsers. If you find the project useful, a ⭐ on GitHub would be greatly appreciated.
Top comments (0)