Talon 0dad40c9d7
Build and test / test (macos-latest) (push) Waiting to run
Build and test / test (ubuntu-24.04) (push) Waiting to run
Build and test / test (windows-latest) (push) Waiting to run
Build and test / apple-client (push) Waiting to run
Reconnect on a real handover instead of waiting for a dead path
A Wi-Fi to cellular switch left the session visibly dropping: the media transport rebound
itself within a few seconds, but nothing noticed the blackholed control connection until an
unanswered keepalive proved it, and the teardown that followed announced a lost connection and
waited another second before dialling again.

Watch the system path on iOS and fail the control connection the moment the carrying interface
changes, which is the only path change TCP cannot survive. Roaming between access points and a
link that is merely unusable for a while keep the same interface and the same source address,
so ControlPathWatcher reports neither; an unsatisfied path holds the last signature rather than
reporting, so a reconnect is never started into a route that cannot carry it. Tighten the
keepalive window on the phone as the backstop for what the monitor cannot see, run the first
reconnect attempt immediately, and defer the lost-connection announcement until an attempt has
actually failed, so a sub-second handover is silent and only a real outage is announced.

A control reconnect still re-authenticates and rejoins: the media keys come from the TLS
exporter of the connection that was lost, so seamless handover needs control-plane session
resumption rather than a faster reconnect.
2026-09-25 17:20:52 +02:00
2026-09-21 04:05:40 +02:00
2026-09-22 16:54:49 +02:00
2026-09-21 02:12:03 +02:00

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.
S
Description
Native voice chat server and client
Readme
8 MiB
Languages
C++ 43.9%
Swift 30.6%
C# 17.5%
Shell 3.6%
CMake 2.1%
Other 2.3%