What's New
Media & Codecs
- Zero-copy fast-path relay for all same-codec transport combinations, with transcode fallback (
40dd791a); - New codecs: Opus and G.729, 48 kHz telephone-event DTMF (
cafcec33,1753ced3,719de07b); - Video SDP negotiation, proxy video re-INVITE, and payload passthrough (
5902a71b,e59e70d3,ee15b87e); - WebRTC↔RTP SDP bridging and per-leg negotiated media profiles (
d7eda01d,b2e0a473).
Queue & Contact Center
- Escalation plans with skill-group routing; per-call overflow overrides via transfer URI query params (
804594df,9728227e); - Supervisor listen/whisper/barge/takeover with cross-session takeover (
0ecfca32); - 3-way conference RTP bridging and conference room SIP dial-in (
debb0539,2868c09a); - RFC 7433 UUI
session_idcall correlation (c2a4cc10); - Queues/IVR/trunks/routes/ACL can now be stored in the database and edited from the console (
generated_db).
IVR
- Unified app orchestration (
StartApp) with builtin IVR flows (8d54c211); - Step-mode IVR driven by an external HTTP provider — your service becomes the IVR brain (
31ce1dc2); - Session-level IVR fallback recovery, mid-call recording segments, session artifacts API (
717badb6); - IVR route points resolved through the call-routing engine (
07fccc0f).
Cluster
- Distributed session registry wired end-to-end; media anchored to the call-owning node (
723e29e4,cc53bd8e,cd7feacf); - Cluster-aware AMI: active-call query
GET /calls, per-session lookup, remote reload status (10de0d06,660b74c4); - Cluster log viewer and subject-scoped event broadcast (
fe4ddeb6).
RWI
- Early-media recording and recording start-point control (early media vs answer) (
9ef05682,69108b98); - New commands:
session.resume,call.transfer.replace,call.set_var/get_var,call.send_dtmf,dtmf.collect,call.leg_add/leg_remove,app.chain,conference.end/merge; - All call-scoped events carry a root call identity block; broadcast events enriched with full call context (
f084bde9,93ccae5f); - Originate out a named carrier trunk, with agent attribution for agent-to-customer dials (
963397f0,a5c0c1b8).
SipFlow & Recording
- High-throughput SipFlow: async flush, multi-threaded remote send, MTU batching, SSRC loss reports (
403dcd3d,44d0f07e); - Deterministic flush so post-call queries see the tail messages (
bc522f81); - Unified recording pipeline with signaling opt-out JSONL sidecar (
5ce4c500); - Call records / CDR JSON / signaling JSONL upload to S3 or HTTP; manual archive with progress tracking (
c78256a5,6a38e55f); - Recording waveform visualization and playback controls in the console (
d0a0ca2e).
Console
- Call trace timeline and unified call-error registry with a reference page (
3cef29d1,6fb719e4); - Bilingual UI (English/中文) and a notification system (
1dbe4a70,30f8a971); - Routing strategy stack view with runtime ordering and PATCH API (
c7ca2e0f,4c8353b2); - Built-in web dialer and JsSIP softphone (
800ce250,c5c3876c); - REST endpoints for extensions (with import), sip-trunks, routing, settings, and diagnostics.
Auth & SSO
- OAuth2-style SSO login broker for native apps (
3e48ac63); - JWT fast registration — REGISTER without the 401/407 challenge round-trip (
d4fa436c,[proxy.jwt_auth]); - HTTP token-based user backends, in-dialog auth caching, AMI CIDR allowlists (
fd9e52b5,d1197f72).
Routing & Trunks
parallel_forkwithmax_ring_time; weighted trunk selection (fdd7288b,8ac66da1);- Trunk health checks (OPTIONS probes) and per-trunk
external_ip/bind_ipwith network profiles (511ae09c,7254b495,4c469f81); - Original-INVITE custom header passthrough onto callee legs (
c448a0f1,b7df087e); - Per-trunk CPS and concurrent-call limiters (
4fa4f04d).
Transfers & Outbound
- REFER blind-transfer B2BUA fallback; interactive transfers on resilient media bridges (
0ecfca32,8ce6cd9f); - Configurable call forwarding and voicemail transfer targets (
9d5bdb46,7c5627bc); - Queue transfers carry business context (UUI/custom headers) so agents inherit context (
8cb20a54).
NAT & SIP Core
- NATed Contact rewriting on inbound INVITE/REGISTER (
310c2224); - New knobs:
sip_external_ip,auto_sip_external_ip,local_networks,[[network_profile]]; - Standardized SIP error codes across routing with call-trace events (
3509757d).
Ops & AMI
- Graceful drain-then-exit for SIGTERM/SIGINT plus AMI
/shutdown(c3bd892a); - Hot reload for ACL, trunks, routes, queues, IVR, and TLS certificates (
4a83164d,ea1fd22a,5679cc03); - Console diagnostics toolbox: active dialogs, trunk test calls, route evaluator (preview routing decisions before changing routes), extension locator;
- Health endpoint exposing tokio runtime metrics;
/metricsPrometheus text format and/healthzprobes.
Performance
- 5k-CC recording collapse fixed (
7c37af8c): recorder queue sizing, dedicated media runtime for recording tasks, SIP workers scaled to cores/2 — from 17.7% packet loss at 3.3k concurrent to 4,943 concurrent recorded calls at 0% loss; - SIP signaling and RTP media now run on isolated tokio runtimes (
7b82ba88); - ~130 hot-path heap allocations removed; RWI memory leak fixed (
c72bf042); - Memory locator switched from
tokio::MutextoDashMap; faster registration sweeps (49262229,e0345b94); - SipFlow ingest/flusher throughput + jemalloc by default (
f0429cb0,c841228f); - Faster proxy failover: earlier 100 Trying and no-trying timeout (
3c005717).
Full benchmarks: tests/bench/bench.md, docs/capacity-planning.md, and the README benchmark section.
Notable Fixes
NAT / Contact
- Inbound INVITE/REGISTER Contact rewritten so in-dialog ACK/BYE/OPTIONS route correctly behind NAT (
310c2224); - Contact URI derived from the inbound transaction, fixing WebRTC registrations (
f2465792, #251).
re-INVITE / SDP
- B2BUA re-INVITE relay with refreshed SDP snapshots (
03cdfa2e); - RTP bridge rebuilt after re-INVITE; codec-change renegotiation handled (
dfeee606,94b01d0e, #183).
DTMF
- First DTMF and first inbound packets no longer dropped (
746ac8cd); - Duplicate DTMF events eliminated (
5f1e6b49, #158).
CDR
- Missing ring time and incorrect durations fixed (
4967c057); status_codelocked to the INVITE final response (58d15aed).
WebRTC
- Cluster-routed BYE no longer swallowed by
.invalidaddresses (5075d5d4); - One-way audio from unstripped RTP header extensions fixed (
a2fd4ff2); - Callee WS BYE black hole fixed via client-role dialog flow affinity (
fdd624a1).
Registration / Locator
- Agent lifecycle preserved across registration races (
a7cd2cff); - Agent presence ownership survives restarts (
065d50b0).
Queue / CC
- Agent logout no longer leaves the CC panel stuck on idle (
7f26b911); queue_joinedstrictly ordered before ACD events (53055bd0).
Media
- One-way audio on PCMA↔G722 mismatch fixed (
963e4d88); - G.722 decoding and jitter-buffer fixes (
2994b59f); - RTP continuity preserved across bridge segments and transfers (
335fb933,840e4b09).
SIP core
- Orphan BYE now answered with 200 instead of hanging the peer (
d927c332, #245); - CANCEL tears down immediately with 487 — no 2-second delay (
5dc10a70); - Session-timer refresher role and missing header fixed (
edd81a47).
Memory leaks
- WebRTC/P2P per-call media leaks (
19ff5184,6b6f2663); - RWI originate/transfer dialog guards and REFER NOTIFY listeners (
0953126a,fec6c2b8).
Breaking Changes & Upgrade Guide
Recording & SipFlow
-
[sipflow]alone no longer captures RTP. RTP capture now requires an explicit recording config:[recording] enabled = true type = "sipflow" # signaling-only capture is unchanged
-
callrecordstorage now defaults totype = "database"(previously local JSON files in examples). Configure[callrecord]explicitly for local files, S3, or HTTP upload. -
Recording auto-start point is configurable (early media vs answer).
SIP behavior
session_timernow defaults totrue(RFC 4028, Supported mode);video_codecsdefaults to["H264", "VP8"]; newvideo_policyoption (pass_through/strip/transcode);- New NAT/network controls:
sip_external_ip,auto_sip_external_ip,local_networks,[[network_profile]]— review your NAT setup if you relied on implicit defaults.
RWI protocol (the biggest changes)
- Event rename:
call_incoming→call_created; - Removed commands:
media.stream_start/media.stream_stop/inject_start/inject_stop— usecall.transferto avoip_bridge:/bridge:WebSocket endpoint (binary PCM16 frames) for real-time audio;record.mask_segmentremoved; - Removed events:
dn_state_changed/dn_registered/dn_unregistered,call_metadata_updated,ivr_flow_transitioned,queue_overflowed,parallel_originate_*,session_resumed,media_stream_started/stopped,record.segment_masked; record_stoppedno longer carries the recording URL — listen forrecord_end/recording_metadata_available;- Renamed event:
supervisor.takeover.completed→supervisor.takeover.started; - Parameter changes:
call.originate(nohold_music/hold_music_target),queue.enqueue(noskills/max_wait_secs),conference.create(nobackend/record); - Event field changes:
ani/dnis/root_call_id/operation_idremoved;caller/caller_name/callee_name/trace_id/hangup_by/duration_secs/transfer_targetadded; - Config keys
[rwi].enabledand[rwi].contextsremoved; [rwi.smart_routing],[rwi.local_rules],[rwi.sip_header_passthrough]are now explicitly documented as design proposals, not implemented — don't rely on them.
Console / HTTP API
- All console JSON endpoints are unified under the
/apiprefix behind an auth middleware with a CSRF guard; new static Bearer token auth via[console].api_tokenswith scopes; - The
/licenseslist route was removed (/licenses/verifyremains); - Locator/registration payloads changed:
aoris now a fullIP:portaddress,destinationcarries a transport prefix, and new fields were added (home_proxy,supports_webrtc,transport,user_agent,expires).
Removed components & config
- Addons removed:
endpoint_manager,enterprise_auth,sbc; - Config keys removed:
[proxy].sip_flow_max_items,media_cache_path; verify-i18nbinary removed; newrustpbx dumpsubcommand exports the DB DDL;- The
opusCargo feature was removed — Opus is always available via audio-codec.
Deployment
- Source builds now require submodules:
git clone --recurse-submodules(addonscc,wholesale,ivr_editor,telemetry,voicemailare submodules now); - Docker image: base moved to
debian:trixie-slim,libopus0no longer needed, sounds moved to/app/config/sounds(a compat symlink at/app/soundsis kept); - New environment variables:
DEEPGRAM_API_KEY(remote transcription),CC_PHONE_AUTH_SECRET(phone auth).
Database
- Migrations run automatically on startup (disable with
--skip-migrate); this release adds three:outbound_sip_trunk_idcolumn on call records,config_entriestable (DB-backed config),cluster_sessionstable (cluster session registry); - Stale migration records are pruned and self-healed at startup;
- Stack upgrades: sqlx 0.8 → 0.9, sea-orm 1.1 → 2.0.
Dependencies
| Crate | 0.4.6 | 0.5.0 |
|---|---|---|
| rsipstack | 0.5.12 | 0.6.7 |
| rustrtc | 0.3.66 | 0.3.132 |
| audio-codec | 0.3.38 | 0.4.5 |
| sea-orm | 1.1.20 | 2.0 |
| sqlx | 0.8.6 | 0.9.0 |
New Contributors
Thanks to everyone who contributed code, reviews, and bug reports. First-time contributors in this release:
- @autopeasant
- @themooer1 (git author: Eugene Wolffe / Cream Crumpets) — Contact URI fixes (#240)
- @v0l (Kieran) — SDES-SRTP negotiation (#227) and queue-target fix
- @tgeorge06 (Tyson George) — originate out a named carrier trunk
Continuing from previous releases: @shenjinti (maintainer), @yeoleobun, @dengxiayehu (elliottjiang), @zen2do (liu zhen), @rgon (Gonzalo Ruiz), @zhouhailin, @davidcforbes, @deweydb, @umran — and everyone who filed issues and tested release candidates.
Upgrading
docker pull ghcr.io/restsend/rustpbx:latest
# or from source:
git clone --recurse-submodules https://github.com/restsend/rustpbx.gitReview the Breaking Changes above — in particular the RWI event renames and the recording configuration — then start the new binary; database migrations run automatically.
- Documentation: docs/ · Configuration Guide
- Community announcement (中文): 0.5.0-release-zh.md
- Docker:
ghcr.io/restsend/rustpbx:latest· Web console:http://localhost:8080/console/