Mentoring programmes
Mentor
Pairs that are still meeting in week twelve.
Mentor and mentee matching on stated goals, plus the check-in tracking that shows which pairs have gone quiet. The matching is solved across the whole cohort rather than first-come-first-served, and the output is a proposal the programme lead can argue with.
- Next.js 16
- TypeScript
- Supabase
- PostgreSQL
- Row-level security
- Resend
- React PDF
- Magic-link sign-in
- Matching
- Whole cohort
- Every pair
- Shows its reasoning
- Drift
- Found in week nine
global assignment, not first-come
and the lead can overrule it
not in the end-of-year survey
What was going wrong
Mentoring programmes are matched in a spreadsheet on the Friday before they launch, usually in the order the sign-ups arrived. Six weeks later nobody knows which pairs are still meeting, and the answer arrives at the end of the year in a survey with a thirty per cent response rate.
What we built
Two halves. The matching is a global assignment over stated goals and real availability, and it produces a proposal with its reasoning attached rather than a fait accompli — a lead who cannot override it will not trust it. The other half is a light cadence: a prompt on the agreed rhythm, one honest question, and a board that shows the lead which pairs have gone quiet while there is still time to do something about it.
What it looks like
Every screen shown on a desktop and on a phone, because half of these are used standing up.
The proposal
Ninety pairs with the reasoning on every row, before anybody has been introduced to anybody. Overriding is expected.
/programme/matching
Desktop capture
1440 × 900
Mobile capture
390 × 844
The drift board
The pairs that have gone quiet. On a healthy cohort this screen is nearly empty, which is the point of it.
/programme/drift
Desktop capture
1440 × 900
Mobile capture
390 × 844
The pair's space
Goals, cadence, check-in history. Deliberately small — every mentoring product that grew a chat feature got worse.
/programme/pair
Desktop capture
1440 × 900
Mobile capture
390 × 844
The cohort
On cadence, goals progressed, pairs flagged. The numbers a funder asks about, off an append-only record.
/programme
Desktop capture
1440 × 900
Mobile capture
390 × 844
What it does
Four-question sign-up
A long form produces lies, and a lie about availability produces a pairing that cannot meet.
Matching across the cohort
Solved globally, so the last few mentees are not left with whoever is spare.
Proposals, with reasoning
Every proposed pair carries why, on the row. A lead judges the whole system on one surprising pair in about two seconds.
Overrides that stick
The lead moves people, and the reasoning is replaced rather than left saying something stale.
The drift board
Pairs that have gone quiet, surfaced early enough that a quiet word still fixes it.
The funder's report
A PDF of what the programme did, off an append-only progress record you can actually evidence.
Who reaches for it, and when
A programme lead in week one
Runs the matching over ninety sign-ups, overrides four pairs they know better about, and publishes — which is what sends the introductions.
A pair in week six
Has one small shared space: their goals, their cadence, and the record of the check-ins they have actually done.
The lead in week nine
Opens the drift board, finds six pairs gone quiet out of ninety, and has a conversation instead of a post-mortem.
What makes this one different
Matching is global, never greedy
A greedy pass gives the best mentors to whoever it happens to consider first and leaves the last few mentees with nothing — which is exactly the outcome that makes a programme feel arbitrary to the people it failed.
The topic list is closed
Free text feels generous and destroys the matching: "presenting" and "public speaking" would never overlap, and overlap is the entire thesis.
A missed check-in still schedules the next one
A pair that missed one needs the prompt more, not less. Answering "no, we did not meet" is a useful answer and the copy says so — it is the signal the drift board runs on.
Nothing here is public
Unlike every other demo in this portfolio, this app has no public surface at all. It holds people's stated goals and a list of who is struggling, so a mentee cannot read another mentee's goals, dissolve reasons are private to the lead, and milestones are private to whoever earned them.
Built with
What each piece is doing here — the people who read this section are usually the ones who would have to maintain it after us.
Next.js 16
The application framework. Pages render on the server by default.
TypeScript
Strict mode everywhere. A field renamed in one place fails to compile in the others.
Supabase
Postgres, authentication, file storage and realtime in one managed service.
PostgreSQL
The database. Constraints and permissions live here, not in the interface.
Row-level security
Who can read which row is decided by Postgres. A UI bug cannot leak data.
Resend
Transactional email — invitations, reminders and sign-in links.
React PDF
Documents generated on the server, identical every time they are made.
Magic-link sign-in
An emailed link instead of a password nobody can remember.
Want something like Mentor?
It does not have to be your industry — the underlying problem is nearly always the same. Tell us how the work moves through your business and we will tell you what it would take.
Every project is quoted on its own. Turnaround starts at two weeks.