← all projects

Case study · Consultation Booking System

Teech

A consultation booking system where students request open faculty slots and faculty confirm or decline them.

Role
Full-stack Developer
Year
2026
Type
Web app
Status
Live

01 — my role

Full-stack Developer · Team project

  • Led web development as Head Web Developer
  • Built most of the app myself, from the front end to the back end

02 — key features

  • Slot-based booking

    A four-step flow (date, time, details, review). Faculty availability is split into hourly slots, and taken slots and past times today are hidden.

  • Request tracking

    Students follow each request through pending, confirmed, declined or cancelled, and can cancel if plans change.

  • Faculty tools

    Faculty publish dates, times and rooms, then confirm, decline or cancel requests.

  • Streaks, points and badges

    Daily check-ins earn more points each day of a streak, peaking on day 7. Points buy streak freezes and common, rare and legendary badges, and up to 3 badges can be shown on a profile.

03 — key decisions

  1. Build the mobile version first

    Students mostly use their phones.

  2. Put booking rules in Postgres triggers and row-level security

    App-side checks can be skipped by direct API calls, and two students booking at once could both pass them.

  3. Serve mobile and desktop layouts at the same URLs

    The desktop version could roll out page by page until it was complete.

04 — design

  • Designed mobile first, with a full desktop layout served at the same URLs.
  • Booking is split into four short steps (date, time, details, review), and faculty show a live status before students book.

05 — stack

  • Next.jsPages, API routes, and a proxy for sign-in checks and phone vs computer routing
  • TypeScriptTyped pages, helpers and API routes
  • Supabase AuthStudent ID sign-in for students, email sign-in for faculty
  • PostgreSQLBookings, availability, notifications, points and badges, with row-level security
  • Supabase RealtimeLive notification and request updates
  • Supabase StoragePrivate profile photos
  • pg_cronNightly job that expires unanswered requests
  • Gemini APIHelp chat fallback
  • CSS ModulesComponent-scoped styling for the mobile and desktop layouts
  • VercelHosting