A password-gated ElevenLabs Conversational AI agent, grounded only in my real resume, project history, and a red-teamed corpus. Ten minutes, real voice, zero tolerance for fabrication.
For the past couple of years, AI and LLMs have been pigeon-holed into chatboxes, and that's not how humans were meant to communicate. Voice is the natural next step — it removes the friction that's held so many people back from actually talking to a computer instead of typing at one.
So instead of just saying that, I built the proof: a live agent visitors can actually talk to, grounded strictly in a corpus I control, that fails safe instead of bluffing when it doesn't know something.
Grounded in what's real, honest about what isn't.
Every claim the agent makes has to trace to an uploaded document. If retrieval turns up nothing, it says so on the record, rather than smoothing over the gap. A fabricated personal claim here isn't a bug — it's the one failure mode this entire build exists to prevent.
A session flows left to right. Solid stages run in my own Next.js code. Dashed stages hand off entirely to ElevenLabs' infrastructure.
The WebSocket handshake looked identical whether the call worked or not — DevTools showed a clean 101 Switching Protocols and a real conversation ID either way. The actual bug wasn't the network at all: Next.js's dev-mode Fast Refresh was remounting the component that owned the connection mid-handshake, orphaning it from the hook now on screen. Confirmed by running a production build, which has no Fast Refresh — it connected cleanly on the first try.
The agent refuses to answer from general knowledge, full stop — if retrieval returns nothing, it says so. That rule got tested directly: a red-team pass against a fixed question set, run before anything shipped, hunting specifically for the one failure mode that matters here, a confident, fabricated answer.
Passwords carry a resumable, server-tracked ten-minute budget instead of a one-shot burn, synced via sendBeaconon tab close because a plain fetch has no delivery guarantee once a page starts unloading. A client-side silence watchdog ends an idle call automatically — ElevenLabs' own dashboard has no per-session override for that, so the guarantee had to live in the client.
Rate-limited myself mid-debug: the same guard that stops password guessing also counts every retry while diagnosing a connection bug. Fixed by restarting the dev process, which clears the in-memory counter instantly.
There's a second, unrelated public Siri Rama — a dancer with a PhD in Fine Arts. The corpus explicitly warns the agent off any pretrained knowledge about that name, so it never answers as the wrong person.
Signed URLs are short-lived by design, so they're minted the moment a visitor taps “begin,” not at page load or password entry.
Highlighted: a slow heartbeat landing after a newer one can't undo real usage — the budget can only ever go down.