尚未检测到更新。GitHub 发布版本后会显示在这里。
Private peer-to-peer HD voice calls in the browser. No server, adaptive quality, works on slow connections.
翻译准备中
正在加载完整 README。
查看完整 README ↗A static web app for HD voice calls straight between two browsers. There is no backend, no accounts, no build step and no dependencies: just HTML, CSS and plain JavaScript modules. It runs on GitHub Pages, Vercel or any static host.
| Part | What it does |
|---|---|
| Audio | WebRTC with the Opus codec, sent directly peer-to-peer. It is always encrypted with DTLS-SRTP (AES, hardware accelerated, so it adds microseconds of delay, not milliseconds). |
| Finding each other | The two browsers exchange setup messages through public MQTT brokers (EMQX and HiveMQ, used at the same time for redundancy). Every message is AES-256-GCM encrypted with a key derived (PBKDF2) from the room secret, which lives only in the link's #hash and is never sent to any server. The brokers see only random topic names and ciphertext. |
| After connecting | Signaling moves to a P2P data channel, so quality changes and mute state never touch a relay. |
| Extra-private call | Uses no relay at all. You swap two short codes or links yourselves, through any chat app. |
| Security code | Both screens show an 8-digit code derived from the two DTLS fingerprints. If the codes match, nobody is sitting in the middle of the call. |
Both sides automatically use the lower of their two choices, so one slow phone doesn't break the call for both people.
| Preset | Opus bitrate | Audio band | Packet | ≈ data/hour |
|---|---|---|---|---|
| Best | 96 kbps | 48 kHz fullband | 20 ms | ~105 MB |
| High | 40 kbps | 48 kHz fullband | 20 ms | ~34 MB |
| Standard | 24 kbps | 24 kHz | 20 ms | ~25 MB |
| Data saver | 14 kbps | 16 kHz wideband | 40 ms | ~14 MB |
| Lowest data | 8 kbps | 8 kHz | 60 ms | ~8 MB |
Two people per call.
Strict networks. Some network pairs block direct P2P traffic, most often a phone on mobile data (carrier NAT) or an office firewall. On those, a TURN relay is needed. TURN only forwards the encrypted audio and can't decrypt it, and only one side of the call needs it. You can add one in two places:
js/config.js. Free tiers include ExpressTURN and Metered.When a call can't connect, the app retries once, then explains why in plain words. Turn on Settings → Show technical details to also see which routes each side found.
Public brokers and STUN. The app uses Google and Cloudflare STUN servers and public MQTT brokers to find the other person. They never carry audio, and they only see encrypted setup data. If you need zero third parties at all, use an Extra-private call. Note that STUN is still used there to find your public address.
It's a static folder:
vercel in this folder (framework: "Other", no build command).Browsers only allow microphone access over HTTPS (or on localhost).
python3 -m http.server 8080