All work

AI Voice Agent · Personal Project

Not a chatbot.
Not a form.

A real phone call. Answered by AI.

Built a production AI voice receptionist that answers live phone calls, books appointments through natural conversation, and streams everything to a real-time doctor dashboard — in one session.

Live Personal ProjectApril 2026
3
Systems integrated
1
Session to ship
PSTN
Real phone network
<500ms
Voice latency
TwilioOpenAI RealtimeVue 3Node.jsFastifyWebSocketsPiniaPrimeVue

What I built

One phone number.
Three live systems
talking to each other.

Someone calls a real Twilio number. An AI answers, understands natural speech, books appointments by asking for name, pet, and preferred time — then confirms out loud.

A doctor's dashboard updates in real time: live call status, full transcript as it happens, appointments logged the moment the AI confirms them. No simulation. No mock data.

Three decisions that defined the build

Not what I built.
Why I built it that way.

Found the transport in the dist bundle

Transport

The OpenAI Agents SDK didn't export the Twilio transport at the package level. I reverse-engineered the dist bundle, found OpenAIRealtimeWebSocket in the exports, and wired bidirectional audio manually using the raw WebSocket protocol. Zero documentation. Shipped in 20 minutes.

One backend. Zero extra infrastructure.

Architecture

The doctor's dashboard needed live call state — not polling, not refresh. I built a WebSocket broadcast layer inside the same Fastify server: every call event fans out to all connected dashboard clients instantly. One process. Multiple live clients.

No library. Transcript parsing from scratch.

NLP

No NLP library. When the call ends, the system reads the full transcript for patterns — name, pet name, time — then falls back to reading the AI's own confirmation to extract what it just scheduled. If the AI confirmed it, the dashboard shows it.

The dashboard

State-driven UI —
what you see is what is live.

When a call comes in, the topbar flips to Live with a timer. Every sentence the AI or caller speaks appears in the transcript panel in real time. When the AI confirms an appointment, it appears in the list with name, pet, date, and time — before they even hang up.

Vue 3 + Pinia. PrimeVue components. Click any appointment — drawer opens with the full booking conversation that led to it.

Full stack

Backend

  • Node.js 23 + Fastify
  • Twilio Voice API + Media Streams + TwiML
  • OpenAI Realtime API (gpt-4o-realtime-preview)
  • WebSocket — bidirectional audio + dashboard sync
  • localtunnel — public webhook exposure

Frontend

  • Vue 3 + TypeScript
  • Pinia — store-driven real-time state
  • PrimeVue — Avatar, Drawer, Tag, Badge

Future upgrades

What ships next.

Supabase

persist appointments across sessions

Railway

always-on backend, no tunnel needed

Auth

doctor login + role-based views

Tool calling

structured data from OpenAI

SMS

Twilio confirmation after booking

Multi-agent

triage → specialist handoff flow

Want to hear it live?

Call the number. The AI picks up.

Twilio trial account — you'll hear a 3-second notice, then the AI takes over. Real PSTN. Real AI. Real appointments.

"I don't just consume tutorials.
I break them, fix them,
and ship something real."

Built in one session · April 7, 2026 · 3am