sidetone

What it does

A real phone system, not a demo.

The things an office phone system has to do, done from one program. Routing is data, not code: a prefix, a trunk, a priority. There is no dial-plan language to learn.

Calls

  • Extension to extension, with caller display
  • Hold with music, blind and attended transfer
  • Call parking and call pickup
  • Busy-lamp keys on desk phones
  • HD voice (G.722) where both ends have it
  • Emergency numbers that no limit may refuse

Outside lines

  • SIP trunks, by registration or by IP
  • Routing rules by prefix, with failover
  • Inbound numbers to any extension
  • Toll-fraud limits: call caps, duration, prefixes
  • Behind NAT, each peer is told the address it can reach

The office

  • Ring and hunt groups
  • Call queues with agents, and a wallboard
  • Voicemail with message-waiting lamps and email
  • Menus, defined as data
  • Business hours, with public holidays
  • Call recording, by user, trunk or queue

Phones and clients

  • UDP, TCP, TLS, WebSocket
  • Browser softphones over WebRTC
  • Yealink desk phones that configure themselves
  • A shared phonebook the phones fetch
  • Prompts spoken from text, voicemail written down, by a speech server of your own

No restarts

Change it while it runs.

Add a provider, a route or an extension and it is live before you have finished reading the answer. Nothing reloads. Calls in progress are never disturbed, including when you replace a TLS certificate. Configuration is an immutable snapshot swapped atomically; every new call reads the current one.

# a provider, and a route that sends numbers starting with 0 to it
$ curl -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
    -d '{"name":"provider","type":"register","host":"sip.provider.example",
         "username":"acct","password":"secret"}' \
    http://127.0.0.1:8080/v1/trunks
$ curl -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
    -d '{"name":"national","prefix":"0","strip":1,"prepend":"+44","trunk_ids":[1]}' \
    http://127.0.0.1:8080/v1/routes
# the next call out uses it; no restart, nothing reloaded

What it is not

It exists because the others do too much.

Configuration languages, dozens of modules, external databases, reload cycles: that is what the big servers cost, and what most offices never use. So these are out, on purpose:

  • Carrier-scale clustering
  • A scripting language, or any dial plan
  • A call-centre suite
  • Video
  • Conferencing
  • Fax
  • Presence and instant messaging
  • Multi-tenancy