Sulaiman Shariff

hackathon

Murder Mystery

A competitive live-event game where an LLM reads your accusation and decides if you got it right.

Role
Engineer
When
2026
Built with
Next.js, TypeScript, Supabase, Gemini
Result
3cases, judged in natural language
Links
The suspects tab of a live case, listing six people at a hotel with a line each on their connection to the victim.
Case one, mid-investigation. Six suspects, each with the thread that ties them to a private lender found dead in room 314.

I built this for a campus event. Teams work through three cases, and instead of picking a suspect from a dropdown they write out who did it and why. A model reads that and decides whether they solved it.

The multiple-choice version is much easier to build and much less fun. Picking from four names is a guess with a 25% floor. Writing “it was the caterer, because the receipt puts him in the kitchen at the time the clock stopped” is the actual game, and the only way to grade it is to read it.

Grading free text at a live event

Judging by model is the interesting part and the risky part. Two teams giving the same answer in different words must score the same, or you have a room of students who are correctly annoyed with you.

So the judge does not score freely. It gets the case’s ground truth, the specific elements an accusation must contain, and a rubric, and returns a structured verdict against those elements rather than a general impression. Naming the right person for the wrong reason does not score the same as naming them for the right one.

The accusation dialog, with free-text fields for who did it and why, and a checklist of evidence.
The accusation, which is the whole argument for building it this way. Who and why are free text — 'a name, or how you'd describe them', 'in your own words'. The evidence checklist is what stops a good story from passing as a solved case.

The other constraint was latency. This runs in a room with people waiting, so a verdict has to come back in seconds. Gemini Flash Lite is fast enough for that, and the structured rubric means the small model is doing a checking job rather than an open-ended reasoning one.

Things a live event punishes

A game night is an unusually harsh test environment. Everyone arrives at once, so the sign-in path takes its entire load in about ninety seconds. Nobody reloads politely. And the leaderboard, which is most of the reason the room stays engaged, is wrong in front of forty people at once or not at all.

The build is Next.js with 17 API routes over Supabase, with row-level security so a team cannot read another team’s progress by changing an id, and Playwright tests covering the paths that would be embarrassing to break in front of an audience: sign-in, submitting an accusation, and the leaderboard ordering.

The game's landing screen, styled as a confidential case file with a sign-in form.
The way in. The case-file treatment is doing recruitment work rather than decoration: it tells a room full of students what kind of evening this is before they have read a word.

It is still live at murder-mystery-atria.vercel.app.