Share files directly between browsers. No uploads, no servers, no accounts. End-to-end encrypted.
Built with Nuxt v4 + WebRTC.
- Create a session — you get a random 6-character code
- Share the code — send it to anyone
- Files transfer peer-to-peer — directly between browsers via WebRTC, streamed through a Service Worker
All data is ephemeral. No files are stored on any server. Sessions disappear when both peers disconnect.
- Peer-to-peer file transfer via WebRTC — files stream directly between browsers
- End-to-end encryption (AES-256-GCM) — keys exchanged over the signaling channel
- No file size limit — files stream in 64KB chunks
- Service Worker streaming — large files download as they arrive, no in-memory buffering
- Built-in chat — send messages alongside files
- TURN relay support — works behind restrictive NATs (self-hosted coturn or any STUN/TURN server)
┌─────────────┐ WebSocket (signaling) ┌─────────────┐
│ Browser A │◄─────────────────────────►│ Browser B │
│ (creator) │ │ (joiner) │
│ │◄──── WebRTC (P2P data) ──►│ │
└─────────────┘ └─────────────┘
│ │
│ ┌──────────────┐ │
└───►│ STUN/TURN │◄────────────────────┘
│ (configurable)│
└──────────────┘
- Signaling — WebSocket via Nuxt/Nitro (
crossws/h3), used only to exchange connection metadata - WebRTC — data channel for file chunks + chat messages
- Service Worker — intercepts streamed data, writes to a
ReadableStream, triggers a download - Database — PostgreSQL via Knex (optional, for analytics and feedback collection)
bun install
cp .env.example .env # configure STUN/TURN and database
bun run devOpens at http://0.0.0.0:3000
| Env var | Default | Description |
|---|---|---|
NUXT_PUBLIC_BRAND_NAME |
Diringo |
Application name (used in titles, footer, links) |
NUXT_PUBLIC_BRAND_URL |
https://diringo.com |
Logo link URL |
NUXT_PUBLIC_BRAND_YEAR |
2026 |
Footer copyright year |
NUXT_PUBLIC_STUN_SERVERS |
stun:stun.cloudflare.com:3478 |
Comma-separated STUN server URLs |
NUXT_PUBLIC_TURN_SERVERS |
— | Comma-separated TURN server URLs |
NUXT_PUBLIC_TURN_USERNAME |
— | TURN username (required if TURN servers use auth) |
NUXT_PUBLIC_TURN_CREDENTIAL |
— | TURN credential |
DATABASE_URL |
— | PostgreSQL connection string (optional, disables analytics if omitted) |
Fork this project and deploy under your own name and brand. Set these env vars (see Configuration):
NUXT_PUBLIC_BRAND_NAME=MyApp
NUXT_PUBLIC_BRAND_URL=https://myapp.com
NUXT_PUBLIC_BRAND_YEAR=2026Also replace public/favicon.ico with your own icon.
bun run build
bun run previewFor production, use PM2 or any Node.js process manager. The server is a Nuxt/Nitro app — deployable to any Node.js host (VPS, Railway, Fly.io, etc.).
| Layer | Choice |
|---|---|
| Framework | Nuxt v4 |
| UI | Tailwind CSS v4 + shadcn-vue (New York style) |
| Icons | Solar via @nuxt/icon |
| Signaling | crossws (built into Nuxt/Nitro) |
| Database | PostgreSQL via Knex |
| Crypto | Web Crypto API (AES-256-GCM) |
| Streaming | Service Worker ReadableStream |
MIT