Skip to content
tuvoz

Open source

Open source: run the Tuvoz bridge yourself

The part of Tuvoz that actually talks on the phone is open source under the MIT license: github.com/tuvoz-ai/bridge. The hosted service at tuvoz.io runs the same code as a pinned library. You can read exactly what it does on a call, and you can run it yourself with your own Twilio and Gemini accounts.

What’s in the bridge

  • The media plane: Twilio Media Streams to and from the Gemini Live voice model, with audio conversion, reconnects and timeouts.
  • The honest call flow: the scripted opener (AI assistant, whose assistant, through which service, about what), the recording question, opt-out by voice or by pressing 9, and a transcript monitor that ends the call if the AI claims to be human or someone else.
  • The backchannel: the voice agent asks your agent questions mid-call; your agent answers, sends instructions, or has the bridge call you.
  • Deterministic safety rules: US numbers only, hard blocks on emergency, crisis and premium numbers, and the 9 AM to 8 PM calling window for every number except your own phone.
  • A single-tenant server, tuvoz-bridge serve, with the same /v1 call API as hosted Tuvoz, so the same skill and command-line tool work against both.
  • Provider seams for telephony, voice, storage, policy, billing, auth and the person to call back, with simple defaults (SQLite, an allowlist, one principal from your .env).

Run it

git clone https://github.com/tuvoz-ai/bridge && cd bridge
# In .env: TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM_NUMBER, CALLBACK_NUMBER,
# GEMINI_API_KEY, OPERATOR_NAME, PRINCIPAL_NAME, PUBLIC_BASE_URL, BRIDGE_TOKEN, ALLOWLIST
uv run tuvoz-bridge serve --env-file .env

Then point the skill at your server:

export TUVOZ_API_URL=https://your-bridge.example.com
export TUVOZ_API_KEY=<your BRIDGE_TOKEN>

The server refuses to start if a required setting is missing. By default it only calls the numbers in ALLOWLIST (and PRINCIPAL_PHONE if you set one), so a misconfigured server can’t call strangers. Docker and Fly recipes are in the repository.

Self-host or hosted?

Self-hosted bridge Hosted Tuvoz
Who it’s for Developers calling their own numbers, or building their own product Anyone with Claude Code, Codex, claude.ai, Meta Muse or OpenClaw
Accounts you need Twilio, a paid Gemini API key, a server A Google account and a mobile number
Who can be called Numbers on your allowlist Listed businesses, your own phone, and people you confirm agreed to AI calls
Sign-in and keys One static token you set Google sign-in from your agent, no keys to paste
Money You pay Twilio and Google directly $0.12 a minute, billed per second, with a 30-second minimum per answered call leg, including calls to your own phone
Recording question “Records this call” by default; add the training clause only if you really train on calls Always includes the training clause
The name on the call Your OPERATOR_NAME Tuvoz
Opt-outs, caps, approvals, dashboards Basic opt-out list in SQLite Shared opt-out list, abuse limits, approvals, call history, billing

The name on the call

On a self-hosted bridge the opener names your operator, set with OPERATOR_NAME: “I’m Jane’s AI assistant, calling through your operator name about…”. The bridge refuses an operator name that contains “Tuvoz”, because a call from your server isn’t a call from Tuvoz, and Tuvoz is a trademark of the company behind tuvoz.io. The MIT license covers the code, not the name.

What isn’t open source

The multi-tenant service around the bridge is closed: accounts and billing, the abuse limits and their thresholds, the checks that refuse sales, political, fundraising and debt collection calls and card numbers or codes in briefs, phone verification, the dashboards and this website. A self-hosted bridge doesn’t run those checks; you decide what it calls about. Nothing in the bridge depends on them; the bridge’s tests run on their own.

Contributing

Issues and pull requests are welcome at github.com/tuvoz-ai/bridge. Changes that remove or weaken the disclosure, the recording question or the opt-out won’t be accepted, and there is no impersonation mode to add.