-
-
The stack: from your Joy-Con arm to the Cotton Bowl
-
The Cotton Bowl at night, packed crowd and the Freetail Hackers mosaic
-
Game day: smoke tunnel run-out before kickoff
-
Your real arm: the ball flies on the arc and spiral of your throw
-
Sacked: hold it too long and the pass rush gets home
-
Touchdown: every score gets its own celebration
-
Red River: Texas vs Oklahoma, four full quarters
-
Final seconds: fourth down, clock running, go win it
-
Play of the game: your best play, replayed after the whistle
-
Scan it: the replay goes to your phone as a GIF
-
1v1 mode: two Joy-Cons, swap QBs every drive
-
The throw: one real throw, four grades
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

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
- You call it. Pick from about 14 plays with real routes. The defense shows man or zone and sometimes blitzes.
- 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.
- 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.
- 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.

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.__rrexposes 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
- amazon-web-services
- electron
- nintendo-switch
- three.js
- typescript
- vite
- web-audio-api
- webhid


Log in or sign up for Devpost to join the conversation.