← Back to projects

Case study

GTA RP Minigame Recreation

The button-mash ATM robbery from NoPixel, rebuilt from Twitch clips

Without real numbers from NoPixel, you can't make a perfect copy. So I measured it from streamer clips, tested it on my own hands, and let the community fill in the rest.

Role: Design + Direction, with Claude doing the analysis and code · September 2026 · Shipped

Mash E to fill the ring and clear three checkpoints before the timer runs out. The ring pushes back harder the fuller it gets. Your run is drawn over the streamers' when you finish.

The ATM Hack screen: a glowing cyan ring about two-thirds full of white, a white key cap marked E at its centre, and three dashes underneath — two lit cyan for cleared checkpoints, the third still grey. Play on itch.io

Fan-made, unaffiliated with NoPixel, and free — I make nothing from it.

Open on itch.io

Overview

I enjoy a very niche form of entertainment: GTA RP on NoPixel 5.0, a custom Grand Theft Auto V server where people role-play as characters and most of them livestream it. The server is full of little minigames and puzzles, called hacks. One of them is a plain button masher, and it's more interesting than it sounds — I watched a streamer named Blau fail it and wanted to try it myself. NoPixel 5.0 isn't open to most people, so I spent a few hours with Claude recreating the hack as closely as we could, put it on itch.io, and posted it to the NoPixel subreddit for the community to play.

The problem

I have no numbers from the people who built the original. No press value, no push-back rate, no checkpoint thresholds. Everything I could learn about how the hack behaves had to come from watching other people play it on stream, which is a recording of the output, not the rules that produced it.

Building a button masher takes an afternoon. But how do we make it feel like the real game?

Role

A solo project built over about a day. I broke down the hack's mechanics from streamer clips, worked with Claude to measure and calibrate the difficulty, and set up a way to keep tuning it with data from the community. The split that made it work: Claude did the frame-by-frame analysis and wrote the code, and I brought the things it couldn't — knowing the game, knowing when a result looked wrong, and being the test subject.

Approach

Design

The UI stays close to the real one, which was less work than it sounds: NoPixel's font is Barlow, a Google Font, and the hack itself is a ring, a key cap, and three checkpoint dashes. Getting those proportions right matters more than any effect — it's the thing people recognise from stream.

The game's side panel, headed FAN-MADE HACK TRAINER above the title ATM HACK. It explains: mash E to fill the ring and clear three checkpoints before time runs out, the ring pushes back harder the fuller it gets, every checkpoint is tougher than the last, and your run is compared against streamers who passed and failed it on stream. Below, a FASTEST CLEARS · V1 heading reads “No clears yet. Be the first.”
Game instructions

After each run, the game compares it to the streamer runs we studied.

View full-size: The ATM Hack results screen after Matt's 35.9-second clear. A Cleared badge and the title Hack complete: 35.9 s sit above the line: 7.6 presses per second overall, closest streamer run Garek. A chart plots progress from 0 to CP3 over 50 seconds, with Matt's white line among colored lines for xQc, Fuslie, Garek, Lysium and Valkyrae, finishing just after Garek's. Below, a table lists Matt's checkpoint times of 5.9, 10.9 and 19.1 seconds at 8.2, 7.1 and 7.7 presses per second next to each streamer's times, then Run it again and Close buttons.
The results screen after my 35.9-second clear, plotted against the streamers’ runs.

Engineering

Watched the ring

I pulled clips of seven attempts — five clears and two fails — and had Claude track how full the ring was in every frame. The pattern came out clearly. Each press adds a small chunk, the ring slides back constantly, and the slide-back gets stronger both as the ring fills and with each checkpoint passed.

View full-size: Line chart of progress over time for seven streamer clips, from 0 to CP3 across 120 seconds. Solid lines for xQc, Fuslie, Garek, Lysium and Valkyrae climb to CP3 between about 14 and 46 seconds, xQc steepest. Dashed lines for Blau and an unknown streamer climb to just under CP3, then run nearly flat for over a minute, labeled: both fails stall short of CP3 for over a minute. A legend on the right marks both as timed out.
Seven clips. The two dashed lines that flatten out near the top are the fails.

That chart settles what failing actually is. Neither fail was slow: both reached the last ring quickly, then sat at 70–90% of it for more than a minute and a half while the timer ran out. I hypothesized that to beat the last checkpoint, the player must reach a specific speed.

View full-size: Grouped bar chart of time per checkpoint for seven streamers, CP1 to CP3 in three shades of cyan. xQc 3.6, 4.7, 5.5 seconds; Fuslie 6.4, 5.4, 8.9; Garek 6.4, 8.6, 18.2; Lysium 7.8, 11.9, 19.6; Valkyrae 7.7, 12.9, 25.0; Blau 8.6, 11.6; unknown streamer 6.0, 9.5. Blau's and the unknown streamer's CP3 bars are red hatched outlines reaching the top of the chart, labeled stalled ~100 s and stalled ~86 s.
The same seven runs as numbers. Each checkpoint costs more than the one before it, for almost everyone.

Listened to the keyboards

Knowing how fast the ring moved wasn't enough on its own — I needed to know how fast the person was pressing to move it that much. So Claude detected keyboard clicks in the stream audio, starting from the loud stretches I'd flagged, and matched them against the ring's speed at the same moment. The first model it produced had streamers holding 12–15 presses a second for over a minute. I can get about 9 presses per second.

Tested it on myself

Rather than argue with the model, I became the control group. I tested out the game and recorded audio of my own keyboard while playing it. Lining the two up explained everything: my keyboard makes two clicks per press, one on the way down and one on the way back up, about 51 ms apart. My speed test had 87 presses in it, and the detector heard 177 clicks. The streamers' audio had the same double-click signature, which meant the first estimate of their speed was roughly twice the real number.

View full-size: Two stacked timelines covering about 0.6 seconds of Matt's 10-second speed test. The top row shows five white tick marks, one for each key press the game logged. Below it, a spectrogram of the microphone recording shows ten bright vertical streaks, in pairs. A dashed line drops from each logged press onto the first streak of its pair, and a second streak follows about 50 milliseconds later. One pair is labeled DOWN and UP with an arrow marking a gap of about 51 milliseconds. A footer reads: Full 10-second test, 87 presses logged, 177 clicks heard, median gap 51 ms.
Each press made two clicks, one on the way down and one on the way up, so counting clicks in stream audio doubled every speed I measured.

Key decisions & tradeoffs

Model the push-back, not a timer
A “press X times in Y seconds” rule would have been far easier to build and to tune, but it can't produce the stall the two fails show — under a timer you either make it or you're late, and nobody sits at 85% for ninety seconds. The catch is that video alone can't separate push-back that grows with fill from each press being worth less as the ring fills. Both fit the curves. I went with the one that matches the push-back you can see on screen.
Share with the Reddit community
I launched on itch.io and posted it to the NoPixel subreddit. The fanbase is dedicated enough that I was fairly confident of finding people who'd try it.
Check for cheating
The server replays each submitted run under the official settings, so faked times and 200-press-per-second autoclickers bounce off.

Outcome

The game is launched, and the Reddit post was successful!

The post brought in 626 verified runs from 249 players overnight, 339 of them in a single two-hour burst, and they are still coming in. 90% of those runs cleared, and 84% of players cleared on their first try — the same range as the streamers, where 5 of 7 passed. That is the shape I wanted: most people get through it, and the last ring is where it turns frustrating.

View full-size: The game's Everyone's attempts panel for v1: three tiles reading 566 attempts, 508 cleared in cyan, and 58 timed out in red, above a bar about nine-tenths cyan and one-tenth red, and the line: 90% of attempts clear the hack.
Everyone’s attempts as of September 19, 2026: 566 verified runs, 90% cleared.

The server caught 60 autoclicker runs on top of those, none of them in the count above. The one that slipped under the speed limit gets fixed in v1.1. The real gap is the feedback I most wanted: only 40 “how did it compare” ratings from people who've played the actual hack, most of them on mouse or phone rather than a keyboard. I want considerably more of those before I touch the difficulty for v2.

Reflection

I'm happy with how this turned out, and mostly with how fast it went. It showed me how much is possible in a day when the work is split along the right seam: Claude does the heavy analysis and writes the code, and I bring what it can't — knowing the game, noticing when an output looks wrong, and being the test subject when the only way to settle a disagreement is to record my own hands.

The best part was watching the Google Sheet fill up as people from the community played it.