Project 03

Live demo

Booking & Scheduling App

Passion project — a booking system language schools actually need

  • Python
  • Django
  • DRF
  • React
  • PostgreSQL
  • JWT
  • Docker

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.

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)

  1. Student — buy membership and book a lesson
    1. Sign in as demo_student.
    2. Open Membership → choose Japanese or English → Purchase subscription (mock).
    3. Go to Book a lesson → pick an open session → Book.
    4. 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.

  2. Student — request a custom time
    1. Open Request a class → choose demo_teacher and a class.
    2. Pick a time from the availability grid → submit.
    3. Tickets are held until the teacher responds.
  3. Teacher — approve the request
    1. Sign out → sign in as demo_teacher.
    2. Open Class requests → review the pending request → Approve.
  4. Teacher — reports and homework
    1. Student reports → open a past session → add skill ratings and notes.
    2. Homework → assign a journal prompt or file task.
  5. Staff — studio overview
    1. Sign in as demo_staff.
    2. Staff dashboard → see teachers and open Permissions.
    3. 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