DEV Community

Akshay Kumar Dadheech
Akshay Kumar Dadheech

Posted on

I built an open-source AirDrop alternative that works in any browser — no app, no account, no cloud

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 ────────┘
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Then open:

http://your-ip:3001
Enter fullscreen mode Exit fullscreen mode

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)