AirDrop, but for the rest of us
This is the project that actually made it out of my laptop and into the world.
AirDelivery is a website for sending a file from one device to another. No account. No upload to my server. No "2 GB free, then pay." You open the site on both sides, share a flight code (or a QR), and the file goes straight across a WebRTC data channel.
It started because moving a video from my phone to my laptop felt way harder than it should. WhatsApp crushes the quality. Drive wants a login. WeTransfer slaps a timer on it. AirDrop only works if both devices were born in Cupertino. I just wanted the AirDrop feeling without the ecosystem lock-in.
The product is a boarding pass
Every session is a flight.
You land on the homepage and get a ticket. A short name like Zoroa or Shoto, plus a flight code. That code is the room. The other person types it in, or scans the QR, and now you're in the same room.
Three steps, on purpose:
- Open airdelivery.site on both devices
- One side sends, the other joins the flight
- The file goes device to device
Skipping signup isn't a growth hack — it's the entire point. If I asked for your email before letting you send a 12 MB photo, I'd have just rebuilt Drive with extra steps.
What "P2P" actually means here
People talk about peer-to-peer like it's magic. It's not. It's a handshake, then a pipe.
The handshake goes through me. Both browsers connect to a signaling server over WebSockets (Socket.io) and swap SDP offers, answers, and ICE candidates. That's how two strangers on the internet find each other. The server knows the room exists. It never sees the file.
The pipe doesn't. Once ICE succeeds, the browsers open an RTCDataChannel called fileTransfer and bytes move browser to browser. My disk is nowhere in that path.
All of that lives in useWebRTC.ts. A peer connection, a few public STUN servers (Google + Twilio), queued ICE candidates — because the joiner and the owner never show up in a polite order — and a bunch of status strings so the UI can say "Connection established" instead of "DataChannel opened."
NAT is the actual villain here. Two phones on different carrier networks often can't punch a hole through with STUN alone. That's why the backend isn't just a signaling box — it also has a fallback path for when the direct pipe refuses to exist. Honest version: most transfers are P2P, some aren't. Shipping something that sometimes works is how you earn one-star reviews.
The boring architecture that let it grow
Monorepo. Bun workspaces. That's it.
packages/frontend— Next.js, Tailwind, the ticket UI, drag-and-drop, QR, progress, historypackages/backend— Express on Bun, Socket.io rooms, optional Mongo for stats and feedback
Transfers get chunked off the main thread through TransferWorkerManager, so picking a 4 GB folder doesn't freeze the tab. Users near each other on the same signaling plane can get invited into a flight instead of typing codes. Stats (files shared, bytes moved) flow back over the socket so the landing page can show real numbers without me tailing logs by hand.
None of that is exotic. The exotic part is keeping the UI so simple that your parents could use it.
What happened when people found it
I built a tool I needed. Turns out other people needed it too.
The site still shows the early numbers: 20K+ users in the first month, 27K+ share sessions, TBs+ moved. GitHub bio rounds it to 30k+. AlternativeTo listed it next to LocalSend, PairDrop, and WeTransfer — a weird club to be in when you're one person and a VPS.
The comments I kept weren't about WebRTC at all.
"It really should have just always been this easy."
"I have felt stuck since I moved to Android and can't use AirDrop any more so this is a life saver."
That second one is the whole product. Cross-platform AirDrop isn't a feature list — it's a feeling someone lost and wanted back.
Why I still like this one
The fluid sim taught me local rules. AirDelivery taught me constraints people can actually feel.
A file leaving your phone and landing on a Windows laptop, no Google account involved — that's a small kind of dignity. Most of the internet says "upload it and we'll give it back later." This one says "I'll introduce you two, then get out of the way."
That's the kind of system I want to keep shipping. Small surface, sharp promise. The server is a matchmaker, not a warehouse.
Want to send something right now? airdelivery.site