← Back to projects
Project

RMIT Tutor Scheduling Platform

Automated sessional tutor allocation for higher education — built end-to-end as a solo engineering project.

Visit the platform →

The Problem

Every semester, RMIT University's course coordinators spend days manually matching hundreds of sessional tutors to class slots — cross-referencing availability spreadsheets, avoiding double-bookings, ensuring workload fairness, and chasing acceptances via email. It's a process that's error-prone, time-consuming, and doesn't scale.

I built a platform to automate it entirely.

What It Does

The platform automates the complete tutor-to-class assignment workflow.

  1. Tutors self-submit availability, course interests, and credentials via portal, and rank their preferred classes across all courses in a global drag-and-drop list.
  2. School administrators review applicants and set per-course tutor preferences (Preferred / OK / Not Preferred).
  3. Course coordinators independently rank tutors for each of their specific classes.
  4. School administrators trigger the optimization algorithm for their school's semester, producing conflict-free assignments that respect a 36 hr/week workload cap and institutional workforce rates.
  5. Course coordinators review results, make bounded adjustments within their own course, and approve the schedule.
  6. Tutors accept or reject offers through the portal with email notifications at each stage.

The Optimisation Engine

The core uses Python with Google's OR-Tools CP-SAT constraint programming solver — the same technology powering Google's logistics systems.

Hard Constraints
Objective Function
Maximise: Σ x[t,c] × (cc_ranking_bonus[t,c] + tutor_ranking_bonus[t] + preference_weight[t,c] + ces_weight × normalised_CES[t])

Components in descending priority by weight:

CC ranking bonus — course coordinators rank tutors for their specific classes; the solver rewards assignments that match a coordinator's top preferences

Tutor ranking bonus — tutors rank courses by their own preference; assignments to highly-ranked courses score higher

Admin preference tier — PREFERRED / OK / NOT_PREFERRED, set per tutor per course by the school administrator

CES score — historical Course Experience Survey satisfaction scores, normalised to [0, 1]

Relaxation Cascade
Marking Assignment
Performance

Technical Architecture

The platform is a production-grade TypeScript monorepo deployed on Railway, built with a clean separation of concerns across four services.

Frontend
Next.js 15 (App Router)
SSR, file-based routing, TypeScript-first
Backend API
Express.js + Prisma ORM
Clean REST separation, type-safe DB queries
Database
PostgreSQL 16
Relational integrity, ACID compliance
Optimiser
Python 3.13 + FastAPI + OR-Tools
CP-SAT solver, private network only
Job Queue
BullMQ + Redis
Async solver runs — 120s jobs can't be synchronous
Email
Resend
Transactional offer notifications and confirmations
Security

bcrypt password hashing (cost 12), JWT access tokens in httpOnly/SameSite=Strict cookies, role-based access control on every route, row-level data isolation (coordinators can only access their own courses), Zod validation on all request bodies, Helmet.js security headers, Redis-backed rate limiting on authentication endpoints, and a full immutable audit log.

The optimiser microservice runs on Railway's private internal network and is not accessible from the public internet — only the backend API can call it.

Try It

Three demo accounts are pre-loaded with realistic data — a full semester's worth of classes, tutor profiles, availability submissions, and a completed optimisation run ready for review.

Administrator
Password Password1
Course Coordinator
Password Password1
Sessional Tutor
Password Password1

Start as the coordinator to see the optimisation results and the schedule calendar. Switch to the tutor account to experience the offer acceptance flow. Use the admin account to see the applicant review, workload overview, and CSV upload tools.

Launch the platform →