Blog

Engineering insights from the Miuda.ai team

Subscribe via RSS
· Miuda Team

RustPBX as a Cluster: One Voice Plane Across Many Nodes

Single-box PBX is easy. The hard part starts when you run two nodes and discover that “shared database” doesn’t make phones work together: a call lives on exactly one node, registrations land wherever the load balancer sends them, and the console you’re logged into may have no idea that the extension you want to transfer is being served by its neighbor.

RustPBX 0.5 closes that gap with a distributed session registry. Here’s what it changes in practice.

· Miuda Team

WebRTC Calling Without the Science Project: Browsers as First-Class Endpoints

Hand someone a browser and a headset and they’re on the phone — no install, no VPN, works from a hotel lobby. That’s the promise of WebRTC telephony, and the part that usually turns into a science project is everything around the codec: ICE, STUN/TURN, certificate handling, and the NAT scenarios that only fail on customer networks.

RustPBX treats browsers as first-class endpoints. Here’s what’s actually involved.

· Miuda Team

One-Way Audio, Fixed: NAT, Multi-WAN and EIP Media Routing

“Outbound calls have no audio, inbound is fine.” If you’ve run SIP for a week, you’ve met this sentence. It’s almost never the codec — it’s address advertisement: the PBX told the far end an IP it can’t reach.

RustPBX separates the three addresses that SIP/WebRTC care about, and lets you override each per deployment, per network profile, or per trunk.

· Miuda Team

It's 9 PM. Someone Calls Your Sales Line. What Happens?

Every business hits the same requirement in week one: calls arriving outside business hours need a story. Not a busy tone, not an infinite ring — a story. Maybe a voicemail box, maybe an emergency escalation for VIPs, maybe a “we’re closed, back at 9” prompt in three languages.

This post walks through the patterns RustPBX gives you for after-hours handling, from the simple to the fairly sophisticated.

· Miuda Team

Adding an AI Voice Bot Without Rewriting Your IVR — and Handing Off to Humans Cleanly

The requirement behind half the AI-telephony pitches: “let an LLM answer the simple calls, and hand complex ones to a human — without throwing away the phone system we already run.” Most stacks make you choose between a bolt-on bot platform (its own SIP island, its own CDRs) and a rewrite. RustPBX treats the bot as a first-class resident instead. Here’s the architecture, and specifically how the human handoff stays clean.

· Miuda Team

RustPBX Basics: Hardening a Public PBX — the First 48 Hours

A PBX with a public IP gets scanned within minutes of going live. SipVicious and its cousins register-probe every open 5060 on the internet, hunting for default passwords they can turn into toll-fraud. Here’s the hardening checklist for the first 48 hours — all of it built in, none of it requiring external tooling.

· Miuda Team

RustPBX Basics: CDR — Every Call, Fully Explained

A call detail record is only as useful as the questions it can answer. “Who called whom, when, and how long” is table stakes. The questions that actually matter at 2 AM are: why did it fail, which route did it take, was the audio bad on our side or the carrier’s, and did it transfer, and where. RustPBX CDRs are built to answer those without opening a PCAP.

· Miuda Team

Screen-Pop Done Right: CRM Records on the First Ring, Not After Transfer #3

“When a customer calls, we want their CRM record on the agent’s screen before they answer.” — the most common call-center integration request, and the one that breaks most often. The pop works on the first ring, dies on transfer #3, data sometimes never reaches the queue, and agents resort to manual search.

This post covers how RustPBX solves it, and why the details matter.

· Miuda Team

Running a Call Center on RustPBX

A contact center is more than a PBX with queues. It needs skill-based routing to send calls to the right agent, real-time monitoring for supervisors, wrap-up time for agents to finish notes, and overflow logic to prevent callers from waiting forever.

RustPBX’s CC (Contact Center) addon provides all of this out of the box. This post walks through setting up a functional call center – from skill groups to supervisor monitoring.

· Miuda Team

SipFlow: Call Signaling, Recordings, and Cluster Deployment

Debugging SIP calls usually means running tcpdump, downloading PCAP files, and opening Wireshark. It works, but it’s slow, requires server access, and doesn’t scale.

SipFlow is RustPBX’s built-in signaling capture system. It records every SIP message and RTP packet, stores them efficiently, and presents a visual timeline in the web console. Need a recording? Generate a WAV from the captured RTP data with one click. Need to debug a call from last week? Query it by call ID.

And when a single node isn’t enough, SipFlow supports cluster deployment with consistent hashing.

· Miuda Team

Operations Made Easy: Archive, ACME, and Transcript

Running a telephony platform isn’t just about connecting calls. Day-to-day operations involve renewing TLS certificates before they expire, archiving old call records so the database doesn’t grow forever, and transcribing recordings for quality audits.

RustPBX bundles three addons that handle these chores automatically. Here’s how each one works.

· Miuda Team

Privacy Numbers Made Easy with JSON-RPC Routing

Ride-hailing apps, delivery platforms, and marketplaces all share a common requirement: connect two parties on a phone call without revealing their real numbers. This is the classic privacy number (AX/NXA) use case.

RustPBX’s SBC addon includes a JSON-RPC router that makes this straightforward. Every incoming call can query your backend API, get the real destination, rewrite the numbers, and connect the call – all in real time.

· Miuda Team

Rust vs Go: WebRTC Data Channel Performance Benchmark

In the world of real-time communication, performance is paramount. WebRTC has become the standard for peer-to-peer audio, video, and data transfer. While the browser implementations are well-known, server-side and native implementations are crucial for building scalable infrastructure, gateways, and high-performance clients.

This article presents a performance benchmark comparing three prominent WebRTC implementations, with the code available at restsend/rustrtc:

  1. RustRTC: A pure Rust implementation of WebRTC (the project under test).
  2. webrtc-rs: The most popular Rust implementation (a port of Pion).
  3. Pion: The industry-standard Go implementation of WebRTC.

We use cookies for anonymous analytics to improve the site. Nothing is loaded until you accept. Privacy Policy