Inspiration

My mom works at a restaurant where there's no dedicated phone person. I've watched her countless times - she's taking orders at the counter, helping customers, and suddenly the phone rings. She drops everything, grabs a pen, struggles to hear over the kitchen noise, and rushes through the call while a line of impatient customers builds up in front of her. During busy hours, she just can't answer - those calls ring out, and that's money the restaurant loses and stress she carries home. I built DineDash for her.

What it does

DineDash answers restaurant phone calls with an AI that sounds natural and handles everything a human would - taking food orders, booking reservations, checking order status, and answering menu questions. Orders appear instantly on the restaurant's dashboard in real-time, ready for the kitchen. No more missed calls, no more scribbled orders, no more 'please hold.'

How I built it

I built DineDash with Vapi for phone/voice handling, ElevenLabs for natural speech synthesis, Claude (Anthropic) for conversational AI with tool execution, and MongoDB Atlas for real-time multi-device sync. The magic is in Claude's tool-use capability - it doesn't just chat, it actually creates orders and reservations in the database mid-conversation. Python/Flask backend processes calls, executes tools locally for speed, and pushes updates to a real-time dashboard that any device can access via a simple party code.

Challenges I ran into

The first architecture was too slow. It used HTTP callbacks for every AI action - create order, add item, check menu - and conversations were painfully slow. I learned how agents work and rebuilt everything: Claude now runs on our server and executes tools locally against the database. No more network round-trips. Conversations went from very slow to almost instant. Matching casual speech ('coke') to formal menu items ('Coca-Cola Classic') required implementing fuzzy search in our database layer. But duplicate orders were our biggest headache - Claude would create multiple orders from a single request because Vapi sends rapid parallel requests. I fixed this with call-level tracking that checks for existing orders before creating new ones.

Accomplishments that I'm proud of

I'm proud that DineDash actually works end-to-end. You can call a real phone number, have a natural conversation, order food, and watch it appear on the dashboard instantly. It's not a demo - it's a functional system. The party code system is something I love - any staff member can join from any device by entering a 6-character code. No app downloads, no account creation, no complex setup. Just a code and you're connected. I'm also proud of solving the speed problem. Moving from HTTP tool callbacks to local agent execution made conversations feel genuinely human.

What I learned

This project was a deep dive into Claude agents and tool-use architecture. I learned that agents aren't just chatbots - they're AI that can take real actions. Understanding the tool loop (Claude calls tool → you execute → feed results back → Claude responds) was the breakthrough moment. I also learned a lot about Vapi and voice AI infrastructure - how speech-to-text, LLM processing, and text-to-speech chain together, how to handle parallel requests without creating duplicate actions, and why latency matters so much in voice (even 500ms feels awkward). On the database side, working with MongoDB Atlas taught me about real-time sync patterns and building multi-tenant systems where data stays isolated per restaurant.

What's next for Dinedash

Next steps: a fully hosted version so restaurants don't need any technical setup - just sign up and get a phone number. Get a real restaurant using DineDash - maybe even my mom's workplace. I want to prove this works in the real world, not just in demos. Real customers, real orders, real feedback.

Built With

Share this project:

Updates