Bring the calls you already have.
Point Hotato at a call from the stack you already run. Five voice stacks capture into one scorer that reads turn-taking timing offline. Two of them can also place a live test call for you — behind a double gate, because it dials a billed line.
- 5stacks
- 3auto-pull
- 2drive · gated
- 0600local creds
One scorer, five ways in.
Every stack lands the same two-channel WAV in front of the same scorer. How the audio arrives is the only thing that changes.
Vapi
Downloads the call's stereo recording by call id — caller and assistant already on separate channels — and scores it offline.
- capture
- drive · gated
Twilio
Fetches the dual-channel media by Recording SID once the call was recorded RecordingChannels=dual.
- capture
- drive · gated
Retell
Downloads a call's multi-channel recording by explicit call id, preferring the PII-scrubbed track.
- capture
- capture-only
LiveKit
Your deployment writes two tracks; Hotato scores the WAV locally. No recording leaves your environment.
- capture
- capture-only
Pipecat
A drop-in 2-channel recorder writes the session; Hotato scores the local file. Nothing calls out.
- capture
- capture-only
What each stack can do.
All five capture a recorded call. Placing a live call is Vapi and Twilio only, and only behind credentials and an explicit opt-in.
| Stack | Capture a call | How Hotato gets the audio | Drive a live call |
|---|---|---|---|
| Vapi | Yes | Auto-pull with your API key, by call id | Gated |
| Twilio | Yes | Auto-pull with your API key, by Recording SID | Gated |
| Retell | Yes | Auto-pull with your API key, explicit call id only | Capture-only |
| LiveKit | Yes | Capture in your infra, score the local WAV | Capture-only |
| Pipecat | Yes | Capture in your infra, score the local WAV | Capture-only |
Gated means gatedDrive-a-call dials nothing without both your provider credentials and HOTATO_DRIVE_OPT_IN=1. Every run bills a live phone call, so it is opt-in twice over. Retell, LiveKit and Pipecat expose no origination Hotato trusts, so they stay capture-only — Hotato never places those calls.
$ hotato sweep --demo$ hotato connect vapisweep --demo pulls a bundled call, scores it, and writes one HTML dashboard — no account, no keys, no network. Swap vapi for twilio or retell to connect a hosted stack.
See the dashboard before you wire anything.
The demo runs the whole connect → pull → analyze path on a recording that ships with Hotato, so you can read the scorecard before a single credential leaves your machine.
hotato connect <stack> stores that stack's key once at file mode 0600 in ~/.hotato/connections.json. It is sent only to the vendor's own API on a capture — never to Hotato. Scoring itself stays offline.
Timing, from separated channels.
Every adapter's job is the same: keep the two parties on separate channels all the way to the WAV, so an overlap has an owner.
- did_yield
- seconds_to_yield
- talk_over_sec
ScopeHotato reads turn-taking timing from speech energy over time. It does not do speaker identification, diarization scoring, transcription grading, emotion or intent. Energy is not intent. A mono mix cannot attribute talk-over to caller or agent, so Hotato scores it only behind an explicit --allow-mono and labels the result indicative only.