Tour the live demo
Thirty real, anonymised calls you can open right now — the fastest way to understand what VaaniEval measures before you install anything.
demo.vaanieval.com is a frozen, read-only snapshot of 30 real voice-agent calls from August 2026. The audio, transcripts, timings and traces are genuine captures, anonymised. Nothing you click changes anything.
It is the fastest way to decide whether VaaniEval measures what you care about.
The demo is a hosted build with a fleet dashboard and alerts on top of the
open-source call console. A self-hosted dashboard from
vaanieval-observer-backend
gives you the call console and the STT evaluation workspace; fleet rollups and
alert rules are part of the hosted product.
VaaniEval is in closed beta
The repositories below are private while the product is in closed beta, so the links will 404 unless your GitHub account has been granted access. Neither SDK is published to a public package registry yet — both install from Git.
To get access, email shubham@vaanieval.com or book a call.
Start with one call
The call view is the heart of the product: everything else is a way of finding which call to open.

Four things to look at, in order:
The header strip
TURNS, LENGTH, TYPICAL WAIT, WORST WAIT, SLOWEST, FAILURES, TOOLS,
PROVIDERS. "Typical wait" and "worst wait" are the caller's experience — the
gap between the caller finishing and the agent starting to speak — not a
service's response time.
The waveform
Agent audio and caller audio on one timeline, with turn markers and the long
silences annotated (7.74s · the model, 24.2s · the model). The annotation
names the stage that owned the silence, so you can see at a glance whether the
caller was waiting on transcription, the model, or speech synthesis.
The transcript
Follows playback and is tagged by turn. Turn #1 in the demo call is annotated "played 2.63s of speech with no model call — a scripted opening line, so its words are not in the capture." That is the product refusing to invent a number it does not have, which is a pattern you will see everywhere.
The trace
Each turn summarised as listening · thinking · speaking, with a status. Two
of the four turns in this call are error.
Expand a turn
This is where the real answer usually is.

Two details in that screenshot are worth the whole tour:
-
Milestones, not just durations. An STT span records caller starts speaking → first partial transcript → caller stops speaking → provider marks speech final → final transcript → end of utterance. That is enough to separate "the recognizer was slow to produce text" from "the recognizer was slow to decide the caller had finished" — two different problems with two different fixes.
-
The framework span versus the HTTP attempts. Turn 3's LLM operation reports 19.9 s and carries the note "2 HTTP attempts served this one model call, 1 of which failed and was retried. The framework span above times the whole sequence, which is why its duration covers every attempt." A request-level APM would have shown you two requests of 10.7 s and 8.9 s and no reason the caller waited 24 seconds.
There is also a cancelled LLM attempt annotated: "stopped before it finished
and no caller speech overlaps it, so this is not barge-in." An operation that
stopped because something cancelled it is not automatically a fault — a TTS span
aborted by barge-in is the agent behaving correctly — so the product
distinguishes the two rather than counting both as failures.
Find the call worth opening
The Dashboard tab rolls the same measurements across a time range, agent, provider, model, SDK, environment and version.

Note what the KPI cards do when the sample is thin: "still a small sample", "not enough history to compare", "68% of 111 turns measurable". The denominator is always published, because a p95 over 75 measured turns is a very different claim from a p95 over 75,000.
Calls needing attention ranks in three classes — failed (the caller heard an error), unverifiable (capture is incomplete, so we cannot say what they heard) and slow — then by magnitude within each class. Opening a row lands on the turn that caused the flag, not the top of the call.
Get told without looking
The Alerts tab evaluates rules against the same calls the dashboard reports on.

Each rule shows its scope (3 of 4 agents, 1 no reading), the reading against its threshold, and the destination. The no reading count matters: a rule that cannot evaluate on an agent says so rather than quietly reporting healthy.
In the demo, nothing is ever delivered — rules you add stay in your browser.
Review the transcription
The STT review tab on a call shows streaming timing and transcripts captured from production.

Two conventions to internalise:
—means unavailable, and it always carries a reason. In the screenshotENDPOINTINGis— unavailable. It is never rendered as0, and never inferred from an operation's start and end times or from a batch HTTP round trip.- Accuracy only appears after a challenger comparison. The banner says so explicitly: "Streaming timing and transcripts. Accuracy appears after a challenger comparison." Until you replay the call against a challenger model, there is nothing to compare the production transcript to.
Running a comparison produces an estimated WER, per-word substitutions, deletions and insertions, and a judge pass that flags only the disagreements that could have changed the conversation. See STT evaluation and Metrics.
The challenger is a pseudo-reference, not ground truth. The score is labelled estimated WER / model disagreement, never accuracy, until a human-reviewed reference transcript exists.
Next
Record your own call (Python)
Ten minutes to the same view, running against your traffic.
Record your own call (Node.js)
Same, with automatic fetch instrumentation.
Metrics glossary
Exactly what each number means and when it is reported as unavailable.
Book a 20-minute walkthrough
See it running against your own traffic.