Mainly going for Best Overall 🙏🙏🙏 Don't wanna get side lined for Best Game 😿😿😿

📖 DeepWiki (full code walkthrough): https://deepwiki.com/AlanRoybal/Hacktx26

🐙 Code: https://github.com/AlanRoybal/Hacktx26

📱 Clip site: https://hacktx26.alanroybal.com

🧑‍💻 Solo hacker: I built this on my own and made all the assets myself.


First Person QB: you're under center at the Cotton Bowl, and the throw is your real arm

From your arm to the Cotton Bowl

The challenge and who it's for

Every football fan has yelled at a QB through the TV. Football games never let you prove it: you press A and a stat line decides whether the ball gets there. The throw, the part everyone thinks they could do better, is a button.

First Person QB is for anyone who has ever said "I could've made that throw." You stand at a table with a Nintendo Joy-Con, line up under center for Texas against Oklahoma at night in the Cotton Bowl, and throw the ball by throwing. No gamepad skills, no tutorial screen. If you've thrown a football, you already know the controls.

How it plays

  1. You call it. Pick from about 14 plays with real routes. The defense shows man or zone and sometimes blitzes.
  2. You feel it. Hold ZR to snap. The pocket collapses in front of you while linemen swim, spin and bull rush. Late in close games, in the red zone or on 4th down, your vision narrows, a heartbeat comes up and the Joy-Con pulses in your hand.
  3. You throw it. Hold ZR, make a throwing motion and let go at the top. The ball flies on the arc, speed and spiral of your actual arm. Hold it too long and you get sacked. Push the stick forward to scramble and throw on the run.
  4. You keep it. After the final whistle the game replays your best play, turns it into a GIF, and puts a QR code on the screen. Scan it and the clip is on your phone.

One real throw, four grades

Why it has to be motion (and where it doesn't)

The throw is the whole game, so it can't be faked. We read the Joy-Con's IMU over WebHID in full-report mode (~66 Hz) straight into the renderer, with no driver, no server and no network in the loop. While ZR is held the detector buffers every sample; on release it reads four things from your motion:

  • Arm speed → ball velocity. A short flick floats a soft pass; a full arm fires a rope.
  • Release angle → arc. The Joy-Con's pitch at the moment you let go.
  • Clean rotation → spiral. Gyro energy off the main axis is wobble, and a wobbly ball (over 0.35) loses 15% of its speed.
  • Timing → release grade. How close your release was to the peak of your motion.

Each throw shows its speed, launch angle, spiral grade and release grade. Aim help pulls toward the receiver you were throwing at, and how much depends on difficulty: Freshman, Starter or Heisman.

Where motion isn't the answer we didn't force it: the stick moves you in the pocket and picks plays, and everything also works with a mouse and keyboard, so the game never stalls if a Joy-Con dies at the table.

Why it's original

Motion football games exist, but they map a wave of the controller to a pass button. First Person QB is built the other way around: the throw is physics from your arm, and the game is built around that moment.

  • First person, under center. You see what a QB sees: helmets, a collapsing pocket, a receiver breaking open for half a second.
  • Game day, not a practice field. An aerial intro, the smoke tunnel run-out, Big Tex waving from the State Fair, fireworks, a packed crowd, cheerleaders, the Freetail Hackers card mosaic and real radio and TV calls from Red River games.
  • A full game. Four 2:00 quarters from a 0-0 kickoff, sacks, fumbles, picks, false starts, timeouts and spikes. In 1v1 two players swap QBs and teams every drive, each with their own Joy-Con.
  • You leave with it. The play of the game ends up on your phone through a QR code, with no app and no login.

Tools, harnesses, and models

Product stack

Layer What Why it mattered
Runtime Electron + Vite + TypeScript One full-screen app for the judging table, with WebHID available in the renderer.
Input Hand-written WebHID Joy-Con driver (src/input/joycon.ts) IMU, stick calibration per controller, rumble patterns and battery, with no native code.
Game State machine in src/game/ Plays, routes, coverages, pass rush, clock, 1v1 and difficulty.
Render Three.js (src/render/) Stadium, players, crowd, cheerleaders, Big Tex, jumbotron and every camera.
Audio Web Audio bus Crowd beds that react to the play, real broadcast calls, team songs, cannons.
Sharing GIF encoder → Electron IPC → AWS S3 + CloudFront The replay becomes a GIF and a QR to hacktx26.alanroybal.com.

Harnesses

  • window.__rr exposes the running game, so scripts can stage plays, force states and fire throws over Chrome DevTools Protocol. We used it to test sacks, touchdowns and 1v1 swaps without playing every snap.
  • Debug overlay (D) shows live throw stats and the throw detector's state on the real Joy-Cons.
  • tools/audio/ keeps the source and timestamp of every announcer clip, with loudness normalized across all of them.

Build-process tools

  • Devin built and iterated the game from table feedback, and recorded the ad by driving the running game over CDP with custom camera angles.
  • DeepWiki (link at top) documents the codebase.

What's real today, what's next

Everything in the ad and the gallery is captured from the game running on a Mac. Next: a live latency readout on screen, a defense controller for the second player in 1v1, and extra point and 2-point tries.

Built With

Share this project:

Updates

Submission history