Inspiration

Sedentary behavior (not just lack of exercise) is linked to a roughly 20-30% higher risk of all-cause mortality compared to low-sedentary-time individuals, independent of exercise levels. Hours pass with zero built-in reason to move. Gym breaks require planning, motivation, and equipment most people don't have sitting at their desk.

We didn't want to build "another workout app" that nobody opens. We wanted a real, physical break that people would choose to take because it's fun. So we asked: what if the whole game was driven by your body, and what if two people could compete against each other? One player runs the course with their body — jumping, ducking, dodging, shielding. The other builds the obstacle course in real time, with hand gestures, actively trying to trip up their opponent. Two minutes later, you've moved and you didn't have to talk yourself into it.

What it does

RunRivals is a real-time, two-machine, motion-controlled endless runner:

  • Player A (the runner) stands in front of a webcam. Stepping left/right/center changes lanes. A quick jump or duck avoids obstacles at the right height. Raising both hands into a guard pose activates a shield when enough coins are accumulated.
  • Player B (the obstacle placer), on a second laptop, uses hand gestures over their own webcam to grab and drop obstacles: high beams, ground hurdles, chest-height barriers, into whichever lane they choose, live, in real time, trying to catch Player A off guard.
  • The two laptops talk over a local WebSocket connection. Player A's game renders in real 3D with a full skybox, skyline, coin collectibles, and a shield mechanic.

No equipment, no gym clothes, no leaving your desk. Just clear a small space in front of your webcam and go.

Who this helps

Anyone sitting for long stretches such as remote workers, students, or hackathon participants pulling an all-nighter. It doesn't replace a real workout, but it closes the gap: the difference between zero movement during a workday and two minutes of it. The two-player format also makes it a natural office or study-group activity where people will want to do things with each other.

How we built it

  • Computer vision: MediaPipe Pose Landmarker + Hand Landmarker (Google's on-device pose/hand tracking), run via OpenCV camera capture on both machines.
  • Jump/duck detection: We track the player's hip position relative to a self-calibrating baseline, normalized by their own torso length, so detection sensitivity auto-adjusts to how far someone stands from the camera.
  • Player B's gestures: a "grab zone" strip at the top of the frame (close your fist to grab a generic object) and three "drop zones" below (release location decides the obstacle type).
  • Networking: a lightweight asyncio WebSocket server on Player A's machine, a reconnecting WebSocket client on Player B's, exchanging small JSON messages.
  • Game engine: Ursina (built on Panda3D) for 3D rendering with a chase-cam down a 3-lane track, with all obstacles and the player rig built at runtime.
  • Threading model: a single thread-safe GameState object is where the camera thread, the network thread, and the render thread all read/write through,so the render loop never has to know whether an input came from a local camera or a network message

Challenges we ran into

  • Calibrating jump/duck detection was harder than it looked. Early thresholds were either too strict (missed real jumps) or too loose (false-triggered on normal running motion). We ended up recording dedicated calibration sessions to set thresholds empirically.
  • A first-frame bug: the detector's "standing baseline" was captured from the first camera frame processed. If that frame caught someone mid-motion or before they'd settled, every future jump/duck measurement was wrong for the rest of the session. Fixed with a short warmup window that converges the baseline before detection turns on.
  • Distinguishing intentional gestures from incidental motion, especially on Player B's side. A fist closing for a grab had to never be confused with the resting hand position.

Accomplishments that we're proud of

  • A fully working two-machine, gesture-driven multiplayer game with zero physical controllers.
  • Jump/duck detection backed by actual recorded data.
  • Real 3D rendering built from procedural geometry.
  • Turning "get up and move" — advice everyone already knows and almost nobody follows — into something people actually want to do.

What we learned

  • How to design and tune a real-time computer-vision gesture classifier from scratch.
  • How to architect a thread-safe shared-state system so a camera thread, a network thread, and a render loop can all cooperate.
  • Practical WebSocket networking patterns: fire-and-forget messaging, auto-reconnect with backoff, and message-shape routing.

What's next

  • Reaction-time tracking: turning this into a measured reflex-training tool, not just a game.
  • Packaging this as an accessible fitness/rehab tool — the same signal that detects a jump is a range-of-motion measurement, which opens the door to workplace movement-break programs or light physical-therapy tracking.
  • More obstacle types and a combo/streak scoring system.
  • A "how it works" spectator view showing both players' live skeleton tracking side by side with the game, so the tech is visible, not just the gameplay.

Built With

Share this project:

Updates