A unified Rust substrate for real-time voice โ SIP today, WebRTC + QUIC + AI agents next.
๐ Docs ยท ๐ Quick start ยท ๐ฏ Build with rvoip ยท ๐ Feature support ยท ๐๏ธ Architecture ยท ๐บ๏ธ Roadmap ยท ๐ก Why rvoip
Note
Release status. Maturity is encoded in the version number (no -alpha/-beta
suffixes): 0.1.x = alpha, 0.2.x = beta, 1.0 = stable. The SIP product
(rvoip-sip + its spine) is a beta candidate at 0.2.1 for bounded SIP client,
server, PBX, gateway, and B2BUA scenarios. The rest of the workspace โ WebRTC, QUIC,
WebTransport, WebSocket, UCTP, vCon, identity, AI harness โ is alpha, published at
0.1.0 (API-unstable; expect breaking changes before 1.0).
The rvoip 3 vision describes the destination.
After the SIP era (VoIP 1.0) and the web-meets-voice era of WebRTC + VoiceXML (VoIP 2.0), rvoip is the third generation: SIP, WebRTC, QUIC, and AI-agent participants share a single transport-agnostic conversation model. One Rust library hosts all of them. Cross-substrate bridging โ SIP โ WebRTC โ QUIC โ is a first-class primitive, not glue code.
The full design lives under docs/:
| Doc | What it covers |
|---|---|
| voip-3-conversation-model.md | The vocabulary โ Conversation, Session, Connection, Stream, Message, Participant |
| PRD.md | Product scope, audiences, positioning |
| INTERFACE_DESIGN.md | Crate architecture and dependency rules |
| GAP_PLAN.md | Implementation status (v1 shipped May 2026) |
| CONVERSATION_PROTOCOL.md | UCTP wire specification |
What you can ship right now on the beta:
| ๐ค Who you are | ๐๏ธ What you build | ๐ง Start with |
|---|---|---|
| ๐ Softphone / endpoint dev | A SIP account that places, receives, and controls calls | Endpoint |
| ๐งช Test / script writer | Linear test that drives a call from start to finish | StreamPeer |
| ๐ค IVR / contact-center dev | A reactive server that routes, queues, transfers | CallbackPeer |
| ๐ B2BUA / gateway dev | A back-to-back UA bridging two SIP legs (carrier, SBC, gateway) | UnifiedCoordinator |
| ๐ Registrar / PBX dev | A SIP REGISTER service with location bindings | rvoip-sip-registrar |
| ๐๏ธ Voice-AI agent dev | A SIP-reachable AI agent (alpha โ wire your ASR/TTS via the harness) | CallbackPeer + rvoip-harness (alpha) |
Pick the lowest-ceremony API that gives you what you need. All four sit on the
same UnifiedCoordinator underneath; you can drop down a layer without
switching stacks.
[dependencies]
rvoip-sip = "0.2.1"
tokio = { version = "1", features = ["full"] }A complete two-endpoint local call. Bob waits, Alice dials, they hold the line for a second, then hang up.
use std::time::Duration;
use rvoip_sip::{Config, Endpoint, EndpointProfile};
#[tokio::main]
async fn main() -> rvoip_sip::Result<()> {
// bob waits for an incoming call
let bob = tokio::spawn(async {
let mut bob = Endpoint::builder()
.name("bob")
.profile(EndpointProfile::Custom(Config::local("bob", 5071)))
.build()
.await?;
let incoming = bob.wait_for_incoming().await?;
let call = incoming.answer().await?;
call.wait_for_end(None).await?;
bob.shutdown().await
});
tokio::time::sleep(Duration::from_millis(300)).await;
// alice dials bob
let alice = Endpoint::builder()
.name("alice")
.profile(EndpointProfile::Custom(Config::local("alice", 5070)))
.build()
.await?;
let call = alice
.call_and_wait("sip:bob@127.0.0.1:5071", Some(Duration::from_secs(10)))
.await?;
tokio::time::sleep(Duration::from_secs(1)).await;
call.hangup_and_wait(Some(Duration::from_secs(5))).await?;
alice.shutdown().await?;
bob.await.unwrap()
}Try it:
cargo run -p rvoip-sip --example endpoint_local_callNew here? Start with the scenario examples in examples/ โ a
guided, well-documented path from a first P2P call through audio, registration,
call control, transfers, SRTP/TLS, an IVR server, and a B2BUA call center, each a
standalone project with a ./run_demo.sh.
For per-API-surface reference examples (one lane each for endpoint,
stream_peer, callback_peer, unified, plus protocol regression fixtures and
PBX interop), see crates/sip/rvoip-sip/examples/.
โ Beta (
0.2.1) = RFC-correct, tested ยท ๐ง Alpha (0.1.0) = published, API-unstable ยท ๐ฎ Roadmap = planned, not yet implemented
| Method | Status | RFC | Notes |
|---|---|---|---|
| INVITE / ACK / BYE | โ Beta | 3261 | Full state machines, media coordination |
| CANCEL | โ Beta | 3261 | Transaction correlation, glare handled |
| REGISTER | โ Beta | 3261 | Contact management, expiration |
| OPTIONS | โ Beta | 3261 | Capability negotiation |
| UPDATE | โ Beta | 3311 | Mid-session SDP renegotiation |
| PRACK | โ Beta | 3262 | Reliable provisionals |
| REFER | โ Beta | 3515 | Blind transfer |
| SUBSCRIBE / NOTIFY | โ Beta | 6665 | Event packages, subscription state |
| MESSAGE | โ Beta | 3428 | In-dialog and pager-mode |
| INFO | โ Beta | 6086 | DTMF relay, application data |
| PUBLISH | ๐ฎ Roadmap | 3903 | Parser support only; app flow post-beta |
| Feature | Status | Notes |
|---|---|---|
| G.711 PCMU / PCMA | โ Beta | RFC 3551, table-driven |
| RTP / RTCP | โ Beta | RFC 3550 |
| SRTP (SDES) | โ Beta | RFC 3711 + 4568, tested PBX profiles |
| DTMF (RFC 2833 / 4733) | โ Beta | In-band telephone-event payloads |
| Hold / resume | โ Beta | Standard a=sendonly / a=inactive |
| Blind transfer | โ Beta | REFER-based, B2BUA-bridged |
| Conference mixing | ๐ง Alpha | N-way mixing primitives in rvoip-media-core |
| Opus / G.722 / G.729 | ๐ฎ Post-beta | Codec hooks exist; full-media path is post-beta |
| DTLS-SRTP | ๐ฎ Post-beta | Design in place, feature-flagged |
| Echo cancel / AGC / VAD / NS | ๐ฎ Post-beta | Planned; not yet implemented |
| Transport | Status | Notes |
|---|---|---|
| UDP | โ Beta | Primary transport |
| TCP | โ Beta | Connection management, reliability |
| TLS | โ Beta | rustls; tested at PBX edge |
| WebSocket (RFC 7118) | ๐ง Partial | Plain WS round-trip works; WSS / browser interop post-beta |
| QUIC (UCTP) | ๐ง Alpha | rvoip-quic workspace crate |
| WebTransport | ๐ง Alpha | rvoip-webtransport workspace crate |
| WebRTC | ๐ง Alpha | rvoip-webrtc pinned to upstream alpha |
| Feature | Status | Notes |
|---|---|---|
| SIP Digest auth (MD5 / SHA-256 / SHA-512-256) | โ Beta | RFC 3261 + RFC 8760, qop=auth |
| TLS 1.2 / 1.3 transport | โ Beta | Cert validation, custom roots, SNI |
| OAuth 2 / Bearer | โ Beta | rvoip-auth-core |
| STIR/SHAKEN signing | ๐ง Alpha | rvoip-stir-shaken workspace crate |
| OIDC / Passkey / DPoP | ๐ง Alpha | rvoip-identity workspace crate |
| ICE / TURN / STUN | ๐ฎ Post-beta | STUN client landed; ICE/TURN are non-claims |
| ZRTP / MIKEY | ๐ฎ Post-beta | Not a beta claim |
| Workload | Status | Number |
|---|---|---|
| General full-media SIP | โ Beta target | Up to 2,000 CPS sustained |
| Higher CPS profiles | ๐ง Tuned | Available but caveated; see BETA_PERFORMANCE_REPORT.md |
| 10,000 CPS general-user | ๐ฎ Roadmap | Tracked in RELEASE_NOTES_NEXT.md |
The crates/sip/rvoip-sip/docs/RFC_COMPLIANCE_MATRIX.md
and crates/sip/rvoip-sip/docs/SECURITY_POSTURE.md
documents are the authoritative source โ this table is a summary.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ฑ Application โ
โ (softphone, PBX, contact center, voice AI agent, ...) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โฒ
โ rvoip-sip API surface
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ rvoip-sip (โ
beta) SIP-shaped session layer โ
โ โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ โ
โ โ sip-core โ sip-transport โ sip-dialog โ sip-proxy โ โ
โ โ โ โ โ sip-registrarโ โ
โ โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โฒ
โ ConnectionAdapter trait
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐งฌ rvoip-core (โ
beta) transport-agnostic spine โ
โ rvoip-core-traits (โ
beta) cycle-breaker trait surface โ
โ rvoip-media-core (โ
beta) codec / mixing / MediaStream โ
โ rvoip-rtp-core (โ
beta) RTP / SRTP โ
โ rvoip-codec-core (โ
beta) G.711 base codec โ
โ rvoip-auth-core (โ
beta) OAuth2 / Bearer / SIP Digest โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โฒ
โ UCTP (๐ง alpha)
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ง Substrate adapters (alpha โ not in beta closure) โ
โ โโโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ โ
โ โ rvoip- โ rvoip- โ rvoip- โ rvoip- โ โ
โ โ webrtc โ quic โ webtransport โ websocket โ โ
โ โโโโโโโโโโโดโโโโโโโโโโโดโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโ โ
โ rvoip-uctp ยท rvoip-vcon ยท rvoip-harness ยท rvoip-identity โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
The dependency direction is enforced. rvoip-core never imports an adapter
crate. Adapters depend on rvoip-core and register themselves via
ConnectionAdapter. This is what lets a single Orchestrator bridge a SIP
call to a WebRTC client (and, later, to a QUIC peer or an AI participant)
without the substrates knowing about each other.
| Crate | Purpose |
|---|---|
| rvoip | Facade โ opt into transports/extensions via features (default sip) |
| rvoip-sip | SIP umbrella โ Endpoint / StreamPeer / CallbackPeer / UnifiedCoordinator |
| rvoip-sip-core | RFC 3261 message parsing, SDP, URIs |
| rvoip-sip-transport | UDP / TCP / TLS / WebSocket transport |
| rvoip-sip-dialog | Dialog state machine + transaction layer |
| rvoip-sip-proxy | Stateful SIP proxy primitives (RFC 3261 ยง16) |
| rvoip-sip-registrar | REGISTER processing + location service |
| rvoip-core | Transport-agnostic spine: Conversation / Session / ConnectionAdapter |
| rvoip-core-traits | Cycle-breaker trait + type surface |
| rvoip-infra-common | Event bus, executors, shared infra |
| rvoip-media-core | Codec negotiation, mixing, MediaStream trait |
| rvoip-rtp-core | RTP / SRTP framing and transport |
| rvoip-codec-core | G.711 codec implementation |
| rvoip-auth-core | OAuth2 + Bearer + token primitives |
These publish at 0.1.0 (API-unstable) so the rvoip facade can expose
them behind feature flags (webrtc, uctp, voip-3, sip-stir-shaken, client). Expect
breaking changes before each graduates to beta.
| Crate | Why it's alpha |
|---|---|
| rvoip-client | Client SDK โ API still in motion |
| rvoip-uctp | UCTP protocol design ongoing (GAP_PLAN) |
| rvoip-quic | New QUIC substrate adapter |
| rvoip-webtransport | New WebTransport substrate adapter |
| rvoip-websocket | Deferred per rvoip 3 v1.x |
| rvoip-webrtc | Pinned to upstream webrtc 0.20.0-alpha.1 |
| rvoip-vcon | First Rust impl of the IETF vCon draft โ publishes |
| rvoip-harness | ASR / TTS / DialogManager provider traits โ publishes |
| rvoip-identity | OAuth 2.1 + OIDC + SIP Digest + Passkey backends |
| rvoip-stir-shaken | STIR/SHAKEN signing + verification |
| rvoip-users-core | Reference user-management service |
Tracked in detail under docs/GAP_PLAN.md.
Highlights below.
rvoip-websocketsubstrate adapter (graduate WS to โ beta)- Full AAuth production status (waiting on IETF WG adoption)
- DTLS-SRTP fingerprint binding (feature-flagged, design in place)
- vCon Postgres reference store (
rvoip-vcon-postgres) - Inline envelope signature enforcement at adapter ingress
- SIP-over-QUIC adapter
- RTP-over-QUIC (RoQ)
- Media-over-QUIC (MoQ) for broadcast fan-out
- Multi-party SFU / MCU integration (LiveKit / mediasoup)
- AI agents as first-class peer Participants in multi-agent flows
Contact centers, CPaaS providers, and voice-AI platforms in 2025โ2026 stitch together a polyglot stack: FreeSWITCH or Asterisk for SIP, Janus or mediasoup for WebRTC, RTPEngine for media bridging, and custom Lua / Python / Erlang for orchestration glue. rvoip targets the same workload as a single Rust process โ SIP, WebRTC, and (eventually) UCTP substrates handled by one library, with bridging and transcoding as first-class primitives.
The Vapi / Retell / Bland / OpenAI-Realtime cohort proved real-time voice AI is a venture-scale market. rvoip is the first end-to-end Rust substrate aimed at that category โ SIP B2BUA, AI harness with clean ASR/TTS/Dialog provider traits, WebRTC interop for browser users, and a single command/event surface for all of it.
For new builds that don't need the legacy footprint. Single Rust binary, async-first, memory-safe.
For carriers and ITSPs needing SIP trunking, PSTN interconnect, codec negotiation, STIR/SHAKEN passthrough, and billing-grade usage records without paying for orchestration features they don't need.
For the conversation-compliance market โ rvoip-vcon is the first Rust
implementation of the IETF vCon draft.
The UCTP substrate model gives rvoip a place to land SIP-over-QUIC, RoQ, and MoQ when those mature (2027โ2029) without breaking the SIP path.
See docs/PRD.md ยง1.2 for the
full positioning analysis.
# Get the source
git clone https://github.com/eisenzopf/rvoip.git
cd rvoip
# Build the workspace
cargo build --workspace
# Run a working example
cargo run -p rvoip-sip --example endpoint_local_call
# Run the SIP test suite
cargo test -p rvoip-sip -p rvoip-sip-core -p rvoip-sip-dialog \
-p rvoip-sip-transport -p rvoip-sip-proxy -p rvoip-sip-registrarRun the workspace test suite:
scripts/test_all.sh # workspace-wide test runnerTreat this release as a beta candidate. The beta scope is documented above โ anything beyond it is the caller's responsibility to validate with their own interop, security, and performance gates.
- ๐ Bugs: open an issue with reproduction steps
- ๐ก Feature requests: discussions or issues โ please reference the rvoip 3 docs for context
- ๐ง Pull requests welcome โ workspace-wide tests run via
scripts/test_all.sh
Licensed under the MIT license. See LICENSE.
Built with โค๏ธ in Rust ยท ๐ Docs ยท ๐ก Examples ยท ๐ Issues ยท ๐ฌ Discussions