Project 03
Live demo
Booking & Scheduling App
Passion project — a booking system language schools actually need
First load may take ~50s on free-tier hosting while the API wakes up.
Problem
Across several language schools I have worked at, scheduling was always painful — teachers juggling availability in spreadsheets, students unsure what their learning options were, staff piecing together membership and class info by hand. I wanted to build the system these schools deserved.
Solution
A personal passion project: full Django + DRF backend with a React SPA for teacher availability, class catalog, student membership, booking, and cancellation. Designed for how language schools actually operate, not tied to one employer.
Build story
- Started from patterns I saw at multiple schools — availability blocks, class offerings, membership gating.
- Chose Django for ORM, admin, auth groups, and long-term maintainability.
- Built scheduling services and a React SPA with role-based routes for students, teachers, and staff.
- Added a demo sandbox so anyone can try it without touching real school data.
Django + React scheduling stack
React SPA calls Django REST Framework with JWT. Scheduling services handle availability, membership gating, and bookings; PostgreSQL is the source of truth. Django admin supports staff operations.
Loading diagram…
Where it is now
Production-ready passion project with a public demo. The flagship app I keep building because I have seen firsthand how much language schools need tools like this.
Try the live demo
Open the demo (opens in new tab) — A language-school-style booking system: students buy memberships and book lessons, teachers manage schedules and write progress reports, and staff run the studio from one dashboard. This is a sandbox prototype — data may reset, and the API can take up to a minute to wake up after idle time.
Before you start
- Cold start
- The first click after idle time may spin for 30–60 seconds while the API wakes up. Refresh once if a page stays blank.
- Mock payments
- Membership purchases are simulated — no real card charges.
- Shared demo
- Anyone can log in and change data. The database may reset when the server restarts.
- No real email
- Confirmation emails are not sent in this environment.
- Meeting links
- Video links are placeholders, not real Google Meet rooms.
Demo logins
All accounts use password demo1234. You can also create your own student account from the sign-in page.
| Role | Username | Best for |
|---|---|---|
| Student | demo_student | Booking, membership, progress, homework |
| Teacher | demo_teacher | Schedule, class requests, reports, homework |
| Staff | demo_staff | Studio-wide admin, plans, branding, metrics |
What each role does
Student
Browse open lesson slots, book with tickets from a membership, request custom times, track skill progress, and complete homework.
- Book a lesson — Calendar of open sessions — filter by subject, teacher, or time
- Request a class — Ask for a specific time; teacher must approve before it is confirmed
- My bookings — View and cancel upcoming lessons
- Membership — Buy a mock subscription or ticket pack (Japanese or English plans)
- My progress — Charts and session history with teacher feedback
- Homework — View assignments and reply to journal prompts
Teacher
Own a class catalog, publish availability, open sessions for students to book, approve class requests, and write session reports and homework.
- My sessions — Calendar of all your lessons; see who is enrolled
- Class requests — Approve or deny student-requested times
- New session — Open a slot on the calendar (must fall in your availability)
- Student reports — Rate skills and leave notes after a lesson
- Homework — Assign file uploads or journal prompts
Staff
Manage the whole studio: all teachers, membership plans, student accounts, branding, glossary labels, and reports.
- Staff dashboard — List teachers; jump to their schedule or permissions
- Studio schedule — Every teacher on one calendar
- Memberships — Edit plan prices and ticket allowances
- Glossary — Rename terms app-wide (e.g. Student → Client)
- Sign-in branding — Logo and studio name on the login page
Recommended walkthrough (~10 minutes)
- Student — buy membership and book a lesson
- Sign in as demo_student.
- Open Membership → choose Japanese or English → Purchase subscription (mock).
- Go to Book a lesson → pick an open session → Book.
- Open My bookings to confirm the reservation.
demo_student starts without a membership so you can try the purchase flow. Past sessions are pre-seeded for progress charts.
- Student — request a custom time
- Open Request a class → choose demo_teacher and a class.
- Pick a time from the availability grid → submit.
- Tickets are held until the teacher responds.
- Teacher — approve the request
- Sign out → sign in as demo_teacher.
- Open Class requests → review the pending request → Approve.
- Teacher — reports and homework
- Student reports → open a past session → add skill ratings and notes.
- Homework → assign a journal prompt or file task.
- Staff — studio overview
- Sign in as demo_staff.
- Staff dashboard → see teachers and open Permissions.
- Studio schedule → all sessions in one view.
Key concepts & troubleshooting
Key concepts
- Class
- A teachable offering (e.g. English Conversation · Intermediate)
- Session
- A specific time slot on the calendar
- Booking
- A student's reserved seat in a session
- Ticket
- Currency used to book; comes from membership
- Class request
- Student asks for a custom time; teacher must approve
- Membership
- Subscription or ticket pack tied to a subject (Japanese / English)
Troubleshooting
- Login spins forever
- Wait up to 60s for the API cold start, then retry
- Login failed
- Use demo_student, demo_teacher, or demo_staff — password demo1234
- Can't book
- Buy a mock membership first on the Membership page
- No open sessions
- Sign in as demo_teacher → New session to add a slot
- Data looks wrong
- Demo data may have been reset — run through the walkthrough again