All work

AI Voice Agent · Live Demo

A real phone receptionist powered by OpenAI Realtime API, Twilio Voice, and a live doctor dashboard.

A real phone call. Answered by AI.

Dr. Paws started as a simple question: can a small clinic answer real phone calls with an AI receptionist instead of a scripted chatbot?

I built a deployed voice pipeline where a caller dials a real Twilio number, speaks naturally with an OpenAI Realtime voice agent, and the full conversation streams live into a Vue dashboard for the clinic. The system supports PIN-isolated demo sessions, live transcript sync, appointment booking, call limits, wrong-PIN lockout, and Supabase persistence.

Live Live DemoSince April 2026Render + Vercel
5
Systems integrated
Live
In production
PSTN
Real phone network
<500ms
Voice latency
TwilioOpenAI RealtimeVue 3Node.jsFastifyWebSocketsPiniaPrimeVueSupabaseRender

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.

Since that first session

What shipped after
that first session.

PIN Session Isolation

Each tester enters their name, gets a 4-digit PIN, and calls the number. The PIN scopes the entire session — two people can demo simultaneously and never see each other's transcript.

Production Guardrails

120-second call duration cap with graceful AI wrap-up at 90 seconds. 20 calls per day enforced before the OpenAI connection even opens, so rejected calls cost nothing. PIN lockout after 5 failed attempts.

Supabase Persistence

Every session, transcript, and appointment is saved to Supabase. A page refresh doesn't lose call history — full audit trail of every conversation.

Deployed on Real Infrastructure

Backend on Render, frontend on Vercel, Twilio webhook pointed at a permanent URL. No ngrok, no laptop required — call the number right now and it works.

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-realtime)
  • WebSocket — bidirectional audio + dashboard sync
  • Supabase — session, transcript & appointment persistence
  • Render — production hosting

Frontend

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

Future upgrades

What ships next.

LangChain

reliable name/pet/date extraction from any conversation style

LangGraph

book vs. cancel vs. reschedule — automatic branching, not if/else

Calendly

AI checks live availability and books a real calendar slot

SMS

Twilio confirmation after every booking

Multi-clinic

per-clinic AI persona, phone number, and dashboard

Want to try it live?

Call the number, or open the web demo below.

Live production number. Call it. The AI picks up. The web demo is under active development — expect rough edges.

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

Started April 7, 2026 · Shipped to production July 6, 2026