Changelog
User-visible changes only. Internal refactors and infrastructure work omitted.
v0.0.1 — Initial rollout (2026-06-22)#
The first ship covers the full feature set end-to-end. Module identity, permissions, admin pages, and the lifecycle hooks are all wired; the API mounts at /v1/modules/scaidial/.
Call handling#
- SIP trunks register outbound to any carrier or PBX via livekit-sip. Auth by credentials or IP whitelist. Per-trunk sync state machine (
pending→synced→error) with retry endpoint. - DIDs map carrier-delivered numbers to dialplans.
- Extensions route calls to a user (
wave), a bot (bot), a voicemail box, an external number, or a SIP endpoint. Per-extension DND, ring timeout, timeout action, outbound caller-ID override, and voicemail greeting. - Dialplans with six match types (
always,did,extension,caller_prefix,time_window) and six action types (ring_extension,ring_bot,voicemail,forward,hangup,play_message). Visual rule builder ships with the admin UI.
Live call control#
- Active Calls page lists every call in
ringing/active/held, with per-leg controls: hangup, hold/unhold, blind transfer (SIP REFER). - Bots ring via the same kickoff path ScaiBot's web widget uses — no separate orchestration layer.
Voicemail + history#
- Voicemail recordings stored in ScaiBunker S3. Web playback via the admin UI and
/my/dial. - Optional voicemail transcripts via ScaiEcho — opt-in per tenant.
- Call History page with five filters: caller substring, extension, end reason, date range. Keyset pagination.
End-user portal#
/my/dialself-service surface. Every tenant user with at least one extension grant sees their extensions, voicemail, recent calls, and forwarding rules.- DND toggle and forwarding-rule manager on owned extensions, no admin permission required.
- In-browser softphone — click-to-call to any E.164 or SIP URI. WebRTC into a LiveKit room; SIP leg added via livekit-sip.
Tenant policy#
- Per-tenant policy table with the first opt-in: voicemail transcripts (off by default). Audit trail of who flipped what.
Admin operations#
- Generic SIP trunk form — no provider-specific bindings.
- Test-connection probe before persisting a trunk.
- Carrier-whitelist tuple surfaced on the Trunks page: egress IPv4/IPv6, SIP port, RTP UDP range.
- All admin pages use typed forms — no JSON editing required for the day-to-day flow.
Integrations#
- ScaiBot voice — extensions of type
botroute calls to a ScaiBot bot. The bot's voice worker joins the same LiveKit room as the SIP participant. - ScaiEcho — voicemail transcripts run through ScaiEcho when the tenant opts in.
What's not in v0.0.1#
- Multi-trunk routing (LCR). The current outbound originate picks the oldest synced trunk per tenant.
- Attended transfer. Blind only in v1.
- Conference rooms. Two-leg calls only.
- IVR menus. The
play_messageaction is one-way. - Per-voicemail-box configuration. One tenant-wide default box for now.