Remi
Hackathon: H0 Hackathon
Live Demo: remiai.vercel.app
SMS Number: +1 (365) 990-5609
Inspiration
Most local service businesses — barbers, salons, cleaners, trades — run on their phone. Every missed text is a missed booking. They can't hire a receptionist, and they can't be available 24/7. Remi is the AI that handles it for them.
What It Does
Sign up, enter your business info, and Remi is live on WhatsApp immediately. The AI handles everything customers text in:
- Instant replies, 24/7 — questions about hours, pricing, and availability answered the moment they come in
- Automatic bookings — customers describe what they need, Remi collects their name, confirms the time, and saves the appointment to Firestore
- Appointment reminders — sent automatically 24 hours and 1 hour before every booking to reduce no-shows
- Review requests — Remi follows up after every visit and asks for a review
- Live dashboard — every conversation, booking, and interaction visible in one place
How I Built It
Architecture
WhatsApp (customer)
│
▼
Twilio Webhook → /api/webhook/sms (Next.js on Vercel)
│
▼
Gemini 2.5 Flash Agent
└── parses booking intent from conversation
│
▼
Firebase Firestore
├── businesses
├── conversations
└── bookings
│
▼
Twilio → WhatsApp reply to customer
Tech Stack
| Layer | Technology |
|---|---|
| AI Model | Gemini 2.5 Flash (Google AI) |
| Messaging | Twilio, WhatsApp Business API |
| Backend | Next.js API Routes (App Router) |
| Database | Firebase Firestore |
| Auth | NextAuth + Google OAuth |
| Payments | Stripe (subscriptions + webhooks) |
| Frontend | Next.js 16, Tailwind CSS, shadcn/ui |
| Hosting | Vercel |
How the AI Booking Works
The Gemini agent runs on every inbound WhatsApp message. It has full conversation history and a system prompt that knows the business's services, hours, and FAQs. When a booking is confirmed with a specific name, service, and time, the model appends a structured BOOKING_JSON block to its reply. The webhook parses it and writes the booking to Firestore in the same request — no second API call, no polling.
Challenges
- Booking intent extraction: Getting Gemini to reliably emit structured JSON only when a booking is actually confirmed — not on every mention of a time — required careful prompt engineering with explicit examples of what counts as confirmed vs tentative.
- Twilio signature validation in production: The raw URL Twilio sends in
x-twilio-signaturemust match exactly, including protocol and path. Subtle mismatches caused 403s until the validation was tightened. - Stripe webhook secret: The signing secret was accidentally stored as the environment variable name instead of its value in Vercel — caused silent failures on every subscription event until caught.
What's Next
- Google Calendar sync so bookings appear in the owner's calendar automatically
- Multi-staff scheduling with availability per team member
- WhatsApp template messages for proactive outreach campaigns
- Analytics dashboard with revenue forecasting from booking trends
Team
Built solo by @kyisaiah47.
Built With
- firebase-firestore
- google-gemini-2.5-flash
- next.js
- nextauth
- stripe
- tailwind-css
- twilio
- typescript
- vercel
- whatsapp-business-api

Log in or sign up for Devpost to join the conversation.