Providers

Butt-Dial uses a pluggable provider architecture. Every external dependency has an abstract interface, and providers are swappable via environment variables.

Provider Slots

SlotInterfaceDefaultAlternatives
TelephonyITelephonyProviderTwilioVonage
EmailIEmailProviderResend
WhatsAppIWhatsAppProviderTwilio
TTSITTSProviderEdge TTS (free)ElevenLabs, OpenAI
STTISTTProviderDeepgram
VoiceIVoiceOrchestratorConversationRelay
DatabaseIDBProviderSQLiteTurso, Convex
StorageIStorageProviderLocal filesystemS3, 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

Email

TTS (Text-to-Speech)

STT (Speech-to-Text)

Database

Storage

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

ProviderKey AdvantagePricing
TelnyxOwns its own IP network — sub-200ms latencySMS: $0.0025/msg, Voice: pay-per-minute
PlivoDeveloper-focused, 190+ countriesSMS: ~$0.005/msg, Voice: from $0.050/min
BandwidthTier-1 US carrier, no middlemenSMS: $0.004/msg, Voice: $0.0055/min

Email Alternatives

ProviderKey AdvantagePricing
Postmark22% better inbox placement than SendGridFree: 100/mo, Paid: $15/mo for 10K
Amazon SESCheapest at scale$0.10 per 1,000 emails
MailgunStrong deliverability analyticsFrom $0.80 per 1,000 emails

WhatsApp Alternatives

ProviderKey AdvantagePricing
Meta Cloud APIZero markup, direct from MetaMeta's per-message rates only
GupshupEarly access to WhatsApp featuresMeta fees + $0.001/msg
InfobipEnterprise omnichannel platformMeta fees + Infobip markup

TTS Alternatives

ProviderKey AdvantagePricing
Cartesia (Sonic-3)Ultra-low latency (40-90ms)Free: 10K credits, Pro: $5/mo
PlayHT900+ voices with voice cloningFree: 12,500 chars/mo, Creator: $39/mo
Amazon Polly60+ languages, Neural + StandardFree: 5M chars/mo (12mo)

STT Alternatives

ProviderKey AdvantagePricing
AssemblyAIBest accuracy (Universal-2)Free: $50 credit, Then $0.15/hr
SpeechmaticsCloud, on-prem, or edge deploymentFree: 8 hrs/mo
Rev.aiLowest entry-level pricing$0.002/min standard

Database Alternatives

ProviderKey AdvantagePricing
NeonServerless Postgres with branchingFree: 100 projects, Paid: from $19/mo
SupabaseFull stack — Postgres + Auth + StorageFree: 500MB, Pro: $25/mo
CockroachDBDistributed SQL, auto-shardingFree: $15/mo credit

Storage Alternatives

ProviderKey AdvantagePricing
Backblaze B21/5th the cost of S3Free: 10GB, Storage: $0.006/GB-mo
DigitalOcean SpacesFlat $5/mo, CDN included$5/mo: 250GB + 1TB outbound
MinIOOpen-source self-hosted S3Free (AGPL v3)

Adding a New Provider

  1. Create adapter file in src/providers/ (e.g., telephony-plivo.ts)
  2. Implement the relevant interface
  3. Add selection logic in src/providers/factory.ts
  4. Add config fields in src/lib/config.ts
  5. Add to comms_register_provider enum
← Home