What the Hill: we built a machine that reads your poker face, and won
At Hack the Hill III my team built a booth game that asks you to bet on your own poker face, then checks. It won MLH Best Use of Tiger Data, and strangers kept coming back for rematches.

Hack the Hill III ran for a weekend at the University of Ottawa: 350+ students, nearly 100 projects. My team (Muhammad Maisam, Naima Mamun, Anosh Rabbani and me) spent 36 hours of it building What the Hill, and it won MLH Best Use of Tiger Data.
The pitch fits in one line: you put a number on your poker face, and a camera checks it while you answer one hard interview question.
How a round works
You sit down at the booth and type a name. Then you turn a physical dial from 0 to 100 for how unreadable you think you are going to look, and press a button to lock it in. That number is your claim.
The camera starts. A voice asks you one interview question, out loud and on the screen, and you answer it on camera. While the question is up, Presage reads your face and averages how neutral it looked into a composure score, also 0 to 100.
Then the reveal. The gap is how far your claim was from your composure. Your score is 100 minus the gap, and the narrator reads out a verdict. A gap of 10 or less is "validated". Past 45 is "delulu".
My own round. I claimed 68. My face scored 0.
That screen is my own round. I claimed 68 and my face scored 0. The narrator called it 68 points of pure aura loss, which was fair.
There are three rounds. Reflex is a backup that just times the button after a cue, for when the camera can't be used. Poker Face is the demo: one question, about six seconds. Straight Face Under Pressure keeps the questions coming for up to twenty seconds.
What I built
My part was the Python game loop that ties the booth together, and the leaderboard.
- The dial and the button. An Arduino Uno reads a potentiometer for the claim and a button for the lock, and sends both over serial. The game loop reads that port, so the physical dial drives what happens on screen.
- The camera. OpenCV finds the face in the webcam feed. Presage's SmartSpectra reads expressions from those frames, and the loop turns its samples into the composure number for the window the question is on screen.
- The voice. ElevenLabs speaks the question and the verdict. If the voice fails, the screen says so instead of hanging.
- The leaderboard. Every scored round lands in SQLite, which is the log the game itself runs on, and is copied to Tiger Data. The board keeps each player's best gap, worst gap, rounds played and average score. Over the weekend it tracked 50+ players.
Python also serves the React front end, so the whole booth is one process on
one laptop. A --mock flag fakes the dial and the camera, which let us build
and demo the flow before the hardware was wired up.
Being honest about what it measures
It would have been easy to dress this up as a lie detector. We didn't, and the README says so plainly. Composure is how neutral your face looked, nothing more. It doesn't read stress, honesty or interview skill, and a blank face and a calm face can both look neutral. It isn't a coach or a way to identify anyone.
What it does show, live, is that your face leaks signals you don't control and can't predict. That turned out to be the fun part. People were confident, then watched the gap come back huge.
The best moment
The best compliment all weekend came from a stranger who sat down, lost badly, and immediately asked for a rematch. That is the whole product working: a number you were sure about, a camera that disagreed, and a reason to try again.
What I took from it
- Build the fallback first. The mock mode and the Reflex round meant we always had something to demo, even when a camera or an API key wasn't cooperating.
- Hardware makes a demo. A dial you physically turn gets people to sit down in a way a slider on a screen never does.
- Say what it isn't. Being upfront about the limits made the game more trusted, and funnier, not less.
Thanks to Major League Hacking, Hack the Hill III and the Capital Technology Network, the sponsors CGI and Ciena, and my team.
The code is on GitHub.