f3ac779bf47f1178ba10ef32f63ebc202f24d440
Media died silently whenever a client's source address changed. The relay bound a peer's endpoint once and refused to move it, and the client stopped offering its binding token after the first bind, so a Wi-Fi/cellular handover stranded the session in both directions. Add an authenticated Rebind media frame: the binding token travels in the clear for peer lookup only, and the AEAD tag over header and token plus the peer's existing replay window are what authorize the move, so a captured rebind cannot be replayed to redirect someone else's downlink. The client rebuilds its UDP socket instead of retrying on one still pinned to a vanished interface. Nothing judged the control connection live: pings were sent and pongs ignored, so a blackholed TCP path went unnoticed for minutes while the UI showed a live session. Treat any server traffic as liveness and fail the connection when it stops, which drives the existing reconnect. The receive jitter buffer had lost its depth floor, so a channel without FEC or DRED played out with no buffer at all and ordinary reordering became concealment. Restore a one-frame floor, observe every arrival rather than only accepted ones — a shallow buffer was rejecting the late arrivals that should have deepened it — and allow playout to hold a frame so depth can follow a degrading link. A stalled consumer now sheds the oldest queued packet instead of refusing the live talkspurt. Add a deterministic network-impairment simulation covering bursty loss, jitter, reordering, duplication, outages and a stalled consumer, a handover test against a real relay, a replay test for the rebind path, and a blackholed control connection driven through a freezable TCP proxy.
VoiceCat
VoiceCat is a self-hosted, channel-based voice and text chat system built on .NET 10. It uses TLS 1.3 for protobuf control traffic and authenticated encrypted UDP for Opus media. There is no WebRTC, central directory, or plaintext mode.
The repository contains a managed server, CLI, shared client/audio core, and native Windows, macOS, and iOS user interfaces. A small C library supplies Opus/RNNoise, and a small Swift iOS extension captures ReplayKit application audio.
Build
./scripts/build-native.ps1
dotnet restore VoiceCat.slnx --locked-mode
dotnet build VoiceCat.slnx -c Release --no-restore
dotnet test VoiceCat.slnx -c Release --no-build
See CLAUDE.md for the developer map, docs/README.md for current contracts, and PROGRESS.md for the short release handoff.
Layout
proto/ protobuf wire schema
src/ managed protocol, crypto, server, client, audio, and CLI
tests/ managed behavior and integration tests
clients/windows/ WinForms client
clients/apple/ AppKit and UIKit clients
native/media/ narrow Opus/RNNoise C shim
native/rnnoise/ vendored RNNoise source and model
native/apple/broadcast/ ReplayKit broadcast extension
docs/ current contracts and operating documentation
Non-negotiable constraints
- Encryption is mandatory.
- No GPL or LGPL dependencies.
- Real-time audio callbacks never allocate, lock, block, or perform I/O.
- Accessibility is a release requirement on every client platform.
Languages
C++
43.9%
Swift
30.6%
C#
17.5%
Shell
3.6%
CMake
2.1%
Other
2.3%