Precious Smile Dental Clinic - website & client-management system with automated SMS reminders. Built with React + TypeScript + Firebase (Hosting, Firestore, Auth, Functions). Serere, Uganda.
# Precious Smile Dental Clinic
A complete website and client-management system for **Precious Smile Dental
Clinic** in **Serere, Uganda**.
- **Public marketing site** — services, about, contact, location, opening hours.
- **Online appointment booking** — patients request appointments by phone/date.
- **Staff portal** — authenticated dashboard to manage appointments and clients.
- **Automated SMS** — confirmations, reminders and follow-ups sent / previewed
for every client automatically (runs in dry-run/log mode now; see below).
Built with **React + TypeScript + Vite** and hosted on **Firebase** (Hosting,
Firestore, Auth).
---
## Features
### Public website
- Landing page with hero, services, booking steps and opening hours.
- Services catalog (cleaning, fillings, extractions, root canals, orthodontics,
cosmetic/whitening, children's dentistry, emergency care).
- About page and a contact/location page with a map of **Serere**.
### Booking
- Public appointment request form (name, phone for SMS, service, date, time,
notes).
- Writes to Firestore `appointments` collection; anyone can request, only staff
can read/update.
### Staff portal (`/staff`)
- Google sign-in restricted to a configured staff list (`staff/ `).
- Manage appointments: **confirm**, **complete**, **cancel**.
- Every status change automatically generates an SMS to the patient.
- **SMS log** tab previews every message the system would send.
- Staff directory to add/remove team members (admins).
### Automated SMS engine
- Finnish-style **dry-run / log mode** by default: no real texts are sent, but
every intended message is recorded to `sms_log` and shown in the portal.
- Message templates are centralized (`smsService.ts`):
booking received, confirmed, reminder, completed, cancelled.
- Ready to go live: a Cloud Function gateway (`functions/`) dispatches through a
provider (Africa's Talking / Twilio) when `SMS_MODE=live` and credentials are
set.
---
## Tech stack
| Layer | Technology …