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
Build the mobile version first
Students mostly use their phones.
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.
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