Direct browser-to-browser file transfer for very large files, with optional Cloud Drop links when both people cannot stay online together.
Live App · Screenshots · Development
PonsWarp has two transfer paths:
| Mode | Best For | Limit | Availability |
|---|---|---|---|
| SEND / RECEIVE | Maximum-size direct P2P transfer | No app-defined size cap | Sender and receiver stay online together |
| CLOUD Drop | Send once, share a download-only link | Free 10GB, paid plans up to 1TB | 24 hours to 7 days, then removed |
Direct mode streams bytes from the sender's disk to the receiver's disk through WebRTC. It avoids loading the full file into memory, protects against incomplete saves, and can resume interrupted single-file or multi-file transfers from the receiver's current offset after reconnect.
Cloud Drop uploads to Cloudflare R2 and returns a temporary link. Free Cloud Drop is capped at 10GB for 24 hours; paid Drop Pass and Pro plans add larger offline drops, longer retention, optional passwords, and download caps.
| Transfer Modes | Direct Send |
|---|---|
![]() |
![]() |
| Cloud Drop | Home |
|---|---|
![]() |
![]() |
- Direct P2P transfer: WebRTC data channels for browser-to-browser transfer.
- Large-file streaming: direct disk writes through StreamSaver or the File System Access API.
- Interrupted transfer recovery: receiver-side partial write detection plus reconnect/resume for resumable direct transfers.
- Multi-file and folder support: raw source-byte transfer with receiver-side ZIP64 packaging for large folder downloads.
- Cloud Drop: Cloudflare R2-backed temporary links with free 24-hour drops and paid password/download-limit controls.
- End-to-end protection: WebRTC transport security plus the Rust/WASM transfer core.
- Adaptive flow control: chunk sizing, backpressure, and buffer thresholds tuned for unstable networks.
- TURN-ready deployment: signaling can provide production TURN credentials for NAT traversal.
flowchart LR
senderDisk[Sender disk] --> senderWorker[Sender worker]
senderWorker --> wasm[Rust / WASM core]
wasm --> dataChannel[WebRTC data channel]
dataChannel --> receiverWorker[Receiver worker]
receiverWorker --> writer[DirectFileWriter]
writer --> receiverDisk[Receiver disk]
cloudUpload[Cloud Drop upload] --> r2[Cloudflare R2]
r2 --> cloudDownload[24-hour or paid retention link]
| Area | Files |
|---|---|
| App shell and mode routing | src/App.tsx, src/types/types.ts |
| Direct sender flow | src/components/SenderView.tsx, src/services/swarmManager.ts, src/workers/file-sender.worker.ts |
| Direct receiver flow | src/components/ReceiverView.tsx, src/services/webRTCService.ts, src/workers/file-receiver.worker.ts |
| Disk writing and resume safety | src/services/directFileWriter.ts |
| Cloud Drop | src/components/CloudSenderView.tsx, src/components/CloudDownloadView.tsx, src/services/cloudShareService.ts |
| Signaling | src/services/signaling-factory.ts, src/services/signaling-adapter.ts, src/services/signaling.ts |
- Frontend: React 19, TypeScript 5.9, Vite 7
- UI: Tailwind CSS 4, Framer Motion, lucide-react
- 3D scene: Three.js, React Three Fiber
- P2P: WebRTC, simple-peer
- Signaling: Socket.io client or Rust WebSocket signaling
- Storage: StreamSaver, File System Access API, Cloudflare R2
- Core: Rust/WASM package via
pons-core-wasm
- Node.js 20+
- pnpm 8+
- A signaling server for live direct-transfer testing
git clone https://github.com/DeclanJeon/PonsWarp.git
cd PonsWarp
pnpm install
pnpm devUse environment-specific files. The values are bundled into browser JS, so keep secrets out of all VITE_* variables.
# Local development
cp .env.local.example .env.local
pnpm dev
# Production build
cp .env.production.example .env.production
pnpm buildLocal defaults point to ws://localhost:5502/ws and http://localhost:5502. Production defaults point to https://warp.ponslink.com.
pnpm dev # Start Vite
pnpm build # Production build
pnpm preview # Preview built app
pnpm type-check # TypeScript validation
pnpm test # Vitest suite
pnpm test:e2e # Playwright smoke suite
pnpm lint # ESLint with autofix| Browser | Status | Notes |
|---|---|---|
| Chrome / Edge | Best | File System Access API and StreamSaver behavior are strongest here. |
| Firefox | Good | Uses fallback save behavior where browser APIs differ. |
| Safari | Limited | WebRTC works, but filesystem and background transfer behavior are more restrictive. |
- The public app is served at
https://warp.ponslink.com. - Static frontend assets are built from
dist/. - Direct transfer depends on signaling and TURN availability.
- Cloud Drop free shares are capped at 10GB and 24 hours. Larger offline drops use hosted checkout when the backend returns
checkoutEnabled=true; Lemon Squeezy is the default provider and PayPal can be offered as an alternate provider. - Paid Cloud Drop links can be protected with a password and counted by download session rather than by individual file click.
- Cloud Drop shares should be cleaned by the Rust backend cleanup loop or by a storage lifecycle policy aligned to each share's retention window.
- The Rust backend should pass
GET /readybefore Nginx routes traffic to it.
- Fork the repository.
- Create a branch:
git checkout -b feature/my-change. - Run
pnpm type-check,pnpm test, andpnpm build. - Open a pull request with the behavior change and verification notes.
- WebRTC for browser-to-browser transport.
- StreamSaver.js for large streamed saves.
- Rust and wasm-bindgen for the high-performance browser core.
- Cloudflare R2 for temporary Cloud Drop storage.



