Viora
Viora is a self-hosted, peer-to-peer video calling app for Android. Media never touches a server - audio and video flow directly between the two phones over an encrypted WebRTC connection. The only backend is a tiny Rust process whose job is to introduce the two peers and then get out of the way.
Why Viora existsThe reasoning behind building yet another calling app, and where it draws its lines.ArchitectureHow the Android client, the signaling server, and the WebRTC pipeline fit together.InternalsThe parts that took the most work: SDP munging, the audio processing chain, camera adaptation, screen-share, PiP, and crash resilience.DeploymentRunning the signaling server, the self-hosted Android CI, and the R8 release build.
What it does
| Capability | Notes |
|---|---|
| 1:1 video calls | Full-bleed remote video, draggable self-view, tap-to-hide chrome |
| Up to 4K / 60 fps camera video | H.264 / H.265 / AV1, hardware encode where available |
| Screen sharing | Dedicated screencast source, device-audio capture, orientation follow |
| In-call text chat | Relayed over the same WebSocket as signaling |
| Adaptive audio | Opus stereo @ up to 256 kbps VBR, in-band FEC, three capture modes |
| Noise suppression | On-device RNNoise as a capture post-processor |
| Picture-in-Picture | Remote video floats when you leave the app mid-call |
| Live connection stats | Bitrate, resolution, FPS, RTT, packet loss, codec, CPU, battery temperature, power draw |
| Custom identity | Display name + avatar (monogram, preset, or cropped photo) |
| Light / dark theme | The call UI follows the system theme; video backdrop stays black |
Design pillars
Private by constructionPeer-to-peer media. The server sees room codes, display names, and the signaling handshake - never a video frame or an audio sample.
Self-hostableThe entire backend is one statically-linked Rust binary with no database, no persistence, and no external services beyond public STUN.
Honest about the hardwareThe debug panel surfaces exactly what the encoder, decoder, and radio are doing. Quality settings map to real capture formats and bitrate caps, not vague “HD / SD” labels.
Built for real devicesTested on a 2018 Galaxy S9+ and a 2025 Pixel - camera recovery, thermal awareness, and lifecycle handling are first-class concerns, not afterthoughts.
The 30-second mental model
- Both phones open a WebSocket to the signaling server and
jointhe same room code. - The server tells each phone who else is in the room.
- The phones exchange an SDP offer / answer and a handful of ICE candidates through the server.
- A direct, encrypted DTLS-SRTP channel forms between the two phones. All audio, video, and chat now flow over that channel.
- The server keeps the WebSocket open only to relay late ICE candidates, chat, and presence changes.
Continue to Why Viora exists →