A modern, production-ready appointment scheduling platform built with Vue 3, FastAPI, SQLite, and the Cal.com API.
The system allows users to browse event types, select dates and time slots, verify their email via OTP, and confirm appointments. All bookings are persisted locally and synchronized with Cal.com in real time.
- π Dynamic event type fetching from Cal.com
- β±οΈ Automatic generation of available time slots
- π§ Email OTP verification before booking
- π Book, reschedule, and cancel appointments
- πΎ Local persistence using SQLite
- π Real-time synchronization with Cal.com
- π± Responsive Vue 3 + Vite frontend
- βοΈ Clean, modular FastAPI backend
- π³ Dockerized for one-command startup
- π Clear, developer-friendly documentation
calbookingwebapp/
β
βββ backend/
β βββ app/
β β βββ main.py
β β βββ models.py
β β βββ cal.py
β β βββ slot_engine.py
β β βββ database.py
β β βββ config.py
β βββ Dockerfile
β βββ requirements.txt
β βββ .env # Not committed (Cal API key)
β
βββ frontend/
β βββ src/
β β βββ api/
β β βββ components/
β β βββ views/
β β βββ App.vue
β β βββ main.js
β βββ Dockerfile
β βββ package.json
β βββ vite.config.js
β
βββ docker-compose.yml
Running the entire stack via Docker is the fastest and easiest option. No need to install Python, Node.js, pip, or npm locally.
Ensure Docker is installed:
docker --version
docker compose versionCreate the following file:
backend/.env
Add your Cal.com API key:
CAL_API_KEY=cal_live_xxxxxxxxxxxxxxxxxxxx
β οΈ This file is ignored by Git and must exist before building containers.
From the project root:
docker compose up --buildDocker will:
- β Build the backend image
- β Build the Vue frontend image
- β Create a shared Docker network
- β Start all services
| Service | URL |
|---|---|
| Frontend (Vue) | http://localhost:5173 |
| Backend (FastAPI) | http://localhost:8000 |
| API Docs (Swagger) | http://localhost:8000/docs |
docker compose downdocker compose build --no-cache
docker compose upIf you prefer not to use Docker, you can run the backend and frontend separately.
cd backendpython3 -m venv venv
source venv/bin/activate # Linux / macOS
venv\Scripts\activate # Windowspip install -r requirements.txtCAL_API_KEY=cal_live_xxxxxxxxxuvicorn app.main:app --reload --host 0.0.0.0 --port 8000Backend will be available at:
http://localhost:8000
http://localhost:8000/docs
cd frontend
β οΈ Requires Node.js 18+ (recommended: Node 20)
npm installnpm run devOpen in browser:
http://localhost:5173
- Visit: https://app.cal.com/settings/developer
- Create a Personal Access Token
- Copy the token
- Add it to
backend/.env:
CAL_API_KEY=cal_live_xxxxxxx- Ensure event types exist: https://app.cal.com/event-types
- Event duration must match slot engine logic (e.g., a 15-minute event must produce 15-minute slots)
-
Vue frontend loads event types from the backend
-
User selects an event type and date
-
Backend generates available time slots
-
User selects a slot and enters name + email
-
Email OTP verification is performed
-
Backend:
- Saves booking in SQLite
- Syncs appointment with Cal.com
-
Vue UI shows booking confirmation
-
User can reschedule or cancel the appointment
docker logs clinic-backenduvicorn app.main:app --reloadSensitive and generated files are excluded:
backend/.env
backend/venv/
backend/__pycache__/
frontend/node_modules/
*.log
- β Vue 3 frontend (Vite)
- β FastAPI backend
- β Cal.com integration
- β Email OTP verification
- β Booking / reschedule / cancel flows
- β Fully Dockerized