Study/project compatibility board

A board where ANU students post a short card (name, contact, course code, a one-line idea, a few topic tags and the weekly time blocks they’re free) and see, under every card, the other people they’re actually compatible with, ranked by score rather than dumped in one long list. It’s for the moment every group-project course has, when you need a partner or a study group and the only tools are a course forum thread or a Discord channel where posts scroll away and nobody can tell who overlaps with whom.

On “ANU system”: the brief points at systems like enrolment, timetabling or room booking. This board models a different slice of university life: the informal, unofficial part of forming groups around a course. That’s a deliberate stretch of the framing, not an accident. Group formation is a real process every student goes through each semester, and it has no official system at all, which is exactly the gap this fills.

What good looks like here

Good means the ranking is something you could check by hand. A match is only worth showing if you can say why two people match, so matching is a small, explicit formula over structured data, not a vibe:

score(A, B) = 100 × |tags(A) ∩ tags(B)| / |tags(A) ∪ tags(B)|
            +  10 × |blocks(A) ∩ blocks(B)|

That formula is why the data looks the way it does. Tags come from a fixed set of eight (web, mobile, ml-data, systems-infra, game-dev, hardware-iot, theory-math, other) and availability from sixteen blocks (weekday × morning/afternoon/evening, plus weekend). Both are checkboxes, never free text, because free text would split the very overlap the score depends on (“ML” vs “machine learning” would never match). Course codes are free text, since ANU has too many to list, but they’re normalised (comp 4020 → COMP4020). They’re only shown, never scored. The idea line is for a human reader only and never scored either. The full design, including a worked four-card example, is in PLAN-matching.md.

The board is seeded with eight sample cards on first boot, so a first visit shows real matches instead of an empty page.

Deliberately not built

What’s enforced vs. what’s judgement

Enforced by spec/ on every pnpm check, against the built server:

Judgement calls, which the tests don’t pin down: