Live Demo: https://getpairlane.com/
A P2P file sharing tool using WebRTC. Transfer files directly between browsers without going through a server.
- P2P Transfer: Files are sent directly between browsers, not through a server
- E2E Encryption (Optional): AES-GCM encryption with key in URL fragment (
#k=...), never sent to server - Serverless: Runs on Cloudflare Workers + Durable Objects, no file storage on server
- Multiple Receivers: One sender can transfer to multiple receivers simultaneously (configurable concurrency)
- Drag & Drop: File selection UI supports drag and drop
- Sender creates a room
- Share the link (or room code) with receivers
- Receivers join the room
- Sender selects a file and sends
- P2P transfer via WebRTC DataChannel
- Hono - Lightweight web framework
- Cloudflare Workers - Edge computing
- Durable Objects - WebSocket signaling
- Vite - SSR-enabled build tool
- WebRTC - P2P data transfer
Send and receive files directly from your terminal. Works with browsers and other terminals.
# Send a file
npx pairlane send /path/to/file
# Receive a file
npx pairlane receive <ROOM_ID_OR_URL> --output-dir ./downloadsEncryption is enabled by default. The send command prints a room URL with #k=... that you can share:
npx pairlane send /path/to/file
# → Share the printed URL: https://getpairlane.com/r/<ROOM_ID>#k=<KEY>
npx pairlane receive "https://getpairlane.com/r/<ROOM_ID>#k=<KEY>"To disable encryption, pass --no-encrypt.
| Option | Description |
|---|---|
--output-dir |
Directory to save received files |
--key <KEY> |
Provide decryption key explicitly (base64url) |
--stay-open |
Keep running after transfer for additional transfers |
--no-encrypt |
Disable encryption for send |
By default, the CLI connects to https://getpairlane.com. Override with:
PAIRLANE_ENDPOINT=https://your-server.com npx pairlane send /path/to/file- Linux (x86_64)
- macOS (Intel / Apple Silicon)
cd cli
cargo run --release -- send /path/to/file
cargo run --release -- receive <ROOM_ID_OR_URL> --output-dir ./downloads- Bun runtime
bun install
bun run devVite dev server runs SSR on http://localhost:5173.
bun run buildbun run deployFor generating/synchronizing types based on your Worker configuration run:
bun run cf-typegenPass the CloudflareBindings as generics when instantiating Hono:
// src/index.tsx
type Bindings = CloudflareBindings & { ROOM: DurableObjectNamespace }
const app = new Hono<{ Bindings: Bindings }>()MIT