A production-ready Interview Calendar for healthcare HR teams: schedule, track, and manage candidate interviews with Google Calendar / Meet integration, department filtering, and a smooth React UI.
| Calendar View | Interview Details (Scheduled) | Interview Details (Completed) |
|---|---|---|
![]() |
![]() |
![]() |
- Month / Week / Day calendar views powered by FullCalendar
- Color-coded status cards: Scheduled · Completed · Cancelled · Rescheduled
- Schedule, Reschedule, Cancel, Complete interviews with a state-machine guard
- Google Calendar event creation + Google Meet link generation
- Department & status filter bar
- Interviewer management
- Audit log trail for every status change
- JWT auth via Google OAuth 2.0
.icsexport- Seed data for realistic demo (12 candidates, March 2026)
flowchart TD
Browser["React 18 + FullCalendar\n(Vite / TailwindCSS)"]
subgraph Backend ["FastAPI (Python 3.11)"]
Router --> MeetingService
MeetingService --> GoogleService
MeetingService --> DB
MeetingService --> AuditLog
end
Browser -- "REST /api/v1" --> Router
DB[(PostgreSQL 15)]
GoogleService -- "google-api-python-client" --> Google["Google Calendar API"]
.
├── backend/
│ ├── app/
│ │ ├── api/v1/ # REST endpoints
│ │ ├── core/ # config, security, logging
│ │ ├── db/ # session, seed
│ │ ├── models/ # SQLAlchemy ORM
│ │ ├── schemas/ # Pydantic v2
│ │ └── services/ # business logic, Google integration
│ ├── alembic/ # DB migrations
│ └── tests/
└── frontend/
└── src/
├── components/
│ ├── calendar/ # CalendarView, MeetingCard, FilterBar
│ ├── layout/ # Sidebar, TopHeader
│ └── meeting/ # MeetingDetailsModal, CreateMeetingModal
├── pages/ # InterviewCalendar
├── lib/ # api client, utils
└── types/ # TypeScript interfaces
- Python 3.11+,
pip - Node 20+,
npm - PostgreSQL 15 (or Docker)
- Google Cloud project with Calendar API enabled and an OAuth 2.0 client
git clone <repo-url>
cd emailBackend
cp backend/.env.example backend/.env
# Edit backend/.env — fill DATABASE_URL, SECRET_KEY, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETFrontend
cp frontend/.env.example frontend/.env
# Edit frontend/.env — set VITE_API_URL=http://localhost:8000docker compose up --build- Frontend → http://localhost:5173
- Backend → http://localhost:8000
- API docs → http://localhost:8000/docs
Backend
cd backend
pip install -e ".[dev]"
alembic upgrade head
python -m app.db.seed # optional demo data
uvicorn app.main:app --reloadFrontend
cd frontend
npm install
npm run dev- Go to Google Cloud Console → APIs & Services → Library
- Enable Google Calendar API
- Create OAuth 2.0 Client ID (Web application)
- Add authorised redirect URI:
http://localhost:8000/api/v1/auth/google/callback - Copy Client ID and Client Secret into
backend/.env
| Method | Path | Description |
|---|---|---|
GET |
/api/v1/meetings |
List meetings (filter: department, status, date_from, date_to) |
POST |
/api/v1/meetings |
Create meeting |
GET |
/api/v1/meetings/{id} |
Get single meeting |
PATCH |
/api/v1/meetings/{id} |
Update meeting |
POST |
/api/v1/meetings/{id}/cancel |
Cancel meeting |
POST |
/api/v1/meetings/{id}/complete |
Complete meeting |
GET |
/api/v1/meetings/{id}/audit |
Audit log |
GET |
/api/v1/users/interviewers |
List interviewers |
GET |
/api/v1/departments |
List departments |
GET |
/api/v1/auth/google |
Start OAuth flow |
GET |
/api/v1/auth/google/callback |
OAuth callback |
Interactive docs available at /docs (Swagger UI) and /redoc.
SCHEDULED ──► COMPLETED (terminal)
├─► CANCELLED (terminal)
└─► RESCHEDULED ──► SCHEDULED
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite, TailwindCSS, FullCalendar, @tanstack/react-query |
| Backend | Python 3.11, FastAPI, SQLAlchemy 2 (async), Alembic, Pydantic v2 |
| Database | PostgreSQL 15 |
| Auth | Google OAuth 2.0, JWT (python-jose) |
| Calendar | google-api-python-client |
| CI | GitHub Actions |
MIT © 2026


