Files
wz-phone/docs/featherchat.md
Siavash Sameni 51e893590c feat: WarzonePhone lossy VoIP protocol — Phase 1 complete
Rust workspace with 7 crates implementing a custom VoIP protocol
designed for extremely lossy connections (5-70% loss, 100-500kbps,
300-800ms RTT). 89 tests passing across all crates.

Crates:
- wzp-proto: Wire format, traits, adaptive quality controller, jitter buffer, session FSM
- wzp-codec: Opus encoder/decoder (audiopus), Codec2 stubs, adaptive switching, resampling
- wzp-fec: RaptorQ fountain codes, interleaving, block management (proven 30-70% loss recovery)
- wzp-crypto: X25519+ChaCha20-Poly1305, Warzone identity compatible, anti-replay, rekeying
- wzp-transport: QUIC via quinn with DATAGRAM frames, path monitoring, signaling streams
- wzp-relay: Integration stub (Phase 2)
- wzp-client: Integration stub (Phase 2)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 12:45:07 +04:00

63 lines
2.5 KiB
Markdown

# FeatherChat: Voice/Video Calling Integration with Warzone Messenger
## Overview
Voice/video calling system designed to integrate with the existing E2E encrypted Warzone messenger. Reuses the same identity, addressing, and key exchange infrastructure.
## Identity Model (reuse, not duplicate)
- **Identity**: 32-byte seed derives both keypairs via HKDF:
- Ed25519 (signing)
- X25519 (encryption)
- **Fingerprint**: `SHA-256(Ed25519 public key)[:16]`, displayed as `xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx`
- **Backup**: BIP39 mnemonic (24 words) for seed recovery
- **Storage**: Seed encrypted at rest with Argon2id + ChaCha20-Poly1305
- **Future**: Ethereum address as fingerprint (secp256k1 derived from same BIP39 seed)
## Addressing (reuse)
| Method | Format | Resolution |
|--------|--------|------------|
| Local alias | `@manwe` | Server resolves to fingerprint |
| Federated | `@manwe.b1.example.com` | DNS TXT record → fingerprint + server endpoint |
| ENS | `@manwe.eth` | Ethereum address → fingerprint (Phase 2-3) |
| Raw fingerprint | `xxxx:xxxx:...` | Direct lookup (always works as fallback) |
## Key Exchange (can extend)
- **X3DH** for session establishment:
- Ed25519 identity key
- X25519 ephemeral key
- Signed pre-keys
- **Double Ratchet** for forward secrecy on data channels
- **Pre-key bundles** stored on server, fetched by callers
## Server Infrastructure
- **Stack**: Rust (axum), sled DB, WebSocket for real-time
- **Trust model**: Server is untrusted relay — never sees plaintext
- **Groups**: Named, auto-created, per-member encryption
- **Federation**: Via DNS TXT records (Phase 3)
## Calling System Requirements
1. **Signaling**: Reuse existing WebSocket connection and identity
2. **Key derivation**: SRTP/DTLS keys derived from existing X3DH shared secret (or new ephemeral exchange per call)
3. **Call initiation**: `WireMessage::CallOffer`, `CallAnswer`, `CallIceCandidate` variants
4. **NAT traversal**: STUN/TURN server integration
5. **Group calls**: SFU (Selective Forwarding Unit) vs mesh topology for up to 50 users
6. **Codecs**: Opus for audio, VP8/VP9/AV1 for video
7. **E2E media encryption**: Insertable streams API (WebRTC) or custom SRTP
8. **Unified addressing**: A user calls `@manwe` the same way they message `@manwe`
## Degradation Strategy
Calls should degrade gracefully under unreliable/warzone network conditions:
```
Video (full) → Video (low res) → Audio (high quality) → Audio (low bitrate)
```
- Support opportunistic cooperation
- Fall back to TURN/TCP through the existing WebSocket when UDP is blocked