Back to blog
Logotipo oficial de CERNphone mobile: auriculares con teclado de teléfono sobre fondo azul

CERNphone: telephony for more than 5,000 users

ProductCERNphoneTelephonyCross-platform

Changing the telephony of an institution like CERN isn't changing just any application: it's touching a service thousands of people use daily to do their jobs. When Skype for Business had to be retired, the answer was to build something in-house.

Between 2019 and 2022 I worked on the CERNphone client, the system that replaced it: I programmed the SIP layer on top of SIP.js and the Electron desktop applications that integrated CERN's telecommunications systems. Today it serves more than 5,000 users and handles around 30,000 calls a day.

The problem

Corporate telephony doesn't forgive failures. If email is five minutes late, nobody notices. If a call doesn't come through, people notice.

CERN needed four things:

  1. Breaking away from Skype for Business without interrupting service.
  2. Connecting with its existing telecommunications systems.
  3. Giving every person a client that worked equally well on macOS, Windows and Linux.
  4. Respecting its numbering model: users registered to several numbers —individual or service numbers— with delegations between colleagues.

That ruled out buying a closed solution and hoping it would fit: the integration had to be built custom.

How it was built

The work was split into three pieces.

Cross-platform desktop

A single codebase for the three desktop systems:

  • Electron as the application shell.
  • React and Redux for the interface and state management.
  • SIP.JS for voice.

SIP.JS implements SIP —the standard protocol behind IP telephony— using WebSockets as transport. The application registers, places and receives calls talking directly to the telephony infrastructure.

Session API, scaled on OpenShift

Behind the clients, a Python REST API manages the sessions. The key piece is where it lives: deployed on OpenShift, the services scale horizontally —when load rises, the platform spins up more replicas instead of growing the machine—. Centralizing that logic on the server keeps the clients lightweight and behavior consistent across platforms.

Mobile and provisioning

For mobile we didn't write an application from scratch: we went with open source apps based on SIP.js with a custom visual layer. Our own work went into the provisioning system, which links each iOS and Android app to the user's account and the numbers they're authorized for.

And the numbers are not trivial. In CERNphone the same person can be registered to several numbers —individual or service numbers— and delegations let another user answer their calls when they're unavailable.

The result

CERNphone replaced Skype for Business and today serves more than 5,000 people with around 30,000 calls a day, from desktop and mobile applications.

What can be transferred

The lesson isn't "use Electron and SIP.JS". It's that an organization's telephony can be integrated into its own applications when you understand the protocol and build on top of it. And that not everything has to be built: on mobile, the best decision was to customize an open source softphone and put the effort into provisioning.

For any institution that wants to control its communications —or connect voice with its internal systems— this project is proof that it can be done. And at scale.

More real-world cases