Skip to content
JNP
All projects

Case study · 2026

ConsultTrack

Capstone Consultation Management System

A consultation system for a university capstone program, built for Holy Angel University. A thesis group books time from the hours their adviser has published; the adviser approves, offers another time, or declines with a reason. After the session, minutes, attendance and action items are recorded.

consult-track.vercel.app
ConsultTrack sign-in screen with the sign-in form centred over a photograph of the Holy Angel University campus.

The problem

Capstone programs ask each group for a signed record of the consultations they held, and it tends to be reconstructed from memory in the last week of term. ConsultTrack assembles that record from sessions as they happen.

What it does

  • Advisers publish recurring weekly consultation hours; students book from a slot picker showing which times are open or taken.
  • A student's booking is a request: the adviser approves it, declines with a reason, or makes one counter-offer the group can accept.
  • Either side can ask to move or cancel a scheduled session.
  • A message thread per consultation, with unread counts.
  • Session wrap-up records minutes, optional attendance and action items with assignees and due dates.
  • A printable consultation record listing every session a group has held.
  • Student or adviser role is decided by the email domain at sign-up, verified with a 6-digit emailed code.

Engineering decisions

Booking rules are enforced on the server
The API checks that a requested time sits on a slot boundary inside a published block and that the slot isn't already held by a pending or scheduled session — the slot picker alone isn't trusted.
A counter-offer never moves the meeting by itself
An offered time is stored separately from the meeting date and only replaces it when the group accepts. A live offer holds its slot, and it stops counting once its time has passed, so nothing has to sweep the table.
Wrap-up is one transaction
Closing a session and writing its action items happen together, so a session can't end up closed with its tasks lost.
Password reset doesn't reveal who is registered
The forgot-password reply is identical whether or not the address has an account, and a successful reset revokes every other session.

My contribution

I built and deployed the system, covering adviser schedules, booking approvals, counter-proposals and cancellations. I implemented 14 PostgreSQL schema migrations with Row Level Security, added email OTP registration, role assignment and rate-limited account recovery, and brought consultation follow-ups into one place with message threads, unread tracking and printable records of minutes, attendance and action items.

Technologies

  • React 18
  • Vite
  • Tailwind CSS 4
  • Node.js
  • Express
  • PostgreSQL (parameterized SQL via pg)
  • Supabase Auth (email OTP)
  • Vercel

What I'd do next

  • Email notifications and reminders — notices are in-app only today.
  • Refresh expiring sessions instead of returning to the sign-in screen.