Home

voistr (pronounced like: VOYST-er) is an experimental nostr p2p softphone and real-time communication agent. It uses nostr relays to exchange encrypted WebRTC signaling messages.

Follow voistr on nostr: npub1lcfnjgme4s9whl6n4fym0ft034rdmghahal7jzg7zw35w8f6dq2s2kn6vm

How it works

  • The peers connect to some nostr relays which accept encrypted NIP-44 events, and send an event to join a room.

  • Every peer must decide their role (initiator or responder) in order to establish a WebRTC connection with every other peer. Normally this functionality is performed by the matchbox signaling server, but since the nostr relays can't do this job for us, the peers must automatically (see this commit for more) assign roles to others using nostr events.

  • The initiator peer sends a NIP-44 encrypted signal event containing the WebRTC offer to the other peer, and the responder peer accepts the offer. ICE candidates are also transmitted with encrypted events. This is the handshake, made possible by the nostr relays which act as WebRTC signaling servers.

  • Once the offer is accepted, the WebRTC connection is established. A data channel is opened, as well as media tracks to exchange encoded (OPUS) audio data. The data channel is used for the voistr protocol, which uses NIP-44 seal events with JSON payloads.

  • Absolutely all signaling communications (except the necessary communication with the ICE server) are made with encrypted nostr events. Once the WebRTC connection is established, peers only exchange encrypted nostr events on the data channel.

Download v0.1.6 (Linux x64) | Git repository (Codeberg)

Notes

  • voistr depends on libopus. You need to install libopus on Linux to run the application (and libopus-dev for compilation).

  • voistr uses the system's keyring to store the nostr keys.

  • Due to a known bug, losing the webrtc connection and reconnecting will lead to a failed handshake with peers you had previously established a connection with. This should be fixed soon.

Don't upload to GitHub