Skip to content
BioDream-LLCPublic

About

Open-source phone system, NG911 call handling, P25 radio dispatch console and NG911 Core Services in one Go binary. By BioDream LLC.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

160 Commits

Folders and files

Repository files navigation

BitVoice

An open-source, single-binary alternative to FreePBX and Asterisk

A complete, Apache-2.0 licensed phone system for offices, contact centres and hosted providers, run 100% from its web interface. No Asterisk or FreeSWITCH underneath. No configuration files to edit. No paid modules. No licence meter.

One 37 MB file. 47 MB of memory carrying four live calls and eight phones. Double-click it and a browser opens on a setup wizard; a few minutes later a phone rings.

License Go Release Platforms CI

Try BitVoice now: the live demonstration, no install

Sign in as demo with password try-bitvoice-demo · then open the browser phone as extension 150, password try-the-demo-phone, and dial 810 or *43 · an invented business, reset every night · look at everything, change nothing · or watch the tour (2½ minutes)

Download v0.1.8

Download BitVoice for Linux, x86-64 Download BitVoice for macOS, Apple Silicon Download BitVoice for Windows, x64

Read the BitVoice manual

One file, nothing to install. ARM64 Linux and Windows, Intel Macs and checksums

Quick start · Everything it does · Public safety (lab) · What it looks like · Manual · Manual (PDF) · FAQ


What is BitVoice?

BitVoice is a phone system packaged like an appliance: one binary, one built-in web interface, no outside runtime, and still a REST API and configuration in Git for those who want them. Underneath is its own Go engine: SIP and IAX2, RTP and SRTP, a media engine with codec conversion, and WebRTC. Calls arrive, wait in queues, ring phones and browsers, are recorded and logged, and reach the people who answer them.

100% in the web interface. That is the first rule of the project. Setup, extensions, phones, routing, queues, trunks, updates and rollback, diagnostics: every setting has a screen, and a feature that can only be reached through a file or a command line is treated as a bug. Every screen has a chapter in the manual and automated browser tests. Telecom administrators run it without being developers; developers automate the same screens through the API.

It runs as:

  • A phone system for offices and businesses: extensions, ring groups, queues, menus, voicemail to email, recording, conference rooms, forwarding and follow-me, a staff portal, desk-phone set-up, a browser phone, SIP and IAX2 trunks, and an import from FreePBX, Asterisk, 3CX, Cisco, Avaya and Mitel.
  • A hosted phone service: many organisations on one server, each with its own extensions, numbers, administrators and web address, and limits on what each may use.
  • A contact centre: queues with a live wallboard, callbacks, VIP and sticky routing, supervisors listening in, transcripts and summaries, caller cards from your CRM.

Built to a 911 reliability bar. Routing scripts and integrations can never lose or hold up a call: each has a time limit and a fixed outcome when it fails. Emergency calls from every extension always go out, with the caller's building, floor and room.

Two missions. BitVoice is built for two jobs, and neither is a side project:

  1. A standalone phone system that beats FreePBX, Asterisk and their rivals. Everything above, with no 911 parts needed or shown: a business that only wants a phone system never sees them.
  2. The call-handling side of BioDream's open-source CAD, bitdispatcher. The same engine carries a 911 answering-point profile, a P25 radio dispatch console and NG911 Core Services, and hands the CAD what it needs through the standards: EIDO incidents with links to the caller's photos and video, ALI spill, PIDF-LO location, live video by WHEP, radio emergencies and unit positions, the i3 log. They are built and tested against recorded captures, NENA's published schemas, sample data and stand-ins, not certified and not yet tried with a live ESInet or P25 system. They stay off the menu until switched on in Settings; see Public safety: lab and design-partner track.

BitVoice sits between phone carriers, the ESInet, radio systems and phones on one side, and the people answering, CAD, records and Teams or CRMs on the other. In the middle it routes, queues, records, logs and converts codecs.

Everything it does

Eleven areas of the phone system, itemised; the public-safety lab track follows. Where something has only been tested against stand-ins rather than real equipment, it says so.

Phone systemEverything an office phone system does
Extensions with voicemail, call recording, an emergency location (site, floor and room) and what happens when nobody answers
Ring groups and auto-attendant menus, with extensions dialled directly from the menu
Schedules: opening hours and holidays, with a different destination for open and closed
Voicemail: greetings recorded in the browser, *97, message-waiting lamps, the message emailed with its recording
Hold, blind and attended transfer, call parking, paging and overhead speakers, busy lamps (BLF)
SIP trunks over UDP, TCP or TLS, with registration, channel limits and failover between trunks
IAX2 trunks (RFC 5456) to Asterisk and FreePBX servers and IAX2 providers, registering either way, with call tokens; tested against Asterisk 23
Call routing by dial pattern, with prefixes added or digits removed, and 911 always allowed from every extension
Office 911 for every profile: Kari's Law notification, RAY BAUM'S Act building, floor and room, remote workers asked to confirm where they are
Scripts in JavaScript or Lua that route calls, or run whole calls (play, say, collect keys, record, ring people, transfer, hang up), sandboxed and time-limited, with a fixed fallback if a script fails
A call flow diagram of where calls go, and a call-path simulator: pick a caller, number and time and see the exact route, without ringing anything
Check every situation: the whole call plan tried in every combination of hours over the coming year, toggles, menu keys and no-answers, and every extension dialling 911, listing calls that end nowhere, loops, dead branches and emergency calls resting on one trunk, each with the situation that shows it; the same check runs on a change before it is made
Every call says how it was routed, in plain words on its record: the route, the hours, toggles, scripts, keys, forwards and trunks that decided it
Judges that give their reasons: a toll-fraud guard on every call abroad (first call to a country, out of hours, from outside, bursts, attacks; never an emergency call), a trunk health judge that tells a provider that is down from your own link being down, and a call-quality diagnosis that compares both halves of each call. Each follows a rulebook checked in every combination of its facts; something not measured is never taken for safe
Video calls between phones that both send video, relayed and encrypted like the sound
Hot desking (*33), a company directory on every phone, calendar-driven do not disturb from Outlook and Google
Conference rooms with a PIN and a leader PIN, wait for the leader, members joining muted (press 1 to ask to speak), lock, recording, and a live view to mute or remove people
Forwarding always, when busy and when not answered (*72, *90, *52), do not disturb (*78, *79, *76) and follow-me (*21) with press 1 to take the call, so a mobile's voicemail never answers it
Call pickup for a group (*8) or one phone (**), intercom with auto-answer (*80), company and personal speed dials (*0); every code can be changed on one page
A staff portal: people sign in with their extension and voicemail PIN to set do not disturb, forwarding, follow-me and speed dials, hear their voicemail, record their greeting and see their calls
Contact centreQueues, agents and supervisors
Queues: longest idle, round robin or ring all, wrap-up time, longest wait, and a live wallboard
Agents log in and pause from their phones (*45, *46) or the screen
Sticky routing back to the agent a caller spoke to last, and VIP callers to the front of every queue
Callbacks booked by callers or by staff, alerted on every open screen
Supervisors listen, whisper and barge on live calls
A customer timeline: every call, recording, transcript, voicemail, text and note for one number
CRM caller cards and automatic call logging with any system that has a web address
Call links: a web address, QR code or website button that rings you from any browser, no app and no number
AIWith the AI service you choose, or one you run yourself
AI receptionists that say they are automated, answer from facts you approved, take messages, book callbacks and always reach a person. A set-up that would loop a caller back to an assistant is refused
Transcripts and summaries of recorded calls and voicemails, and search across what was said
Transfer briefings: a two-sentence summary for whoever a call is transferred to, so callers never repeat themselves
Ask in plain words ("forward sales to my mobile after 5 pm"), shown as a proposed change you approve
Any OpenAI-compatible service, OpenRouter by default; for a 911 centre, its own government cloud counts as local
PhonesAny SIP phone, a browser, or a mobile
Automatic set-up for Yealink, Poly, Grandstream (and HT adapters) and Snom over HTTPS, by MAC address or DHCP option 66
A browser phone (WebRTC) built on our own ICE, DTLS and SRTP, docked on every screen, with BitVoice's own TURN server for networks that block UDP
SIP over WebSocket for WebRTC softphones made with JsSIP, SIP.js and the like
A staff phone page for anyone without a desk phone, signed in with the extension's own password
iPhone and Android apps that ring like a desk phone even when closed, paired by QR code
Microsoft Teams Direct Routing: BitVoice as the tenant's SBC, Teams users and extensions calling each other
Fax and textsFax, analogue lines and business texting
T.38 fax relay with G.711 fallback through fax gateways and providers
Fax numbers BitVoice answers itself: every fax kept as a PDF and emailed
Faxes sent from the web interface or by emailing a document
Analogue phones, fax machines, door phones and ISDN through SIP gateways: Grandstream HT, Patton SmartNode, AudioCodes; or telephony cards in the server: analogue ports, T1/E1 PRI and BRI ISDN (caller names, redirecting numbers, transfers handed to the phone company, advice of charge), E&M trunks with Feature Group D, MFC-R2 in nine country variants, and SS7 (ISUP, ITU and ANSI)
Business texting from your numbers through TextMagic, Twilio, SignalWire, Telnyx, Bandwidth, Vonage, Plivo, Flowroute, VoIP.ms or your own webhook, several at once, with a guided US 10DLC registration
One Inbox for the chat box on your website, WhatsApp (templates included), Facebook Messenger and texts
Codecs and mediaOur own media engine
G.711, G.722, Opus, G.729, G.726 (all four rates), AMR and AMR-WB, iLBC, Speex and GSM, converted between any two, so a browser on Opus talks to a carrier on G.729 or an old gateway on G.726; G.723.1 too, through ffmpeg when you allow it
SRTP to every phone that encrypts, and SIP over TLS
Recording in stereo, a pause for card numbers (*7 and *8, PCI DSS), retention, legal holds, and recording consent announcements by region
The IMBE P25 voice codec: decoded with code from GopherTrunk and encoded by our own encoder
InsightQuality, costs and evidence
Call quality per site and per provider (MOS, jitter, loss) with a diagnosis in plain words
Call insight for supervisors: talk ratio, talking over, silence, measured from the sound, never an automatic score
Costs by department, person and trunk, from your provider's prices, with budgets
Spam protection from STIR/SHAKEN results, block lists and caller reputation; branded calling and a reputation watch on your own numbers
Call history with recordings, CSV export and search
SecurityLocked down by default
Fail-to-ban for addresses that keep failing, and toll-fraud limits: premium-rate numbers refused unless allowed
Two-step sign-in with an authenticator app, and single sign-on through any OpenID Connect provider
An audit log of every administrative action, and API tokens that are shown once
Secrets from AWS Secrets Manager or Azure Key Vault; cryptography only from Go's standard library, never written here
OperationsRunning it for real
Several servers as one phone system over a shared PostgreSQL database: calls carry on when a server stops, and a shared address moves to a running one
Hosted organisations: many phone systems on one server, each with its own data (its own folder on SQLite, its own schema on PostgreSQL), web address or domain and administrators; limits on extensions, calls at once, storage and AI use; suspend without deleting. Emergency calls are never refused
SQLite on one server, PostgreSQL for several
Health page saying what is missing, emergency calling first; a live SIP trace; a call generator that measures what your hardware carries
Updates uploaded in the browser, installed when no calls are up, with Go back in one click and an automatic rollback if the new version fails to start
Every change is a revision: see what changed, restore with a preview, export and import
Prometheus and OpenTelemetry metrics
Moving inBring your old system with you
Import from FreePBX (a whole Backup & Restore backup, SIP passwords, trunks, routes, groups and queues included) and Asterisk (pjsip.conf, sip.conf), 3CX, Cisco Unified CM, Avaya IP Office and Communication Manager and Mitel MiVoice Business
Every import shows exactly what would change first, and becomes a revision you can undo
Asterisk AMI and ARI compatibility, so tools written for Asterisk keep working: ARI applications (Stasis) with playback, recordings, keys, mixing bridges and continue; AMI with queue agents, ConfBridge, parked calls, mailboxes, filters and user events
Clouds and codeAutomation and clouds
A REST API behind every screen, described at /api/openapi.json
Configuration from Git, and a Terraform example with the generic REST provider
AWS and Azure images and templates; recordings, voicemail and backups copied to S3 or Azure Blob Storage (our own SigV4 and Entra code, no cloud SDKs)

Public safety: lab and design-partner track

The engine that runs the phone system also carries three public-safety profiles. They are not certified for live 911 or radio dispatch, and they have not yet run against a live ESInet, P25 RFSS or PSAP CAD. They are tested against a real ISSI capture, NENA sample data and stand-ins (see How it is tested). They stay off the menu until Public-safety profiles (lab) is switched on in Settings, and their screens say they are a lab track.

We are looking for design partners: a PSAP, a 911 authority or a radio shop willing to run BitVoice in a lab or in shadow mode beside their current equipment. One real integration is worth more to us than any feature on this list. Open an issue titled "Design partner" and we will get in touch.

911 profileNG911 call handling for a PSAP
NENA i3 calls from the ESInet with the caller's PIDF-LO location and the network's additional data, shown to the call-taker as the call rings
ALI spill over TCP and EIDO over HTTPS to any CAD when a call is answered
Location rebids and transfers between PSAPs with the data kept
The NENA i3 log, and answer-time reports by call-taker and hour against your goal, as CSV too
TTY (deaf callers' text telephones) decoded and answered on every 911 call, real-time text (RFC 4103) and text to 911 from a text control centre (MSRP, over TLS too), in one conversation on the call
Caller video and photos by a link, no app: live camera (WHIP), photos, clips and recordings of the live video kept with their SHA-256, time and GPS, and named in the EIDO to CAD; opened blurred until revealed, with an exposure report for the wellness programme; CAD and units watch by link (WHEP)
A map of the caller's position and its uncertainty, from your own tiles (works offline)
Legacy 911: CAMA trunks on telephony cards, and location looked up by callback number for calls that bring none, by HELD or the old ALI link (network or serial port, read by your provider's layout); ALI spill to CAD over the network or a serial port
Report layouts: lay out your state's form (rows by day, week, month, hour or call-taker; your columns and headings) and run it as a table, a spreadsheet or a page to print
Test calls (urn:service:test.sos) answered by themselves, as NENA i3 section 9 asks
Radio consoleRadio dispatch on the same headset as the phones
Radio-over-IP channels through gateways (JPS, Omnitronics, Cisco, Telex and others): hold to talk, monitoring, patches
P25 talkgroups over the ISSI: the console joins a talkgroup's home RFSS, asks for the floor, shows the talking unit and its emergency flag
Encrypted talkgroups (TIA-102.AAAD): AES-256, DES-OFB and triple DES. Keys are never shown again once saved; without a key the audio is muted, never noise
Private calls: a dispatcher calls a radio by unit ID, and radios call the console
Alert tones: steady, warble, pulsed and beep
Every transmission recorded in a radio log with unit, dispatcher, tone, emergency and encryption, played back from the log
Emergencies stay raised until a dispatcher acknowledges them; simulselect; radio names (Engine 5, not 1205); radio positions from your radio data gateway on a map
Radio data to CAD: who is talking where, emergencies and each transmission, as JSON
NG911 coreNG911 Core Services for a 911 authority
An ESRP with policy rules by service, PSAP, schedule and missing or suspicious location, with overflow and a default PSAP
An ECRF answering LoST (RFC 5222) from your service boundaries
An LVF validating civic addresses against NENA address points and road centrelines
A BCF at the ESInet edge: calls per minute and at once per source, deny lists, STIR/SHAKEN checks, suspicious calls marked for the policy rules
A LIS answering HELD by telephone number, a forest guide for places outside your areas, and an i3 logging service that takes signed log events, checked against the PSAP Credentialing Agency
The NENA i3 web services: a Policy Store whose signed routing policies the ESRP runs, discrepancy reports, bad actors, geocode and MSAG conversion, an ADR, the service/agency locator, dequeue registration and a test call generator, each checked against NENA's published definitions

Radio console: radio channels and P25 talkgroups beside the phones, with the radio log.

The radio console with EMS, Fire dispatch and Police 1 channels, hold to talk and patch buttons, and the radio log with recorded transmissions.


What it looks like

Everything below is the web interface inside the binary, showing a sample clinic with phones registered and calls in progress.

Dashboard: calls now, phones online, trunks, and what needs attention, in plain words.

The dashboard for a sample clinic: four calls now, eight of eight phones online, two of two trunks up, a chart of calls in the last 24 hours and the calls happening now.

Live calls: every call in progress, with the codec, packet loss, jitter and an audio score for each side.

Live calls: four calls into the Appointments queue, each showing both sides with codec, loss, jitter and a quality score of 4.4.

Queues: a live wallboard with callers waiting, the longest wait and each agent's state.

The Appointments queue with one caller waiting, three answered, and three agents on calls.

Call flow: where calls from outside go, step by step, with a simulator that shows the route a call would take.

The call flow diagram: the main number goes to clinic hours, then the main menu, then the Appointments queue, Billing, the clinical team and the front office, each ending at voicemail.

Call history: every finished call, with recordings, quality and search across what was said.

Call history listing answered calls with their talk time and quality scores.

NG911 Core Services: the ECRF, the ESRP's PSAPs and policy rules.

The core services screen with the ECRF and ESRP settings and two PSAPs, East and West.


Download

Install in one command, as a service that starts by itself (the download is checked against the release's SHA-256 sums and BioDream's release signature):

# Linux (systemd) and macOS
curl -fsSL https://raw.githubusercontent.com/BioDream-LLC/bitvoice/main/deploy/install.sh | sh
# Windows (PowerShell)
irm https://raw.githubusercontent.com/BioDream-LLC/bitvoice/main/deploy/install.ps1 | iex

Run it again to upgrade; --uninstall removes it. The manual's Getting started chapter says what each puts where. CI runs both installers on Linux, macOS and Windows on every change.

Or download it: version 0.1.6, one binary, nothing to install. Each archive holds the program, the licence, the notice and the manual as a PDF.

Platform Architecture Download
Windows x64 (Intel/AMD) bitvoice-v0.1.8-windows-amd64.zip
Windows ARM64 bitvoice-v0.1.8-windows-arm64.zip
macOS Apple Silicon bitvoice-v0.1.8-darwin-arm64.tar.gz
macOS Intel bitvoice-v0.1.8-darwin-amd64.tar.gz
Linux x86-64 bitvoice-v0.1.8-linux-amd64.tar.gz
Linux ARM64 / aarch64 bitvoice-v0.1.8-linux-arm64.tar.gz

On Windows, unzip and double-click bitvoice.exe. A window opens and your browser opens on the setup wizard. Keep the window open while you use BitVoice: closing it stops it. Windows asks once whether BitVoice may use the network; allow it on private networks so phones can connect. The data is kept in %APPDATA%\BitVoice. The x64 build runs the full test suite on Windows Server; the ARM64 build is compiled the same way but has not been run on an ARM Windows machine. BitVoice does not install itself as a Windows service yet.

Verify what you downloaded against SHA256SUMS:

shasum -a 256 -c SHA256SUMS --ignore-missing

Signed releases. From v0.1.3, every program carries BioDream's release key and comes with its signature beside it in the archive (bitvoice.sig, or bitvoice.exe.sig on Windows). A release build's Updates page installs only programs signed with that key, so a forged or damaged file is refused. The public key, for checking a signature yourself (ed25519, base64):

M6UaGaLM1T0SekufRzAlUSeSTjfxpVL18YHE5eKkKxY=

v0.1.2 and earlier carry no key: their Updates page accepts any program, signed or not. Upgrade to v0.1.3 or later by hand once to get the check.

Other ways to install
# Go 1.26 or newer
go install github.com/biodream-llc/bitvoice/cmd/bitvoice@latest

# From source
git clone https://github.com/BioDream-LLC/bitvoice && cd bitvoice && make build

The binaries are pure Go with no C libraries, so they run on any Linux, including Alpine and distroless images. deploy/cloud has a systemd unit, a cloud-init file that runs the installer, and build-images.sh, which makes an AWS or Azure machine image (tried on EC2: each server made from the image starts as a new server, with its own certificate and setup code). deploy/terraform configures BitVoice through its API with Terraform or OpenTofu (tried with OpenTofu 1.13: create, change, no drift, destroy). deploy/lab runs several servers as one phone system in Docker on one computer.

Quick start

# 1. Start it. The web interface is inside the binary.
./bitvoice

# 2. A browser opens on the setup wizard (or open https://127.0.0.1:8443). HTTPS only: until you install
#    your own certificate, the browser warns once about BitVoice's self-signed one; continue to the site.
#    Name your organisation, choose the administrator's password, add your first phone.

# 3. Point a SIP phone at this computer, port 5060, with the extension's number and password.
#    Or press the phone button at the bottom of any screen to use the browser as a phone. Dial *43 for the echo test.

Data lives in your user configuration folder (BitVoice), or wherever -data says. Other computers reach the web interface over HTTPS on port 8443. ./bitvoice -h lists the options; every one of them is also a setting in the web interface.

How it is tested

  • On every push (CI): the Go tests on Linux with the race detector on both SQLite and PostgreSQL, on Windows and on macOS; and the browser tests below. Fuzzing covers the SIP, SDP, STUN and SRTP parsers.
  • Every setting has a screen, checked on every push: a test walks the whole configuration and fails if any setting is not named in the web interface, so nothing can quietly become file-only or API-only.
  • Browser tests in Chromium that drive every screen the way a person would: the setup wizard, every form, real WebRTC calls between browser phones and the call engine with sound checked in both directions, a fax sent, and the radio console joined with the browser phone.
  • P25 checked byte for byte against a real ISSI capture (from NIST's public-domain ISSI tester), and the encryption against the standard's own worked examples.
  • NG911 checked against NENA sample data and stand-ins for the ESInet, ESRP and CAD.
  • SIP trunks checked against a real Asterisk 23.5 playing the carrier, with another Asterisk as a desk phone: registration with digest authentication; calls in to the main number and out through the trunk, with sound (no loss, MOS 4.4); DTMF both ways (RFC 4733); the caller's number and name; busy and failed numbers passed back as such. Real carriers are not yet tried.
  • Across the internet on Amazon EC2: Asterisk 20 as the carrier and as a desk phone, each on its own server, BitVoice on others: registration, calls in and out with caller ID, busy, keys pressed both ways (RFC 4733), the browser phone from outside, MOS 4.4. Two BitVoice servers sharing PostgreSQL, a provider line held by one at a time: a call in on one server answered by a phone on the other; the server carrying it killed (kill -9) or stopped as for an upgrade: the call carries on (about 5 seconds of silence after a kill, none after a stop), the provider line moves, one call record. One-command install on Ubuntu 24.04 (x86 and Arm), Debian 12 and Amazon Linux 2023, running again by itself after a reboot.
  • More real systems on EC2: Windows Server 2022 installed by the one-command installer and reached from outside after a restart (its first try found the installer's health check failing under Windows PowerShell 5.1, fixed); a real FreePBX 17.0.33 backup imported whole (it found the upload and unpacking limits too small for a real backup, fixed: backups are now read as a stream); SNMP walked and traps received by net-snmp; recordings archived to a real S3 bucket and a trunk password read from AWS Secrets Manager; transcripts and summaries from a real model through OpenRouter.
  • Hardware-free stand-ins on EC2 and AWS Device Farm: T1 PRI through the real DAHDI kernel driver, with two spans wired together in the kernel and Asterisk as the phone company (it found that restarting the card bridge left the PRI with no B-channels, fixed); the Android app on a Google Pixel 11 in Device Farm, paired, called and calling out (it found the system bars covering the app on Android 15 and later, fixed); H.323 sound both ways with H323Plus; a machine image built and started, and Terraform applied with OpenTofu. Fax against spandsp (it found that a fax number whose identity was written with spaces could not call out, fixed), and Kamailio and FreeSWITCH as far ends over TLS (calls in over a provider's own TLS connection were taken for a phone's and challenged, fixed). Voice Connector, AWS's own SIP trunk, could not be tried: it is closed to this account until AWS Support opens it.
  • IAX2 checked against a real Asterisk 23: registration, calls both ways with sound, busy; GSM decoded sample for sample as ffmpeg does, and G.726 streams exchanged with ffmpeg.

Feature maturity

How far each part has been proven, plainly. Field-tested: run against real systems over a real network (Amazon EC2, the internet, real providers' services). Checked against a reference: tested against an independent implementation or the standard's own data. Software-tested: BitVoice's own tests and browser tests only, not yet with real equipment or accounts. Lab: public-safety parts, not certified.

Area Maturity What it rests on
SIP trunks: registration, calls in and out, caller ID, busy, keys (RFC 4733) Field-tested a commercial carrier, SIP.US (demo account, from EC2): registration and calls out to the public phone network over UDP and over TLS with the carrier's certificate checked; MOS 4.39, no loss. Calls in wait for the account's verification. Asterisk as the carrier across the internet on EC2; MOS 4.4. Kamailio 5.7 (registration with digest sign-in over TLS, calls both ways, keys) and FreeSWITCH 1.11 (TLS and SRTP, calls both ways, G.722 to G.711) as the far end; MOS 4.39
Desk phones over SIP Field-tested Asterisk as a desk phone across the internet. Real Yealink, Poly or Grandstream handsets not tried yet
Browser phone (WebRTC) Field-tested from outside to EC2; Chromium browser tests with sound both ways
Two servers, one PostgreSQL, failover Field-tested kill -9 and planned stop on EC2: the call carries on, the provider line moves
One-command install Field-tested Ubuntu 24.04 (x86, Arm), Debian 12, Amazon Linux 2023, Windows Server 2022, macOS; back after a reboot
Capacity Field-tested 200 calls at once, no loss, on c7g.large, c7i.large, t4g.small, an M4 and the Lightsail nano
FreePBX migration (Import) Field-tested a real FreePBX 17.0.33 backup (70 MB) imported whole; others from FreePBX's own formats
AI transcripts, summaries, receptionist Field-tested a real model through OpenRouter
Archive to S3, secrets from AWS Secrets Manager Field-tested real AWS, our own SigV4
SNMP monitoring and traps Field-tested net-snmp's snmpwalk and snmptrapd
Let's Encrypt Field-tested issues and renews the public demo's certificate
Machine images (AWS) and configuration as code Field-tested an EC2 image built by deploy/cloud/build-images.sh from Ubuntu 24.04: each server from it starts new; deploy/terraform with OpenTofu 1.13 (create, change, no drift, destroy). Azure images not tried
IAX2 trunks Checked against a reference Asterisk 23
H.323 trunks Checked against a reference H323Plus 1.28 (its simph323 playing and recording WAV files) on EC2: calls both ways with Fast Connect and G.711, each end hearing the other's tone, MOS 4.39; call set-up also with Asterisk's chan_ooh323 (whose own sound is broken in Asterisk 22)
SIP over WebSocket Checked against a reference JsSIP and SIP.js
Codecs: GSM, G.726, iLBC, MP3 hold music Checked against a reference ffmpeg, the RFC 3951 reference program and minimp3, sample for sample
Codecs: G.711, G.722, Opus, G.729, AMR, Speex Software-tested own round-trip tests; Opus and G.729 through their pinned Go libraries; Opus calls with the Android app
ISDN PRI and BRI, T1/E1 Checked against a reference libpri (Asterisk's), both sides; and on EC2 through the real DAHDI 3.4 kernel driver (two spans wired together in the kernel, Asterisk 20's chan_dahdi as the phone company): calls both ways with numbers and names, all 23 channels at once, MOS 4.39. No physical card or line yet
MFC-R2, E&M Checked against a reference OpenR2; MF tones by our own tests. No real card or line tried
SS7 (ISUP, MTP, link sets of several links with changeover) Checked against a reference libss7 (Asterisk's chan_dahdi library), ITU and ANSI. No real carrier link tried
Fax (T.30, T.38) Checked against a reference spandsp (through Asterisk 20) on EC2: BitVoice receiving and sending faxes itself over T.38 (2 pages, 14,400 bit/s, error correction) and passing faxes between two other machines over T.38 and over G.711; no fax provider or gateway tried
Provisioning: Yealink, Poly, Grandstream, Snom, Fanvil, Cisco, Mitel, Sangoma, Algo, CyberData Software-tested the vendors' documented formats; not on real handsets
Skinny (SCCP) phones, MGCP gateways Software-tested own tests; no Cisco phone or gateway tried
Microsoft Teams Direct Routing Software-tested own tests; no Teams tenant tried
Hotel (FIAS) Software-tested own tests; not against Opera
Texting, WhatsApp, Messenger, web chat Software-tested stand-ins for each provider's API
CRM caller cards, Azure Blob, Azure Key Vault Software-tested stand-ins
iPhone and Android apps Field-tested (Android) Android: a Google Pixel 11 (Android 17) in AWS Device Farm against BitVoice on EC2 with a Let's Encrypt certificate: paired by link, rang, answered from the notification, called out; Opus, MOS 4.1, about 5% of packets lost between the phone lab and the server. iPhone: Simulator only; push wake-up needs our own Apple and Firebase accounts
911 profile, radio console, NG911 Core Services, caller video Lab NENA's schemas and sample data, Wireshark, spandsp, OpenSSL, ExifTool, ffmpeg, a NIST P25 capture; never on a live ESInet, P25 system or PSAP CAD, and not certified
P25 Phase 2 half-rate voice (AMBE+2) Not offered patented until 2028
Ed448 signatures (NENA) Not offered not in Go's standard library, and BitVoice writes no cryptography of its own; Ed25519 is used
SS7 signal transfer (STP), SCCP/TCAP Not offered a PBX is an end point; number portability and toll-free lookups are the carrier's
MFC-R2 China variant Not offered OpenR2's own China variant disagrees with itself, so there is nothing sound to test against
ALI over PAM or E2 Not offered through a gateway; BitVoice speaks the request-and-text ALI links

Capacity

Measured with BitVoice's own call generator (Health, Call generator) on v0.1.6: one extension calls another, which the generator answers and sends the audio back, G.711 with media relayed through BitVoice, 45 seconds a call. The generator runs inside the same process, so each call is carried three times over (caller, PBX, answerer): the PBX alone needs less.

On an Apple M4 desktop (10 cores, 16 GB):

Calls at once Answered Set-up time (p95) Audio loss MOS CPU (peak, of one core) Memory
50 50 of 50 4.1 ms 0% 4.41 77% 57 MB
100 100 of 100 3.6 ms 0% 4.41 141% 72 MB
200 200 of 200 2.9 ms 0% 4.41 171% 98 MB

On the public demo's server, an Amazon Lightsail nano (2 vCPUs, 512 MB, about $5 a month), with the demo's own data and services running:

Calls at once Answered Set-up time (p95) Audio loss MOS CPU (peak, of one vCPU) Memory
50 50 of 50 11.4 ms 0% 4.41 46% 61 MB
100 100 of 100 7.8 ms 0% 4.41 95% 74 MB
200 200 of 200 20.9 ms 0% 4.41 186% 101 MB

A nano's CPU is burstable: 200 calls at once uses nearly both vCPUs, which it can do for a while, not all day.

On Amazon EC2 with Ubuntu 24.04, v0.1.7 installed with the one-command installer and nothing else running (CPU is the peak, of one vCPU):

Machine 50 calls at once 100 calls 200 calls
c7g.large (Graviton3, Arm, 2 vCPUs, 4 GB) 23% CPU, 44 MB 40%, 59 MB 84%, 88 MB, 3.6 ms set-up
c7i.large (Intel, 2 vCPUs, 4 GB) 28% CPU, 46 MB 52%, 60 MB 101%, 89 MB, 6.6 ms set-up
t4g.small (Graviton2, Arm, 2 vCPUs, 2 GB, burstable) 45% CPU, 44 MB 104%, 60 MB 147%, 90 MB, 8.5 ms set-up

Every run: all calls answered, 0% audio loss, MOS 4.41. 200 is the generator's own ceiling, not BitVoice's. Your numbers depend on the codec, conversion, recording and the network: run the generator on your own server before you go live.

The iPhone app is tested in the iOS Simulator against a real BitVoice: paired by link, rung by a call, answered and hung up (mobile/ios/BitVoiceUITests). The phone's own call screen and push wake-up need a real phone and are not yet tried on one. The Android app is tried on the Android 15 emulator the same way (paired, rung, answered with Opus and no loss); its first run there found and fixed a crash on every start after the first.

Status, plainly. The phone system is working. The 911, radio console and NG911 Core Services profiles are built and tested against stand-ins and real captures, not yet against a live ESInet, P25 system or PSAP CAD, and not certified for live 911 or public-safety use. P25 Phase 2 half-rate voice (AMBE+2) is not included: it is patented until 2028. Phase 2 systems whose ISSI talkgroups carry full-rate voice work today.

Documentation

Website Features, the FreePBX comparison, how it is tested, downloads; built from this README and the manual by make site
Manual 75 chapters in six parts, with 63 diagrams, step-by-step set-up and reference tables. Also docs/manual/index.html in a checkout
Manual (PDF) The same, about 90 pages with a contents page, for printing; also in every release archive
Help in the program Every screen has a Help button that opens its article; ⌘K searches screens and articles
API /api/openapi.json on any running BitVoice describes every call the web interface makes

FAQ

Is BitVoice really free? What is the licence?

Yes. Apache License 2.0: commercial use, modification, distribution and private use are all permitted, with no fee, no paid modules, and no per-extension, per-agent or per-position pricing. See LICENSE and NOTICE. BioDream LLC earns from hosting and support subscriptions only.

Is it built on Asterisk or FreeSWITCH?

No. The SIP stack, RTP, SRTP, the media engine, WebRTC (ICE, DTLS and SRTP), the P25 ISSI and the IMBE encoder are BitVoice's own Go code. The only outside code is six pinned, pure-Go libraries listed in NOTICE: the JavaScript and Lua engines, the SQLite and PostgreSQL drivers, and the Opus and G.729 codecs, plus GopherTrunk's IMBE decoder.

Can I move from FreePBX, Asterisk, 3CX, Cisco, Avaya or Mitel?

Yes. Upload the exported files on Import; BitVoice shows exactly what would change before anything is applied, and the import is a revision you can undo. From FreePBX, drop a whole Backup & Restore backup (.tar.gz, FreePBX 13 to 17): extensions with their SIP passwords and voicemail PINs, PJSIP and chan_sip trunks, outbound and incoming routes, ring groups and queues come over in one step, and the preview lists what cannot (IVRs, time conditions). Tried on a real FreePBX 17.0.33 backup (70 MB, read as a stream). The step-by-step move is in the manual's Import chapter. Tools that talk to Asterisk's AMI or ARI can control BitVoice too.

Does it do what FreePBX does?

The everyday features, yes: extensions, ring groups, queues, menus, schedules, voicemail, recording, paging, parking, conference rooms, forwarding, do not disturb, follow-me, call pickup, intercom, speed dials, a staff portal, SIP, IAX2 and H.323 trunks, Skinny (SCCP) phones and MGCP gateways, day/night toggles, PIN sets, caller ID lookup, video conference rooms (follow the speaker, or a grid of everyone), an outbound dialer, MP3 and streamed hold music, Let's Encrypt certificates, AudioSocket voice bots and ARI external media, and hosting several organisations on one server. Feature codes match the usual FreePBX ones (*72, *78, *8 and so on) and can be changed. Telephony cards (DAHDI analogue ports; T1/E1 PRI and BRI; E&M, MFC-R2 and SS7) work through bitvoice-dahdi, a separate program in the Linux download. G.723.1 is converted through ffmpeg when you switch that on.

Can I host phone systems for several customers on one server?

Yes. Organisations adds one: it gets its own empty phone system, web address (/t/name/ or its own domain) and administrators, and cannot see any other. Phones register to its domain or as name.100; calls from a shared provider account reach the organisation whose numbers they are for. Each can be limited (extensions, calls at once, storage, AI use) or suspended.

Can a 911 centre use it today?

Not for live calls yet. The 911 profile is built and tested against stand-ins and NENA sample data, but it has not run on a real ESInet or been certified. We are looking for PSAPs and 911 authorities willing to run it in a lab or in shadow mode beside their current equipment.

Does the radio console work with my P25 system?

It joins talkgroups over the ISSI as a console subsystem, with AES-256, DES or triple DES encryption, private calls and alert tones. It has been tested against a real ISSI capture and stand-ins, not yet a live RFSS. Phase 2 systems work when their ISSI talkgroups carry full-rate (Phase 1) voice, which is common; native half-rate voice is not supported because its vocoder is patented until 2028. Radio-over-IP gateways connect any other radio system.

Do I need a database server?

No. One server keeps everything in a SQLite file. For several servers working as one phone system, point them at one PostgreSQL database.

Does my call data go anywhere?

No, unless you switch on a feature that sends it: an AI service you choose, a texting provider, an archive bucket, a CRM. Each is off until you set it up, and each says what it sends.

Who is behind it?

BioDream LLC, which also makes Perfuse, the open-source healthcare integration engine. Hosting and support subscriptions are available for organisations that want them.

Contributions are not accepted

BitVoice is developed and maintained by BioDream LLC, and it stays that way. Pull requests will not be reviewed or merged. This software is held to the 911 reliability bar, and that standard is easy to state and slow to enforce across contributors.

Bug reports are wanted. Open an issue with the output of bitvoice -version and what happened. The Apache licence still lets you take a copy, change it and publish the result: what is closed is the path back into this repository, not what you may do with your own copy.

Security problems: please report them privately through this repository's Security tab ("Report a vulnerability"), not in a public issue.

Building it yourself

make check build     # Go tests and the binary in bin/
make web             # rebuild the web interface (needs Node and pnpm; the built copy is committed)
make e2e             # browser tests, including WebRTC calls in Chromium

Licence

Apache License 2.0. Copyright 2026 BioDream LLC. See NOTICE.

BitVoice is not affiliated with or endorsed by Sangoma (Asterisk, FreePBX), 3CX, Cisco, Avaya, Mitel, Microsoft, NENA, TIA or any radio manufacturer. Those names are used only to describe what BitVoice works with. Project 25 standards are published by the Telecommunications Industry Association.

Keywords

Phone system: open source PBX · IP PBX · VoIP PBX · SIP server · business phone system · cloud PBX · self-hosted phone system · Asterisk alternative · FreePBX alternative · 3CX alternative · FreeSWITCH alternative · Go PBX · Golang SIP · WebRTC softphone · auto attendant · IVR · voicemail to email · call recording · ring groups · hunt groups · call parking · paging · BLF · provisioning · Yealink · Poly · Grandstream · Snom

Contact centre: ACD · call queues · wallboard · callbacks · supervisor barge · whisper · call transcripts · call summaries · CRM integration · screen pop · click to dial · call links · website calling

911: NG911 · NENA i3 · PSAP · call handling equipment · CPE · ESInet · PIDF-LO · ALI · EIDO · CAD integration · i3 logging · Kari's Law · RAY BAUM'S Act · ESRP · ECRF · LoST · LVF · BCF · NG911 core services

Radio: radio dispatch console · P25 · Project 25 · ISSI · CSSI · RoIP · radio over IP · talkgroups · IMBE · P25 encryption · AES-256 · unit to unit · alert tones · radio logging

Media and fax: Opus · G.729 · G.722 · G.711 · transcoding · SRTP · SIP TLS · T.38 · fax to email · email to fax · SMS · 10DLC · Microsoft Teams Direct Routing · SBC

Deployment: single binary · Go · Apache 2.0 · SQLite · PostgreSQL · high availability · active-active · Prometheus · OpenTelemetry · Terraform · AWS · Azure · on-premise · air-gapped

About

Open-source phone system, NG911 call handling, P25 radio dispatch console and NG911 Core Services in one Go binary. By BioDream LLC.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages