Files
siprouter/changelog.md
Juergen Kunz f3e1c96872 initial commit — SIP B2BUA + WebRTC bridge with Rust codec engine
Full-featured SIP router with multi-provider trunking, browser softphone
via WebRTC, real-time Opus/G.722/PCM transcoding in Rust, RNNoise ML
noise suppression, Kokoro neural TTS announcements, and a Lit-based
web dashboard with live call monitoring and REST API.
2026-04-09 23:03:55 +00:00

9.4 KiB

Changelog

2026-04-09 - 1.8.0 - feat(providerstate)

sync provider registrations when config is reloaded after save

  • Adds provider state synchronization to create registrations for new providers, remove deleted providers, and re-register providers whose configuration changed.
  • Preserves detected public IP when rebuilding provider state for updated provider configs.
  • Triggers registration status broadcasts after config reload so runtime state stays aligned with saved provider settings.

2026-04-09 - 1.7.0 - feat(audio)

add directional RNNoise suppression to transcoding and preserve RTP continuity during announcement handoff

  • adds per-direction RNNoise denoising in the Rust opus transcoder with 48kHz frame processing
  • passes transcoder direction through the TypeScript bridge so browser-bound and SIP-bound audio use separate suppression state
  • shares RTP sequence and timestamp counters between announcements and live provider audio to avoid browser jitter buffer discontinuities
  • updates the background restart script to rebuild the Rust codec before bundling

2026-04-09 - 1.6.0 - feat(codec,call,web-ui)

add isolated codec sessions for concurrent call transcoding and fix form input event handling

  • adds per-session Rust codec state with create_session and destroy_session support to prevent concurrent calls from corrupting Opus and G.722 state
  • updates WebRTC call setup to await transcoder initialization and clean up codec sessions on teardown
  • improves codec robustness with safer PCM handling, larger Opus decode buffers, auto-reinit after bridge exit, and telephony tuning for Opus encoding
  • switches multiple web UI forms from changeValue to input/newValue events so text fields and checkboxes update reliably

2026-04-09 - 1.5.1 - fix(call,opus-codec)

improve SIP/WebRTC RTP routing and use cached FFT resampling for transcoding

  • route browser-to-provider RTP through the SIP leg socket to avoid symmetric RTP double-path issues
  • preserve active calls when a WebRTC leg disconnects by removing only the terminated leg and updating call state correctly
  • set dynamic SIP From URIs and display names for mediated and conference invites
  • replace the custom resampler with rubato FFT resampling and cache resamplers by rate pair and chunk size for continuous audio streams

2026-04-09 - 1.5.0 - feat(contacts,phone)

add starred contacts quick dial flow and improve call/media handling

  • Add starred contacts to config and app state, with sorting and contact stats support in the contacts view.
  • Let contact actions open the phone view with a selected contact and show starred contacts as quick-dial entries.
  • Update the phone and contacts UI to use dees input components and show all devices with online/offline status.
  • Prevent raw codec passthrough on transcode failure and forward RTP using the parsed payload instead of slicing serialized packets.
  • Adjust the 3x Opus downsampling lowpass filter coefficients for improved resampling behavior.

2026-04-09 - 1.4.0 - feat(calling)

add cached TTS announcements, external participant dialing, and call history support

  • pre-generate Piper-based announcements and cache encoded G.722 and Opus RTP frames for SIP and WebRTC playback
  • add encode_pcm support in the Rust codec bridge with anti-aliased PCM resampling for direct PCM-to-codec encoding
  • add API and UI support for dialing external participants into an existing call
  • record completed calls in bounded call history and expose them in the web UI
  • improve RTP handling with stable SSRC usage, codec-specific silence payloads, and safer async transcoding sequencing

2026-04-09 - 1.3.1 - fix(router)

prevent duplicate app navigation callbacks when syncing tab selection with URL updates

  • add an optional skipCallback flag to router navigation so URL changes do not re-trigger view loading
  • update sipproxy app tab selection handling to push browser history without causing navigation loops
  • limit router-driven appdash view loading to browser back/forward navigation

2026-04-09 - 1.3.0 - feat(webrtc-ui)

add routed dashboard views with contacts and provider management, and fix browser WebRTC call linking and audio forwarding

  • Defers browser WebRTC leg creation until the offer arrives, links the standalone session on accept, and routes SIP-to-browser audio through the WebRTC peer connection to prevent one-way audio
  • Adds URL-routed app views for overview, calls, phone, contacts, providers, and log, replacing the previous dashboard-only layout
  • Introduces contacts support in config and app state, exposes contacts in status payloads, and adds UI to create, edit, delete, and call contacts
  • Expands provider configuration management to support editing full provider settings plus adding and removing providers
  • Makes outbound provider selection tolerant of deployments with no configured providers to avoid forwarding errors

2026-04-09 - 1.2.0 - feat(call)

introduce a hub-based call manager with SIP and WebRTC legs, unified RTP port pooling, and expanded call control APIs

  • Adds a new call hub model with Call, Leg, SipLeg, WebRtcLeg, shared types, and centralized RTP forwarding/transcoding.
  • Replaces the legacy call originator flow with CallManager-driven call handling in the SIP proxy bootstrap.
  • Extends the web API and dashboard to support provider selection, richer call status, adding/removing legs, transfers, and WebRTC call control.
  • Refactors WebRTC bridge responsibilities to signaling only while moving media handling into the new call layer.

2026-04-09 - 1.1.1 - fix(calloriginator)

handle 200 OK retransmits without rebuilding the bridge and always start RTP keepalive silence when remote media is available

  • Resend ACK for repeated 200 OK responses and return early once the call is already connected.
  • Prevent duplicate bridge setup and repeated state transitions on SIP response retransmits.
  • Start the silence stream for all calls with remote media to keep the provider media path alive and help open the RTP NAT path.

2026-04-09 - 1.1.0 - feat(webrtc)

add browser audio device controls and improve WebRTC audio bridging

  • add microphone and speaker selection to the browser softphone
  • show local and remote audio level meters during active WebRTC calls
  • ensure the WebRTC answer negotiates sendrecv audio so the server can send RTP to the browser
  • extract and use sender SSRC for browser-bound RTP and add diagnostics for SIP-to-WebRTC media flow
  • avoid starting the SIP silence stream for browser calls to prevent media path issues with easybell

2026-04-09 - 1.0.0 - platform

Major 1.0.0 release delivering a configurable multi-provider SIP router with web UI, browser softphone support, and Rust-based media transcoding.

  • Introduced a generic multi-provider SIP proxy/router architecture with local registrar, per-provider upstream registration, digest auth handling, configurable routing, device status, quick-dials, and provider-specific call quirks
  • Added a full web dashboard and later migrated it to a component-based frontend using @design.estate/dees-element, with provider/device/call/log views, status APIs, WebSocket updates, hot reload behavior, and improved app shell/modals
  • Added configuration APIs and settings UI for editing providers, devices, inbound routing, quick-dials, and browser ringing behavior, persisted to .nogit/config.json
  • Renamed the project from grandstream-sip-proxy to SipRouter, including binary naming and updated user-agent branding
  • Added WebRTC softphone support for browsers, including browser device registration, incoming-call notifications, accept/reject handling, targeted WebSocket messaging, and device-aware call routing
  • Improved browser device UX with automatic registration, browser-specific naming, (this browser) labeling, duplicate/stale registration cleanup, IP display, and always-visible configured devices with connection state
  • Added HTTPS support for browser audio flows, including inbound browser ringing, single-port HTTP/HTTPS serving, and re-enabled getUserMedia once TLS was available
  • Refined call routing so calls go to the selected device instead of a hardcoded endpoint, including explicit device selection requirements and defaulting outbound origin to the first SIP device instead of the browser
  • Improved call stability by starting a silence stream when leg B connects to prevent provider teardown before media is flowing
  • Migrated runtime/server infrastructure from Deno to Node.js/tsx, replacing Deno-specific APIs with Node.js HTTP/HTTPS and WebSocket implementations
  • Completed media handling in Rust, replacing buggy TypeScript G.722 processing with a single IPC transcoding path covering Opus, G.722, PCMU, PCMA, resampling, and verified browser-to-mobile audio bridging
  • Included prior build/runtime work such as TypeScript migration, Deno support with single-binary compilation, and related setup as part of the path to the final 1.0.0 architecture

2026-04-08 - unknown - initial

Initial SIP-aware proxy for Grandstream HT801 ↔ easybell connectivity.

  • Added SIP message parsing with binary passthrough to avoid corrupting STUN keep-alives and RTP
  • Implemented Contact and Request-URI rewriting between LAN and public addresses
  • Added SDP rewriting and per-call RTP relay sockets
  • Added NAT priming and G.722 silence streaming after 200 OK so easybell detects inbound media promptly
  • Inserted Record-Route so in-dialog ACK/BYE/re-INVITE continue through the proxy
  • Included captured device setting snapshots and setup documentation for diagnosing registration issues