Automate Your Call Center – Open-Source Run on Cloudflare Infra Mainbrella released an open-source voice agent system for call-center reception, with frontend and backend under GPLv3, that runs on Cloudflare's Workers Paid plan starting at $5 a month plus additional AI inference and telephone costs. The agent uses Deepgram Flux for transcription, Llama 3.3 70B for reply generation, and Deepgram Aura-1 for speech synthesis via Workers AI, with Twilio as the external phone carrier and call transcripts stored in Cloudflare D1. Outbound calls, live transfers, appointment booking, and CRM updates are not implemented yet. ← Engineering blog https://mainbrella.com/blog/ Automate Your Call Center - Open Source run on Cloudflare Infra Suppose someone calls your bike shop to ask whether you're open on Saturday. A receptionist can answer from your hours, explain which repairs you handle, and take a name and callback number when the question needs a mechanic. You should be able to run that conversation on infrastructure you already pay for. Mainbrella now includes an end-to-end voice agent system. The frontend https://github.com/mainbrella/web and backend https://github.com/mainbrella/backend are available under GPLv3 https://github.com/mainbrella/backend/blob/main/LICENSE , free to download and run. You can host your own copy on Cloudflare's Workers Paid plan, starting at $5 a month https://developers.cloudflare.com/workers/platform/pricing/ , instead of buying a managed voice platform such as Bland. That $5 is the base plan. AI inference, telephone service, and usage beyond included allowances are additional. The current agent handles reception: questions about your business and messages you can read afterward. It has browser voice and text tests, inbound phone support, and saved transcripts. Outbound calls, live transfers, appointment booking, and CRM updates aren't implemented yet. If those are the job, there's more to build. Give it the facts it can answer from In Voice https://mainbrella.com/voice/ , you set the business name, the receptionist's name, its greeting, its instructions, and a voice. For our example shop, the instructions would contain Saturday's hours, the kinds of bikes it services, and what information to collect for a callback. The screenshot below shows the actual application running locally with sample shop settings. You can test the saved settings with a microphone or type a conversation before connecting a phone number. Each call keeps the settings it started with, so editing Saturday's hours during a call doesn't replace that caller's instructions halfway through the conversation. The system prompt https://github.com/mainbrella/backend/blob/fc4b546e55c73573a1135b96baf2869442b01749/worker/lib/voice.ts tells the receptionist to use the supplied business facts, admit when information is missing, and offer to take a message. It also explicitly says it cannot book appointments, send messages, update a CRM, or transfer a call. A model saying “you're booked” isn't a booking. Until there's a scheduling integration that can do the work and report the result, the agent shouldn't pretend otherwise. From a ringing phone to a spoken answer A browser call goes over a WebSocket to a Durable Object created for that call https://github.com/mainbrella/backend/blob/fc4b546e55c73573a1135b96baf2869442b01749/worker/durable-objects/receptionist-call.ts . That's Cloudflare's application runtime with its own identity and persistent state. Each caller gets a separate conversation history. The shop's receptionist is shared configuration; the conversation belongs to the individual call. Inside that conversation, Deepgram Flux transcribes incoming speech, Llama 3.3 70B generates the reply, and Deepgram Aura-1 turns the reply into audio. The call agent invokes all three through Workers AI; the arrows below follow the data through that sequence. You don't need to rent a GPU or run a separate speech server. Twilio remains the external phone carrier. The phone route has an extra, decidedly unglamorous job. Twilio sends 8 kHz μ-law audio; the voice pipeline uses 16 kHz PCM. Our phone bridge https://github.com/mainbrella/backend/blob/fc4b546e55c73573a1135b96baf2869442b01749/worker/app/voice-twilio.ts converts between them in both directions. It also forwards a playback interruption as a Twilio clear message, so buffered speech can stop when the caller interrupts. A nice LLM response doesn't help much if the phone keeps playing the previous one. Call transcripts go to D1, Cloudflare's SQL database, along with the call's status and timing. We don't save raw audio recordings. The temporary per-call state is scheduled for cleanup after the call ends, while the D1 transcript stays in account history. There's no transcript deletion control yet, so a private deployment needs its own retention policy. The defaults allow three active calls per account and 100 starts in a rolling day, with a 15-minute or 60-turn limit per call. Those are application limits in the source. Raising a number is easy; qualifying the resulting workload is another job. The automated voice tests use simulated model responses and phone media, so they don't establish live call quality, latency, or large-scale capacity. What the $5 plan buys With your own deployment, Cloudflare runs the application and inference, your carrier connects phone calls, and you operate the service. Mainbrella doesn't charge a software license fee for that copy. These are the published Cloudflare rates on October 15, 2026, before free allocations. Inference rates come from Workers AI's pricing table https://developers.cloudflare.com/workers-ai/platform/pricing/ ; the base subscription comes from Workers pricing https://developers.cloudflare.com/workers/platform/pricing/ . | Item | Published rate | |---|---| | Workers Paid base plan | $5/month minimum, with included usage | | Flux speech recognition | $0.0077 per audio minute | | Llama 3.3 70B input | $0.293 per million tokens | | Llama 3.3 70B output | $2.253 per million tokens | | Aura-1 speech generation | $0.015 per 1,000 input characters | For example, 1,000 minutes of audio sent to Flux is $7.70 at its listed rate, before allowances. That's just transcription. The assistant's replies add speech-generation charges, and each model turn includes conversation context in its input. Phone numbers and carrier minutes add their own charges. Durable Object duration and requests https://developers.cloudflare.com/durable-objects/platform/pricing/ , database activity, storage, and any other enabled Mainbrella services also count toward your infrastructure bill. Bland's current pricing page https://www.bland.ai/pricing lists its Start plan at $0.14 per minute with no platform fee, and Build at $299 a month plus $0.12 per minute. It says those rates include the language model, transcription, and speech generation, with telephony billed separately. A $5 base subscription and an inclusive AI-minute rate measure different things; there's no honest savings percentage without a workload. Self-hosting lets you pay the component costs directly and choose how much operating work to take on. Running your own copy Start with the backend's receptionist setup https://github.com/mainbrella/backend ai-receptionist and the web repository https://github.com/mainbrella/web . These are the same application repositories we work in, with account, authentication, and billing code alongside voice. Setting up a private deployment takes configuration; the production Wrangler files contain our domains, bindings, and resource IDs. 1. Provision your own Cloudflare resources and apply the backend migrations. Voice uses the AI binding, D1, and the SQLite-backed RECEPTIONIST CALL Durable Object. Keep the account and wallet bindings required by your checkout. 2. Configure authentication, trusted origins, and the frontend's VITE API URL for your deployment. The current voice code checks the prepaid wallet before starting calls, so configure funding in your instance or adapt that policy for private use. 3. Set VOICE ENABLED=true and VOICE PUBLIC ORIGIN to your public HTTPS API origin. Save a receptionist and test it in the browser. 4. For phone calls, provision a Twilio number, set its account and number configuration, store TWILIO AUTH TOKEN as a secret, and map TWILIO AGENT ID to your saved receptionist. Configure the carrier rate required by voice billing. Point the number's incoming-call webhook at the URL shown in Voice, using HTTP POST. The current phone configuration maps one number to one agent; it doesn't buy numbers for you. Incoming webhooks and media connections are checked against Twilio signatures, and the media connection also needs a short-lived token that can be used once. Keep those checks when adapting the code. Your public phone endpoint can start paid inference. The work you're choosing to do yourself Bland's call-center page https://www.bland.ai/automate-your-call-center makes its offer pretty clear: “We Build, Deploy & Manage Everything For You.” It advertises a deployment team, integrations with existing enterprise systems, and ongoing operation. It also advertises self-hosting. Owning the deployment alone isn't the difference here; Mainbrella gives you GPLv3 application source you can inspect and change yourself. If you need a vendor to implement a complex call flow, maintain your CRM integration, and answer when something breaks, that work can be worth paying for. Mainbrella's current receptionist doesn't provide Bland's broader contact-center feature set or its enterprise assurances. The software is open source; Cloudflare's hosting and the speech models it serves have their own terms. For the bike shop's hours and callback intake, I'd start with the smaller job. Put the business facts in the receptionist, test the questions customers actually ask, and read the messages it collects. You can run that system in your own $5/month Cloudflare plan, pay for the usage it generates, and change the code when the shop needs more. Buying a voice platform is now a choice about who does that work.