Burble is a self-hostable voice communications platform built for people who care about latency, privacy, and control. Think Mumble’s audio seriousness meets modern browser-based joining — no downloads, no accounts, no friction.
One command to deploy. Sub-second to join. Your server, your rules.
Burble is pre-production (self-assessed CRG grade C, targeting B). The core — self-hosted WebRTC voice, browser join, OTP fault isolation — is operational and tested. Per ADR-0007, every claim below maps to code + a test, or is flagged here:
-
Experimental (optional, off by default): QUIC transport and SNIF WASM crash-isolation require optional NIFs (
quicer/msquic,wasmex) that are disabled in the default build; the runtime degrades gracefully without them. -
Hardware-gated: sub-microsecond PTP needs a PTP-capable NIC; without one the system uses NTP (~1ms). PTP hardware is unvalidated (I210 pending).
-
Roadmap: the Idris2 ABI proofs compile and type-check; runtime enforcement is not yet wired (ADR-0008, Option C; PoC tracked in issue #55).
-
Not yet benchmarked: end-to-end mic-to-speaker latency and 500+ concurrent scale (issue #52).
-
Signalling wire format: SDP bodies ride the Bebop binary plane by default since 2026-08-04 (PR #180), on codecs generated from
server/priv/schemas/voice_signal.bop. JSON remains an explicit opt-out (config :burble, :signaling_wire_format, :json) and the automatic fallback if a Bebop encode fails; decode of both planes is always accepted, so mixed-version peers keep working, and clients still receive a plainsdpstring. The plane satisfies spline ADR-0005 criterion (a); a second consumer parses the same bytes (criterion (b), gossamer#145) and the alignment is CI-enforced in groove (criterion (c), groove#30). -
Test gate: the full server suite passes and the CI pass/fail gate is armed — a failing test turns CI red (
elixir-ci.yml"Run server tests", re-armed 2026-07-07). The green gated run onmain(Elixir CI @2b5914b) is the receipt for the current self-assessed CRG grade C (issue #100 closed; see.machine_readable/descriptiles/STATE.a2ml). The Dialyzer lane remains advisory.
Foundational hardening is tracked in the "Earn the Core" epic (issue #53).
Known debt is enumerated, with the evidence for each item, in
DEBT.md — measured 2026-08-07 across build, supply chain,
CI/CD, licence, documentation, code, proof and test. It indexes rather than
replaces PROOF-NEEDS.md,
TEST-NEEDS.md and READINESS.adoc.
Read it before trusting a green badge or a passing gate here: several of the
findings are gates that cannot fail.
| Burble | Mumble | Discord | Jitsi | |
|---|---|---|---|---|
Self-host |
Yes |
Yes |
No |
Yes |
Browser join |
Yes (WebRTC) |
No (native only) |
Browser + app |
Yes |
Latency |
<10ms* (kernel-path target) |
~15ms |
~50-100ms |
~30ms |
Privacy |
E2EE optional, no telemetry |
Encrypted, no telemetry |
Telemetry, scanning |
E2EE optional |
Precision timing |
IEEE 1588 PTP (<1µs)* |
No |
No |
No |
Embeddable |
Yes (game/app integration) |
No |
No |
Partial |
|
Note
|
Honest status (ADR-0007):
|
Audio kernels — Zig remains the estate-policy implementation language. Historical direct-NIF microbenchmarks are retained below as provenance only; the direct loader has been retired. Production acceleration now requires proved ReleaseSafe WASM guests through SNIF, which are not yet shipped. The live call path forwards opaque Opus and does not currently traverse these kernels.
Precision Time Protocol — IEEE 1588 PTP clock source detection with graceful fallback (PTP hardware → phc2sys → NTP → system). Sub-microsecond accuracy when a PTP hardware clock is available; ~1ms via NTP on typical deployments. Jitter measurement, telemetry, and multi-node alignment data export built in. Direct in-VM device access is forbidden; a PTP hardware path requires an isolated OS service and real-hardware validation.
Four topology modes — From single-server (monarchic) to fully distributed
mesh (serverless with mandatory E2EE). Set BURBLE_TOPOLOGY and go.
Erlang/OTP backbone — Supervision trees, hot code upgrades, fault isolation. If a room crashes, everything else keeps running. That’s not marketing — that’s OTP.
Bridge interop (experimental) — a Mumble/Murmur relay module exists but is not yet started by the supervision tree or validated against a real Murmur server. Jitsi and Matrix bridges are roadmap items, not code.
Embeddable client library — Drop Burble voice into your game, workspace, or app. Used in IDApTIK (asymmetric co-op game) and PanLL (panel workspace).
git clone --recurse-submodules https://github.com/hyperpolymath/burble && cd burble
just deploy # builds selur-compose if needed (~3 min first run), then brings up the stack
# Server: http://localhost:4000
# Web client: http://localhost:8080
# VeriSimDB: http://localhost:8081just deploy uses selur-compose — the TOML-native
Rust compose driver developed in-tree. No Python, no Docker Compose, no
podman-compose.
To stop the stack:
just down|
Note
|
--recurse-submodules is required. VeriSimDB is integrated as a
submodule under tools/nextgen-databases (paralleling tools/affinescript)
because Burble’s anti-purpose forbids vendoring it in-tree. If you already
cloned without it, run git submodule update --init --recursive — or just
run ./setup.sh, which now does that automatically.
|
|
Note
|
Building from source requires system packages for the quicer/msquic QUIC
transport library (cmake, perl, build tools, OpenSSL headers). See
CONTRIBUTING.md
for the full package list and per-distro install commands.
|
# Prerequisites: Elixir 1.17+, Zig 0.15+, Bun
# (plus system packages — see CONTRIBUTING.md)
# Test Zig kernel sources in the estate-required safety mode
cd ffi/zig && zig build test -Doptimize=ReleaseSafe
# Start server
cd server && mix deps.get && mix phx.server
# Start web client (separate terminal)
cd client/web && bun run devThe table below is historical direct-NIF benchmark provenance, not a current production claim. The direct NIF has been retired; equivalent measurements must be reproduced against proved SNIF guests before acceleration is described as available. The live SFU path forwards opaque Opus RTP and does not execute these kernels. End-to-end latency remains unbenchmarked (ADR-0007; issue #52).
| Operation | Elixir | Retired direct-NIF result | Historical speedup |
|---|---|---|---|
LZ4 compress |
83ms |
3.1us |
26,350x |
Echo cancel |
19.4ms |
310us |
62x |
FFT (256pt) |
826us |
22us |
37x |
Convolution |
300us |
11us |
27x |
Neural denoise |
54us |
9us |
6x |
If you’re curious about the tech behind these claims — how we hit 26,350x, what PTP actually does, why OTP gives us fault isolation — see EXPLAINME.adoc for the receipts.
-
Documentation Index — one-page map of every doc under
docs/and at the repo root. Start here if you don’t know where to look. -
Show Me The Receipts — feature highlights with code paths and honest caveats
-
Architecture — control plane, media plane, topology modes, supervision tree
-
Threat Model — security analysis and mitigations
-
ABI/FFI Design — Idris2 proofs + Zig implementation
-
Accessibility — accessibility features, compliance, and roadmap
-
Decision records (ADRs) — numbered, append-only design decisions
-
Wiki — landing + signposts (source in
docs/wikis/)
Open an issue on GitHub or reach out directly — happy to explain anything in more detail.
SPDX-License-Identifier: CC-BY-SA-4.0
Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
See LICENSE for full text.