respect explicit inbound route targets and store voicemail in the configured mailbox
- Prevent inbound routes with an explicit empty target list from ringing arbitrary registered devices by distinguishing omitted targets from empty targets.
- Route unrouted or no-target inbound calls to voicemail with a generated unrouted greeting instead of falling back to random devices.
- Pass voicemail box identifiers through proxy events and runtime handling so recordings are saved and indexed under the correct mailbox instead of always using default.
require explicit inbound DID routes and normalize SIP identities for provider-based number matching
- Inbound route resolution now returns no match unless a configured inbound route explicitly matches the provider and called number.
- Normalized routing identities were added for SIP/TEL URIs so inbound DIDs and outbound dialed numbers match consistently across provider-specific formats.
- Call handling and incoming call events now use normalized numbers, improving routing accuracy for shared trunk providers.
- Route configuration docs and the web route editor were updated to support explicit inbound DID ownership, voicemail fallback, and IVR selection.
- Mixer RTP handling was enhanced to better support variable packet durations, timestamp-based gap fill, and non-blocking output drop reporting.
fix inbound route browser ringing and provider-facing SDP advertisement while preventing RTP port exhaustion
- Honor inbound routing `ringBrowsers` when emitting incoming call events so browser toast notifications can be suppressed per route.
- Rewrite SDP and Record-Route using the destination leg's routable address, using `public_ip` for provider legs and LAN IP for device and internal legs.
- Store provider leg public IP metadata on legs to support correct per-destination SIP message rewriting.
- Change the RTP port pool to track sockets with `Weak<UdpSocket>` so ports are reclaimed automatically after calls end, avoiding leaked allocations and eventual 503 failures on new calls.
- Remove unused dashboard/status, DTMF, relay, and transport helper code paths as part of engine cleanup.
preserve negotiated media details and improve RTP audio handling across call legs
- Use native Opus float encode/decode to avoid unnecessary i16 quantization in the f32 audio path.
- Parse full RTP headers including extensions and sequence numbers, then sort inbound packets before decoding to keep codec state stable for out-of-order audio.
- Capture negotiated codec payload types from SDP offers and answers and include codec, RTP port, remote media, and metadata in leg_added events.
- Emit leg_state_changed and leg_removed events more consistently so the dashboard reflects leg lifecycle updates accurately.
add B2BUA SIP leg handling and WebRTC call bridging for outbound calls
- introduce a new SipLeg module to manage outbound provider dialogs, including INVITE lifecycle, digest auth retries, ACK handling, media endpoint tracking, and termination
- store outbound dashboard calls as B2BUA calls in the call manager and emit provider media details on call_answered for bridge setup
- separate SIP and WebRTC engine locking to avoid contention and deadlocks while linking sessions to call RTP sockets
- add bidirectional RTP bridging between provider SIP media and browser WebRTC audio using the allocated RTP socket
- wire browser webrtc-accept events in the frontend and sipproxy so session-to-call linking can occur when media and acceptance arrive in either order
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