Holiday Beach Platform
An intelligent digital system — website, mobile app and AI chatbot — unifying 34,000+ reservations scattered across 186 scanned documents.
- OCR
- AI Chatbot
- Gemini
- React
- React Native
- FastAPI
- Flask
- MySQL

Context
Djerba Holiday Beach managed its reservations in a fragmented way: data was spread across 6 PDF files and 186 scanned documents, with no unified view. This project grew out of a field internship (hotel operations & data) that revealed the scale of the problem: 34,000+ reservations to reconcile.
Problem
Without a central platform, there was no way to track reservations in real time, cross-reference data across channels, or respond quickly to guests — everything relied on scattered paper and scanned documents.
Architecture
- Data pipeline: OCR (i2OCR) on the 186 scanned PDFs → CSV extraction → MySQL loading.
- Web platform: React + TypeScript + TailwindCSS, FastAPI backend, real-time dashboard.
- Mobile app: React Native / Expo, QR-code booking, local SQLite storage synced with MySQL.
- AI chatbot: a Flask microservice connected to Google Gemini (Flash), with MySQL business context, for 24/7 customer support (details below).
- Deployment: microservices architecture on Netlify (frontend) and Render (backend).
2026 overhaul
A major overhaul took the platform from prototype to day-to-day operations tool:
- Self-service booking backed by an anti-overbooking availability service: for each room type, overlapping active bookings never exceed the number of physical rooms.
- Real invoicing: sequentially numbered invoices (FA-2026-0001…), issued when the booking is confirmed rather than on request, with an independent payment status.
- Security: bcrypt password hashing and JWT authentication; a 33-route API covered by tests (availability, pricing, bookings, security).
- El Sofra mobile app (React Native, Expo) for the hotel’s restaurant: customer and staff screens and QR-code scanning, built on a cleaned-up booking history.
- New visual identity: one design system for both the website and the admin panel, derived from the hotel’s logo and using the property’s real photos.
A closer look at the chatbot
The chatbot, built as my Master’s PFA, handles the repetitive questions the front desk used to answer by hand every day: availability, restaurant hours, pool access, directions.
- React + Vite widget: a floating button that opens into a chat window, with quick replies (“Book”, “Hours”, “Contact”) and a fallback message if the API is unreachable.
- Flask API:
POST /api/chatfor conversation andGET /api/healthfor monitoring, with CORS so it can be embedded on any page of the site. Brainclass: decides how to answer. By default it calls Gemini Flash (switching automatically between model versions) with a prompt carrying the hotel’s identity and enforcing short replies (1–2 sentences).- Smart fallback: if Gemini is unavailable or the API key is missing, the chatbot switches to keyword-based intent detection (greeting, booking, contact). It never goes down for guests.
- MySQL context: the reservation count is read from the database to enrich booking answers instead of giving a generic reply.
Stack
React, TypeScript, TailwindCSS, React Native/Expo, FastAPI, Flask, MySQL, SQLite, OCR (i2OCR), Google Gemini LLM, Netlify, Render.
Results
- 34,000+ fragmented reservations unified from 186 scanned documents.
- Self-service QR-code booking, without relying on on-site staff.
- 24/7 customer support via the AI chatbot, with direct access to business context — and no downtime thanks to the fallback mode.