Inspiration

Every Imperial student picks modules from the same flat catalogue. So we choose by rumour and by what our friends pick, miss optional modules that would suit us (like I-Explore), and find timetable clashes only after choosing. And when exam results come back, we get a grade and nothing else: no idea which questions we lost marks on, or what that means for the modules we pick next. Module leads, meanwhile, never learn why their module is under-chosen. We wanted an advisor that knows the student, explains itself, refuses to bend the rules, and hands the hard cases to a person.

What it does

For students

  • A three-minute interview builds a profile of interests, goals and learning style. Every item keeps the student's own words as evidence.
  • A fit score from 0 to 100 for every module, with four sub-scores (interest, career goal, learning style, breadth), and every reason links back to a quote. Weight sliders re-rank instantly, with search and side-by-side compare.
  • A clash-free week: certain, likely and possible clashes are flagged. It suggests swaps that still follow the programme rules, plus a backup for modules near capacity. The plan exports to PDF and .ics.
  • Holds the line on rules. Asked for a module without its prerequisite, it explains the rule, offers alternatives and drafts a request to the Senior Tutor.
  • Exam feedback (opt-in). With explicit consent, a student shares their mark sheet. They get honest nudges ("you like fluids, but it is not where you scored highest") that never change their rankings, and question-by-question feedback with a revision plan once the examiner publishes. Withdrawing consent deletes every mark.

For staff

  • Senior Tutors approve or decline exceptions in one click; an approval waives only the rule that was broken.
  • Examiners write a feedback form or have the AI draft one from their marking notes. Nothing reaches students until they publish.
  • Module leads see demand, fit distributions and counterfactual insights counted in students ("9 of 19 interested students would reach fit 70"). Any group smaller than five is withheld.

How we built it

Numbers come from code, words come from models. Scores, eligibility, clashes, swaps, counterfactuals and nudges are deterministic, unit-tested TypeScript. The agents decide what to ask, call the engines as tools, and explain the results. No agent can change a number.

  • Twelve specialised Claude agents: Supervisor (a six-mode state machine), Interviewer, Profile Extractor, Matcher, Timetabler, Catalogue (tool loop), module knowledge, results reader, exam feedback, exam form drafter, Insights, and an offline Module Analyst.
  • Model tiers: Opus 5.5 for what students read, Sonnet 5.5 for extraction, Haiku 4.5 for fast classifiers, and Fable 5.1 as an independent judge in our evaluations.
  • Eight guardrails: scope, sensitive-data redaction, injection and wellbeing checks on input; schema, grounding, programme-rules and claims checks on output. Every verdict is traced and shown on the "How it works" page.
  • Adaption: we expanded a hand-reviewed seed of student answers into 150 varied ones, relabelled them, and stress-tested the Profile Extractor against them. That raised slot accuracy from 50% to 75% and showed exactly where the cheaper model invented details.
  • Figma: one design system (type scale, colour tokens, a shared Badge and PageHeader) across every student and staff screen.
  • Stack: React, Vite, Tailwind and Motion; Hono on Node with SQLite and Drizzle; zod contracts shared between client and server. Every agent has a deterministic offline path, so the whole product runs with no API key.

Challenges we ran into

  • Thinking ate the reply. Thinking tokens count towards the output limit, so short caps returned empty answers. We set a floor of 8,000 tokens and added template fallbacks.
  • Keeping models away from numbers. Insight rewrites are rejected if any number changes, and claims about grades or jobs are filtered.
  • Redacting without erasing people. "I have ADHD" must never be stored, but "...and I enjoy electronics" in the same sentence should be. Our redaction removes only the sensitive clause.
  • Serverless state. Each Vercel instance keeps its own SQLite, so sessions went missing under concurrent requests. We added client-side session restore and a single request queue.

Accomplishments that we're proud of

  • Live evaluation (judged by Fable 5.1): all 8 groups meet target, including module facts 12/12, guardrails 7/7, grounded explanations 5/5 and live extraction 46/47.
  • Offline evaluation: ranking 10/12 personas, extraction 47/47, hard cases 33/33, adversarial guardrails 23/23.
  • About 900 automated tests in CI, plus an automated end-to-end run of the whole demo in a real browser and axe accessibility checks with zero serious issues.
  • Privacy built in: grades typed in chat are never stored, marks only with consent, and staff never see a group smaller than five.

What we learned

  • Splitting numbers from words made the AI testable: every score is reproducible, so evaluations show exactly what changed.
  • A live evaluation with known answers found real prompt bugs in minutes that manual testing would have missed.
  • Building an offline path for every agent on day one made the tests fast and free.

What's next for ModuleMatch

  • Real examiner forms and transcripts for exam feedback, after a data protection review.
  • More programmes beyond MEng Mechanical Engineering, and real timetable data.
  • Aggregate student choices fed to timetabling before the timetable is fixed.

Built With

Share this project:

Updates

Submission history