Skip to content

Audio/video server

The one piece that has to be a real server, because audio cannot travel the way messages do. Everything else in Armada is store-and-forward; a call is a live media path, and something has to sit in the middle of it.

Stock LiveKit, plus a small token broker in front of it.

The broker checks that you hold the key to a channel and issues a ticket for one room. That is the whole of its knowledge: it never learns which community the room belongs to, who else is in it, or what it is called — and the audio is encrypted end to end under per-sender keys regardless, so LiveKit is forwarding packets it cannot open. The design is specified as CORD-07.

Terminal window
git clone nostr://chad@chadwick.site/relay.ngit.dev/armada-av
cd armada-av/deploy/single
cp .env.example .env
docker compose up -d

Set AV_DOMAIN to the name people actually reach, and a LiveKit key pair from docker run --rm livekit/livekit-server generate-keys. Open 80, 443, UDP 7882 and TCP 7881.

In the app: Settings → Voice → https://av.example.com. That is per-user and takes effect immediately, so you can test a broker before anyone else touches it.

To make it the default for a client you host, build with VITE_CONCORD_AV_SERVERS — see the web app’s configuration. As with every other server URL in Armada it stays editable afterwards; a user who prefers someone else’s broker keeps working, in the same call.

A voice broker is the piece of Nostr infrastructure with the fewest operators, because it is the only one that costs real bandwidth. It is also the one where running it teaches you the least about the people using it — which is exactly what makes it safe to offer to strangers.

$ carry the calls