Providers
Butt-Dial uses a pluggable provider architecture. Every external dependency has an abstract interface, and providers are swappable via environment variables.
Provider Slots
| Slot | Interface | Default | Alternatives |
|---|---|---|---|
| Telephony | ITelephonyProvider | Twilio | Vonage |
| IEmailProvider | Resend | — | |
| IWhatsAppProvider | Twilio | — | |
| TTS | ITTSProvider | Edge TTS (free) | ElevenLabs, OpenAI |
| STT | ISTTProvider | Deepgram | — |
| Voice | IVoiceOrchestrator | ConversationRelay | — |
| Database | IDBProvider | SQLite | Turso, Convex |
| Storage | IStorageProvider | Local filesystem | S3, R2 |
Selection
Set providers via environment variables:
PROVIDER_TELEPHONY=twilio # twilio | vonage
PROVIDER_EMAIL=resend
PROVIDER_TTS=edge-tts # edge-tts | elevenlabs | openai
PROVIDER_STT=deepgram
PROVIDER_DATABASE=sqlite # sqlite | turso | convex
PROVIDER_STORAGE=local # local | s3 | r2
In demo mode (DEMO_MODE=true), all providers automatically use mock adapters.
Available Adapters
Telephony
- Twilio — Full implementation: SMS, calls, transfers, number management
- Vonage — Full implementation via Nexmo REST APIs
- Mock — Simulated responses for demo/dev
- Resend — Send + domain verification via REST
- Mock — Simulated responses
TTS (Text-to-Speech)
- Edge TTS — Free Microsoft TTS, no API key needed (default)
- ElevenLabs — Premium voices via API
- OpenAI — OpenAI TTS via /v1/audio/speech
- Mock — Returns silent WAV
STT (Speech-to-Text)
- Deepgram — HTTP POST to /v1/listen
- Mock — Returns fixed transcription
Database
- SQLite — Local file, zero setup (development default)
- Turso — libSQL HTTP pipeline
- Convex — REST-based (stub)
Storage
- Local — Filesystem + Express static route (development default)
- S3 — AWS S3 with Signature V4
- R2 — Cloudflare R2 (wraps S3 adapter)
Provider Interfaces
Core tools call interfaces, never vendor-specific code:
// ITelephonyProvider
sendSms(params: { from, to, body }): Promise<{ messageId, status, cost }>
makeCall(params: { from, to, webhookUrl }): Promise<{ callSid, status }>
transferCall(params: { callSid, to }): Promise<{ status }>
buyNumber(params: { country }): Promise<{ phoneNumber, sid }>
releaseNumber(sid: string): Promise<void>
// IEmailProvider
send(params: { from, to, subject, body }): Promise<{ messageId, status, cost }>
// ITTSProvider
synthesize(text: string, options?): Promise<{ audio: Buffer, durationMs }>
// IStorageProvider
upload(key, data, contentType): Promise<{ url, key }>
download(key): Promise<Buffer>
delete(key): Promise<void>
Alternative Providers (Not Yet Implemented)
The following providers can be added as adapters. Each implements the same interface as existing adapters.
Telephony Alternatives
| Provider | Key Advantage | Pricing |
|---|---|---|
| Telnyx | Owns its own IP network — sub-200ms latency | SMS: $0.0025/msg, Voice: pay-per-minute |
| Plivo | Developer-focused, 190+ countries | SMS: ~$0.005/msg, Voice: from $0.050/min |
| Bandwidth | Tier-1 US carrier, no middlemen | SMS: $0.004/msg, Voice: $0.0055/min |
Email Alternatives
| Provider | Key Advantage | Pricing |
|---|---|---|
| Postmark | 22% better inbox placement than SendGrid | Free: 100/mo, Paid: $15/mo for 10K |
| Amazon SES | Cheapest at scale | $0.10 per 1,000 emails |
| Mailgun | Strong deliverability analytics | From $0.80 per 1,000 emails |
WhatsApp Alternatives
| Provider | Key Advantage | Pricing |
|---|---|---|
| Meta Cloud API | Zero markup, direct from Meta | Meta's per-message rates only |
| Gupshup | Early access to WhatsApp features | Meta fees + $0.001/msg |
| Infobip | Enterprise omnichannel platform | Meta fees + Infobip markup |
TTS Alternatives
| Provider | Key Advantage | Pricing |
|---|---|---|
| Cartesia (Sonic-3) | Ultra-low latency (40-90ms) | Free: 10K credits, Pro: $5/mo |
| PlayHT | 900+ voices with voice cloning | Free: 12,500 chars/mo, Creator: $39/mo |
| Amazon Polly | 60+ languages, Neural + Standard | Free: 5M chars/mo (12mo) |
STT Alternatives
| Provider | Key Advantage | Pricing |
|---|---|---|
| AssemblyAI | Best accuracy (Universal-2) | Free: $50 credit, Then $0.15/hr |
| Speechmatics | Cloud, on-prem, or edge deployment | Free: 8 hrs/mo |
| Rev.ai | Lowest entry-level pricing | $0.002/min standard |
Database Alternatives
| Provider | Key Advantage | Pricing |
|---|---|---|
| Neon | Serverless Postgres with branching | Free: 100 projects, Paid: from $19/mo |
| Supabase | Full stack — Postgres + Auth + Storage | Free: 500MB, Pro: $25/mo |
| CockroachDB | Distributed SQL, auto-sharding | Free: $15/mo credit |
Storage Alternatives
| Provider | Key Advantage | Pricing |
|---|---|---|
| Backblaze B2 | 1/5th the cost of S3 | Free: 10GB, Storage: $0.006/GB-mo |
| DigitalOcean Spaces | Flat $5/mo, CDN included | $5/mo: 250GB + 1TB outbound |
| MinIO | Open-source self-hosted S3 | Free (AGPL v3) |
Adding a New Provider
- Create adapter file in
src/providers/(e.g.,telephony-plivo.ts) - Implement the relevant interface
- Add selection logic in
src/providers/factory.ts - Add config fields in
src/lib/config.ts - Add to
comms_register_providerenum