Skip to content
Neel Bhavsar
All work

Mentor matching that used to live in a spreadsheet

iMentor

Role
Full stack
Year
2023
Impact
3 institutions · 35% higher satisfaction
iMentor — cover

Overview

iMentor is a CMS-driven education platform where coordinators, mentors, mentees and admins each get their own view of the same programme. Content, cohorts and progress all run through the CMS.

Its centre of gravity is matching. Pairing mentors to mentees was a manual, spreadsheet-driven exercise; here it is an algorithm over availability, subject, capacity and preference, with coordinators keeping final say.

Once paired, they stay inside the platform: mentor and mentee talk over built-in chat, so the conversation is part of the programme record rather than scattered across personal WhatsApp threads.

What I built

  • Built full stack — Express API, MongoDB schema, matching algorithm, and the React and Next.js interfaces for every role.
  • Built the React front-end for the coordinator console and the mentor and mentee dashboards, sharing one component layer across all four roles.
  • Designed the multi-role permission model covering admin, coordinator, mentor and mentee.
  • Implemented the scored matching engine with weighted criteria and manual override.
  • Built the in-app chat on Socket.io — mentor–mentee threads with delivery state, unread counts and message history.
  • Added live updates over the same socket layer so cohort and assignment changes appear without reloading.

The hard parts

Matching is not one rule

Subject fit, availability overlap, mentor capacity and stated preference all matter, and they conflict. Each pairing gets a weighted score with the reasoning exposed, so coordinators can see why a match was proposed and override it.

Four roles, one API

Every endpoint means something different per role. Permissions are declared per resource and enforced in one middleware layer rather than scattered through handlers, which kept the surface auditable as roles grew.

Capacity without overload

Assignment respects per-mentor load limits inside the allocation pass, so a strong-fit mentor never quietly ends up with eight mentees while others sit idle.

Chat that survives a refresh

A socket connection is not a record. Every message is persisted before it is broadcast, so history, unread counts and delivery state all rebuild from the database when a mentee reopens the app on a different device.

Outcomes

Distinct roles
4
Mentor matching
Auto
Mentor chat
In-app

Stack

  • Node.js
  • Express
  • React
  • Next.js
  • MongoDB
  • CMS
  • Socket.io

Live

Visit the site