Inspiration

Code review is boring. You sit there. You read diffs. You type "LGTM" and hit approve like some kind of corporate robot. Meanwhile, that one PR from three weeks ago is still sitting there, rotting, haunting the repo like a ghost nobody wants to deal with. We thought: what if you had to FIGHT it? Like, physically aim your phone at a table and engage in Pokemon-style combat with a pull request? Nobody asked for this. We built it anyway.
## What it does

PR-mon GO turns your team's actual GitHub pull requests into catchable AR creatures. You hold up your phone, wild PR-mons spawn on your desk, your floor, your coworker's lunch — and you have to battle them to merge them. The stats come from the real PR: more lines of code = more HP, more files changed = higher defense, been open for 3 weeks = it's leveled up while you were ignoring it. Bug fixes are Fire type. Drafts are Water type. Merge conflicts are Ghost type because of course they are.

Your moves include LGTM (basic attack), NITPICK (which literally posts a nitpick comment on the actual PR — your coworkers will hate you), REQUEST CHANGES (big damage but it gets mad), and FORCE PUSH (99 damage to the enemy, 50 to yourself, as god
intended).

Win the battle and the PR gets approved and merged. On GitHub. For real. Through the API. We are not sorry.

How we built it

  • WebXR for AR because we wanted to ruin code review on as many devices as possible
  • Three.js to render 3D pull request logos floating over your desk like tiny code poltergeists
  • Express backend that converts PR metadata into creature stats (a 2000-line PR is basically a raid boss)
  • React frontend wearing a Game Boy costume. Scanlines and everything
  • GitHub API integration so winning a fake Pokemon battle has real consequences on your codebase
  • Pokemon battle music that loops. If you take too long the song restarts. You deserve this
  • A sound effect when you tap a PR-mon that we can only describe as "fahhh"
    ## Challenges we ran into

WebXR only works on Android Chrome so we had to build like three fallback modes for everyone else. Getting a Three.js mesh to behave inside an A-Frame entity was like trying to put a cat in a bathtub. Balancing combat so a one-line typo fix isn't as hard to kill as a 50-file architectural rewrite took way more playtesting than any of us want to admit. Also we accidentally merged a real PR during a demo and had to explain to our team why the deployment pipeline just ran. ## Accomplishments that we're proud of

We made a system where you literally cannot merge code without winning a turn-based RPG battle. A Ghost-type PR-mon with merge conflicts can stun you so you skip a turn, which is the most realistic simulation of merge conflicts we've ever seen. The NITPICK move posting a real comment on GitHub is the funniest thing we've ever shipped. The "fahhh" sound plays every single time you tap anything and it has not gotten old. ## What we learned

WebXR hit-testing is shockingly good at finding flat surfaces. Balancing a game around real-world data is way harder than making up numbers. If you play Pokemon battle music on loop during standup, people approve PRs 300% faster (not a real stat but it feels true). And most importantly: any sufficiently stupid idea, built with enough commitment, becomes indistinguishable from a real product.

What's next for PR-mon GO

  • Multiplayer — two reviewers battle the same PR-mon at once, whoever lands the final hit gets to be the approver
  • Evolution — PRs that get force-pushed evolve into stronger, angrier forms
  • Gym leaders — repo maintainers become gym leaders, you can't merge to main until you beat them
  • Pokedex — a hall of fame for every PR you've merged through combat
  • Slack bot — "@channel a wild PR-mon has appeared in the frontend repo" at 9am every Monday to maximize chaos

Built With

Share this project:

Updates