About Mim, The Smart AI Receptionist

Inspiration

Shahin runs Shahin AC Servicing Center in Mirpur. When he is on a job, the shop line still rings. A caller like Nusrat — AC not cooling in Dhanmondi, wants servicing tomorrow — gets no answer. She books someone else. Shahin finds out when he is already home, too late.

It is lost revenue, a wasted slot, and a customer who will not try again. Receptionists are expensive. A static website cannot quote, hold a time, or take an advance. We wanted a receptionist that actually closes: talk, quote only from the rate card, hold a slot, collect a small advance, and tell the owner what happened.

We built Mim for that shop, and for every small service business that cannot sit next to the phone.

What it does

Mim is a live AI receptionist you open in the browser like a phone.

A caller (the judge, playing Nusrat) taps Call, speaks English, and Mim answers in a natural voice. She asks what is wrong and where they are. She only quotes the shop’s real card:

Service Price Advance
AC general servicing ৳800 ৳500
AC deep cleaning ৳1,500 ৳500
Gas refill (after inspection) ৳3,000 ৳1,000
New installation Site visit only —

She serves Mirpur, Dhanmondi, Mohammadpur, Uttara, and Bashundhara. Out of area, she declines politely. She does not invent prices or times. Slots are only 10am, 12pm, 3pm, 5pm — today or tomorrow — and a slot is held for 10 minutes until the advance is paid.

Then she sends an in-app SMS with a payment link. The checkout looks like Stripe Checkout. The judge pays with test card 4242 4242 4242 4242. No real money moves. Mim stays on the line and confirms the booking when payment lands.

On a second screen, Shahin’s dashboard updates live: call status, transcript, owner SMS, and a Revenue rescued counter. Dummy login: shahin / air123.

Judges can also haggle (she holds the card price), refuse the link (cash on arrival / soft-book), or report an emergency (sparking, burning smell, infant in heat). Mim stays in character.

In production this would sit on a real shop number (Twilio Voice + SMS). For the demo, the “phone” is the browser — Twilio minutes are not free, and Bangladesh cannot open a live Stripe account today.

How we built it

The call is a long-lived conversation, not a form. We needed a process that can hold a WebSocket, a microphone, and a database at the same time.

  • Backend: Python FastAPI + WebSockets. One session per call: transcript, memory (name, area, job, booking), tools.
  • Frontend: React + Vite. Three surfaces: in-browser phone (/), owner dashboard (/dashboard), Stripe-style checkout (/pay/:token).
  • Speech in: Groq Whisper (whisper-large-v3-turbo, English).
  • Brain: Gemini 3.6 Flash (Google AI Studio, free) with tool calls — lookup_price, check_area, book_slot, send_payment_link, escalate, end_call. Groq Qwen is the fallback if Gemini is down.
  • Speech out: Microsoft Edge TTS, en-US-JennyNeural. No paid voice API.
  • Data: SQLite for calls, bookings, payments, transcripts, owner SMS.
  • Pay: Self-hosted Checkout lookalike. Test card → backend pin 1234. Ready to swap for live Stripe when an account exists.
  • Host: Oracle Always Free Ubuntu ARM VM. Phones need HTTPS for the mic, so a Cloudflare quick tunnel publishes the app without opening 80/443 on Oracle.

We did not use Vercel or Hugging Face free hosting: they cannot run a 24/7 Python WebSocket server. We did not put Grok in the runtime — it is paid. Cursor helped us build; the live brain is Gemini.

Challenges we ran into

The stack that would be “correct” is paid. Twilio Voice to a Bangladeshi number, live Stripe, and a hosted voice agent all want a credit card and (for Stripe) a supported country. We had to simulate the phone and the payment without faking the logic — quotes, holds, and “paid” still have to be real in the demo.

Bangla broke the free models. We wanted Mim to speak Bangla. Whisper and the free LLMs turned noisy Bengali into garbage, then the receptionist looped a script. We switched the live path to English so a judge can finish a booking in two minutes.

Whisper invents speech. Silence and room noise came back as “thank you,” “see you next time,” or random names. Mim then said goodbye and hung up. We had to treat those as non-speech, stay on the line after the payment link, and stop the call from ending until the caller pays, refuses, or taps End.

Phone Chrome is not a desktop speaker. After the user allows the microphone, Android routes audio to the earpiece. Mim sounded like she was inside the handset. We unlock the speaker before getUserMedia, play TTS through a dedicated audio path, and release the mic while she talks so the loudspeaker comes back.

Hosting a voice app for $0. A static site cannot do this. We put Mim on Always Free compute and a tunnel. If the tunnel process restarts, the public hostname changes — the VM and the receptionist stay up.

Accomplishments that we're proud of

  • A full loop, not a pitch deck: talk → rate-card quote → slot hold → SMS → sandbox pay → live dashboard.
  • Mim cannot invent a price. Installation is site visit only. Out of area is a no. Haggling does not unlock a discount.
  • The checkout looks like Stripe so judges feel the real product, while we stay honest that it is test mode.
  • The owner sees the call as it happens — transcript, SMS, revenue — the way Shahin would on his phone.
  • It runs on a free stack (Gemini, Groq, Edge TTS, Oracle Always Free, Cloudflare tunnel) that a shop owner could keep on after the hackathon.

What we learned

A receptionist is a state machine with a voice, not a chatbot. Memory, tools, and “do not hang up while they pay” matter more than a clever greeting.

Speech-to-text on a phone is hostile. Models fill silence with English they trained on (YouTube outros, “thank you”). If you trust every transcript, you ship a receptionist that thanks empty air and ends the call.

Payments in Bangladesh taught us to separate experience from rails. We built the Stripe Checkout moment first. The charge API can plug in later. The advance still has to mean something in the booking table.

And “free hosting” is not one product. Voice + WebSockets + a long Python process needs a small VM, not a 10-second serverless function.

What's next for Mim, The Smart AI Receptionist

  • A real phone number. Twilio (or a local SIP trunk) so Shahin’s existing line rings Mim when he is out.
  • Live Stripe (or bKash / Nagad) the day a supported merchant account exists — same checkout, real advance.
  • Bangla that works. A better STT/TTS pair for Dhaka speech, not a prompt that pretends Whisper understands it.
  • More shops. Same Mim, different rate card: plumber, electrician, laundry. One receptionist product for small service businesses.
  • Owner on WhatsApp. Push the booking SMS and emergency to Shahin’s phone, not only the dashboard tab.

Mim’s job is simple: the shop phone should never die just because Shahin is on a ladder.

Built With

Share this project:

Updates

Submission history