pavanputhra

pavanputhra

Comcent CE - an open-source voice/contact-center platform on Elixir/OTP, with call queues modeled as processes

I’ve been building Comcent CE, an open-source, self-hostable voice/contact-center platform, and Elixir/OTP is the core of it. Sharing the design here since the process model shaped the whole architecture, and the “why Elixir” reasoning might be useful to others working on similar systems.

Why Elixir, concretely:

1. The actor model let the design mirror the mental model. Just like a real person managing a queue, a process is spawned whose sole job is managing that call queue. You reason about the system the same way you’d reason about people doing the work — the domain model and the code line up almost one-to-one, which made the hard parts (transfers, requeues, routing) far easier to implement.

2. Built-in distribution made scaling out the easy part. Each queue needs exactly one manager process — and that “exactly one” guarantee has to hold across the entire cluster, even as the number of queues grows into the thousands or millions. Elixir’s clustering plus a distributed registry gives us a cluster-wide singleton per queue: only one Queue Manager runs for a given queue anywhere in the cluster, and if the node hosting it goes down, it’s restarted elsewhere while staying unique. We get horizontal scale without changing the mental model at all — the same process abstraction that made single-node reasoning simple is what makes the distributed version work.

The rest of the stack:

  • Phoenix — APIs, the real-time layer, and the per-call timeline

  • FreeSWITCH — the media/SIP engine; Elixir drives call control over FreeSWITCH’s HTTP API (mod_httapi), with the Event Socket (ESL) in some cases

  • Go — small services powering the SIP-aware voice bots

  • RabbitMQ — event pipeline between telephony and processing

  • Postgres — calls, transcripts, vCon records · Redis — caching/ephemeral state

  • SvelteKit frontend with an embeddable browser dialer

On top of this it produces full call timelines, dual-channel recording, diarized transcripts, AI summaries, and implements the IETF vCon standard.

GitHub:

Walkthrough (bare VM → first call):

Website:

Where Next?

Popular in Announcing Top

mathieuprog
Hello :waving_hand: Allow me to introduce you to Tz, an alternative time zone database support to Tzdata. Why another library? First a...
New
seancribbs
Today I released a new dialyzer Mix task as the dialyzex package! At the time we started writing this task, the existing dialyzer integra...
New
pkrawat1
Presenting Aviacommerce, open source e-commerce platform in Elixir Aviacommerce is an open source e-commerce platform in Elixir. We at...
New
zorbash
I created Kitto a framework for dashboards inspired by Dashing. The distributed characteristics of Elixir and the low memory footprint...
New
woutdp
Hi! I wanted to introduce my latest project LiveSvelte. It allows you to render Svelte inside LiveView with end-to-end reactivity. It’s ...
New
MRdotB
I needed to reuse React components from my Chrome extension in my Phoenix/LiveView backend. I noticed that for Svelte/Vue, there are live...
New
sbs
Only 650 LOC, wrote for fun :slight_smile: https://github.com/sunboshan/qrcode
New
zachdaniel
Ash Framework What is Ash? Ash Framework is a declarative, resource-oriented application development framework for Elixir. A resource can...
New
OvermindDL1
Been making an MLElixir thing (not released yet…) for fun in spare time in the past day. I’m just trying to see how much I can get an ML...
132 14057 106
New
mattludwigs
Grizzly is a library for working with Z-Wave devices. Z-Wave is a low-frequency radio protocol for controlling smart home devices on a me...
New

Other popular topics Top

AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New
Nvim
Anybody knows a comprehensive comparison of Django and Phoenix, thanks for the help. Where are they similar? Where do they differ the m...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
AstonJ
Please see the new poll here: Which code editor or IDE do you use? (Poll) (2022 Edition) It’s been a while since we first asked this, I...
208 31265 143
New
boundedvariable
I am going through the kafka architecture. All the features what the kafka is providing are already in Erlang. I would like hear your opi...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement