Zoom Clone
Full-stack Zoom web-client clone: start, join and schedule meetings, with a pre-join camera and microphone preview and host controls in the meeting room.
- TypeScript
- Next.js
- Tailwind CSS
- FastAPI
- Pydantic
- SQLAlchemy
- SQLite
Problem
Replicate the core Zoom web-client workflows (start, join, schedule and host a meeting) as a full-stack application with a relational backend.
Approach
A Next.js (App Router, Tailwind CSS) frontend talks over a REST/JSON API to a FastAPI backend that validates requests with Pydantic and stores data through SQLAlchemy in a SQLite database. Instant meetings get a generated 11-digit meeting ID and a host record; joining checks that the meeting exists; the pre-join screen uses the browser's getUserMedia API for a camera and microphone preview and mute preferences; scheduled meetings store a topic, description, date, time and duration. The meeting room has a participant grid, a participant panel and host controls (Mute All, remove participant). A startup script seeds the database with demo data.
Architecture
Next.js client -> HTTP/REST/JSON -> FastAPI API (Pydantic validation, CORS) -> SQLAlchemy ORM -> SQLite. Three tables: Users, Meetings (meeting code, title, description, host, instant or scheduled type, status, start time, duration) and Participants (who joined which meeting, display name, host or participant role, join and leave times).
Frontend
Next.js frontend (TypeScript, Tailwind CSS)
Backend
FastAPI backend
Database
SQLite database (via SQLAlchemy)
Browser getUserMedia for camera and microphone preview
Results
| Metric | Verified Value | Context |
|---|---|---|
| Delivered | Instant and scheduled meetings, join by meeting ID, camera and microphone pre-join, host controls (Mute All, remove participant) | — |
| Scope limits | No authentication (seeded host profile); no multi-user WebRTC media | — |
What I Learned
Scoped the project to the core meeting lifecycle: authentication was replaced by a seeded host profile, and multi-user WebRTC media and signaling were left out because they need dedicated infrastructure beyond the assignment timeline.