An open, self-hosted business phone system (a 3CX replacement for a single small business, ≤25 phones). It uses Asterisk 22 as a thin SIP/media engine and puts a full Node/TypeScript control plane on top of it over ARI: desk phones and browser softphones register to it, calls route however you configure them, voicemail and calls are transcribed and summarized by Claude, and an optional real-time AI receptionist answers and routes calls by voice. Bring your own SIP trunk (Telnyx-first); phones auto-provision (Fanvil-first, plus Yealink/Grandstream).
Stack: Asterisk 22 (PJSIP, from source) · Next.js 16 + Server Actions · Prisma 7 / PostgreSQL · Node ARI + AMI daemons · Claude (async + real-time), with offline mocks so tests spend nothing.
- Admin console and an in-browser WebRTC softphone user portal (hold / blind-transfer / DND).
- Full call routing: extensions, trunks, DIDs, inbound/outbound routes, ring groups, IVR/auto-attendant, business hours, voicemail-to-email.
- Call center: queues/ACD with a live wallboard, agent login/pause, conferencing, call parking.
- AI: call recording → transcript + summary; a live AI receptionist (VAD → STT → Claude → TTS, barge-in).
- Multi-vendor phone auto-provisioning with remote reboot/re-provision.
- Production-ready: systemd supervision, nightly backups, health alerts, login lockout, E911 (Kari's Law), fail2ban, toll-fraud guardrails, at-rest secret encryption + rotation.
| Doc | For |
|---|---|
| USER-GUIDE.md | Plain-language guide for admins and staff — how to use every screen. |
| INSTALL.md | One-command install (Path 0), or by hand on a cloud server / local Debian VM. |
| TRUNK-SETUP.md | Connect a real phone-line (PSTN) provider. |
| HARDENING.md | Production security / go-live checklist. |
| CODEMAP.md | Source-of-truth code navigation (every screen, process, and module). |
| BUILD-PLAN.md | Architecture and design rationale. |
brew install lima socket_vmnet
createdb pbx
cp .env.example .env
limactl start asterisk/lima/pbx.yaml # builds Asterisk 22 in a Debian VM
npm install && npm run setup # migrate + seed + apply asterisk SQL
npm run dev # web console + portal → http://localhost:3001
npm run ari # call-control daemon (exactly one)
npm run worker # async-AI jobs (exactly one)Full steps (and a cloud-server install) are in INSTALL.md.
Starter login: admin@pbx.local / password123 (change before real use).
On a fresh Debian 13 host (VM, cloud instance, or bare metal), this installs and hardens the whole stack (Node, PostgreSQL, Asterisk 22, the control plane, secrets, firewall + fail2ban) unattended:
curl -fsSL https://raw.githubusercontent.com/ExJtac/peal/main/install.sh \
| sudo REPO_URL=https://github.com/ExJtac/peal.git bashIt prints the console URL + one-time admin password when done. Details: INSTALL.md → Path 0.
Single-tenant, local-first. Secrets live in a gitignored
.env; runnpm run check:secretsbefore exposing an install. Emergency (911) calling is native in the dialplan and never depends on the app.
Peal is free, open-source software licensed under the GNU Affero General Public License v3.0
(AGPL-3.0-or-later). You may run, study, modify, and self-host it freely. Under the AGPL, if you
distribute a modified version or offer it to others over a network as a service, you must release
your source changes under the same license — which keeps Peal, and everything built on it, free for
everyone.
Copyright © 2026 ExJtac. Paid installation and support are offered separately; the software itself is, and stays, free.