Outbound autodialer that imports a CSV contact list and automatically places calls via FreeSWITCH, respecting a configurable simultaneous-call (concurrency) limit, with a real-time web dashboard — now grown into a full telephony platform with a FreePBX-style admin panel, a visual call-flow builder, live diagnostics and reports.
This app ships with NO authentication and includes remote-admin tools (an in-app Terminal, Database console, and File editor) under the Diagnostics section. On a public IP with no login, that is effectively an open root shell. Do not expose it to the internet as-is. Bind it to
127.0.0.1and reach it over an SSH tunnel, or put it behind a VPN / authenticating reverse proxy, and add real login before any public deployment. You are responsible for securing your deployment, your SIP-trunk credentials, and for legal compliance (consent, DNC/opt-out, calling-hour and robocall regulations) in your jurisdiction. Provided "as is", without warranty — see LICENSE.
Scope note: started as an MVP dialer; the delivered product now goes well beyond that original brief (see Features below). Still no login/auth by design — add it before exposing the panel on a public server.
Dialer (original MVP)
- CSV contact import, campaign management, concurrency cap (1–100, strictly enforced)
- 3 post-answer scenarios: audio playback / transfer to agent / custom FreeSWITCH context
- Real-time dashboard (live per-campaign stats, progress, CPS) over WebSocket
- Start / pause / resume / stop campaign controls
- Campaign scheduling (once / daily / weekly, via Celery Beat)
- DNC / opt-out suppression list (import-time + dial-time enforcement)
PBX admin panel (FreePBX-style, 12 modules)
- SIP trunks, extensions, ring groups, IVR menus, visual call-flow builder, queues (mod_callcenter), conferences, inbound routes, time conditions, voicemail, music-on-hold, and a raw dialplan editor — each generates FreeSWITCH XML + reloads over ESL
Diagnostics — live calls (active channels), extension registration status, config-file viewer, and a debug console (read-only allowlisted commands, SIP-trace & log-level toggles)
Reports — call logs (filter + CSV export), campaign summary, daily volume, dispositions
Docs in-app — technical-stack reference and a searchable knowledge base
| Layer | Tech |
|---|---|
| API | Python 3.11 + FastAPI |
| Task queue | Celery |
| Broker | RabbitMQ |
| Telephony | FreeSWITCH + Event Socket (ESL) |
| Database | PostgreSQL |
| Real-time | Redis (live counters) + WebSocket/poll |
| Frontend | Single-page HTML + vanilla JS (light) |
| Infra | Docker Compose |
┌─────────────┐ enqueue ┌──────────────┐
Browser ──▶│ FastAPI │ ─────────────────▶ │ RabbitMQ │
▲ │ (API + UI) │ └──────┬───────┘
│ poll/ws└──────┬──────┘ │ tasks
│ │ read/write ▼
│ ┌──────▼──────┐ ┌──────────────┐
└────────│ Postgres │◀───────────────────│ Celery │
│ + Redis │ update status │ workers │
└──────▲──────┘ └──────┬───────┘
│ events │ originate (ESL)
┌──────┴───────────┐ ▼
│ ESL event │◀──────────────┌──────────────┐
│ listener service │ CHANNEL_* │ FreeSWITCH │──▶ SIP trunk ──▶ PSTN
└──────────────────┘ └──────────────┘
- FastAPI — campaigns, CSV import, audio upload, dashboard API.
- Celery + RabbitMQ — orchestration: split campaign → originate calls → retries.
- ESL listener — one long-lived process subscribed to FreeSWITCH CHANNEL events; it updates call state and triggers the next call when a slot frees up (concurrency).
- Redis — live per-campaign counters (active calls, CPS) for the dashboard.
See references/architecture.md for the full design.
cd app
cp .env.example .env
docker compose up -d postgres rabbitmq redis
docker compose up -d api worker
# open http://localhost:8000To place real calls you also need FreeSWITCH running and a SIP trunk configured —
see references/deployment.md.
references/architecture.md— system design, data flow, concurrency modelreferences/implementation.md— how each piece is builtreferences/deployment.md— VPS + FreeSWITCH + SIP trunk setup
- A Linux VPS (sized for the target concurrency — see deployment docs)
- A SIP trunk that allows the required concurrent channels + outbound CPS
- DID / caller-ID numbers
- WAV audio recordings
- Legal/compliance sign-off (consent, DNC/opt-out, calling hours) — see deployment docs
✅ Code-complete and validated locally, including end-to-end telephony against a
real FreeSWITCH (loopback, no trunk): originate → real CHANNEL events → call logs →
concurrency held. The one remaining step is a live SIP-trunk test on a VPS (needs
client-provided VPS + trunk). See the build checklist in
references/implementation.md.
Built by Chandra Prakash — cpchander.com.
Released under the MIT License — free to download, use, modify, and distribute, for any purpose. Provided "as is", without warranty.