Inspiration

Reflex games are easy to make and easy to make dishonest.

The same three things kept putting us off them. A difficulty spike arrives with no warning and ends a good run — not because you were slow, but because the game never told you what was coming. You lose and it says too slow, which explains nothing. And the leaderboard turns out to be a list of who was willing to pay.

What made us build this was noticing how differently those losses felt. Losing to something we didn't see coming made us put the phone down. Losing to our own slow thumb made us go again immediately. The difference wasn't difficulty — it was whether the game had been straight with us.

So we set a harder constraint: you can always see it coming, you always know exactly why you lost, and nobody can buy a better score.

What it does

A ticker sweeps around a column of coloured blocks. Tap the instant it meets the matching colour. Hit the middle of the zone and it's a Perfect.

That's the whole game, for about twenty seconds. Then it starts adding things — more colours, shuffles, reversals, narrowing zones, blank segments that end your run, bonus colours that pay. And here is the rule the game never breaks: each one is announced on screen before it can hurt you. BLANK RISK appears, and then the blank arrives. You get told, then it happens. Always in that order.

Every miss is measured. Not "too slow" — the result screen says 0.32 s EARLY, to the hundredth of a second. That one number changed how our playtests felt more than anything else we added. Knowing you were three hundredths early is a reason to go again.

You cannot buy a higher score. One revive per run — and whether you paid for it or watched an ad for it, the run is marked Assisted and kept out of your best. Perfect taps fill the Fever meter but don't award extra points. The leaderboard measures reflex and nothing else.

Classic is endless and ends on one mistake. Blitz gives you three minutes, where a miss costs seconds instead of the run. Nineteen languages, picked on first launch, real right-to-left, and it works offline.

How we built it

Flutter and Flame, with the rules in the engine rather than the screens. There is no path through the game that applies a hazard without announcing it first, because announcing it is part of how a hazard is defined.

Scoring is deliberately boring. One point per good tap. Fever changes how the game feels, never what it pays. That's less work than a scoring system you'd have to keep auditing for pay-to-win, because there's nothing to audit.

Monetisation runs entirely on RevenueCat, with no server of our own. One thing to buy: a lifetime unlock that removes ads and makes your revive instant. Not a subscription — a one-time unlock is a far easier ask in the markets we launched into, and it's priced for each of them rather than converted from dollars: 4.99 USD · 199 INR · 199 BDT · 399 PKR.

No backend means RevenueCat is the only thing that knows who paid, and we leaned into that. No sign-up, no account. A returning player is recognised even offline, someone who reinstalls gets their purchase back automatically, and the paywall is hosted so price and wording change without an update. Ads pay for the free version — and a player who has paid never sees any of it.

Challenges we ran into

Staying readable through our own light show

PrismTap is neon, crystal and particles, with a Fever state that takes the arena over — and all of that competes with the one thing a player has to read: which colour is under the ticker, right now. We lost runs in our own playtests to our own effects. The rule we settled on is that anything decorative loses to anything informational: effects pulled back from the ticker, warnings placed where nothing bright ever sits, colours separated further than looks alone would need.

Hard, but never unfair

Announcing a hazard only works if the warning leaves enough time to react. Too short and it's decoration; too long and the tension drains out. There's no fixed answer either, because the game accelerates underneath it — a warning that's generous at the start is nothing at speed. Most of our playtesting went here, and whenever a loss felt cheap we treated it as a bug in the warning rather than a sign the player should be better.

Teaching one rule without a tutorial nobody reads

The game is one sentence long, which made it harder, not easier. A tutorial screen felt insulting; nothing at all and your first run is four confusing seconds. What we landed on is a first run that teaches by being slow — it holds your hand through the timing once, then never appears again.

Making Premium invisible, not just ad-free

Our first version hid the ads from paying players, and that wasn't enough: they were still shown an ad-consent prompt and ad requests were still made for them. The ads were hidden; everything around them still ran. Now nothing ad-related starts until the game knows whether this person paid — and for someone who has, none of it ever starts.

Nineteen languages inside a HUD

Less text than most apps, harder in one specific way: the words that matter are short, urgent, and sit in fixed spaces on a screen that's already busy. A two-word warning has to survive becoming a much longer word in German without spilling over the playfield or arriving too late to read, and right-to-left had to be a genuinely mirrored layout rather than a flipped English screen.

Pricing for where our players actually are

A single dollar price converts badly into the markets we launched into, and "one price for everyone" is only fair if everyone earns the same. So the lifetime unlock is priced for each market by hand rather than converted — the same reasoning as everything else here, where the version that's easier to build isn't the one we wanted to ship.

Accomplishments that we're proud of

Shipped complete on 25 September 2026 — not an English version with translations promised later.

First public release 25 September 2026
Languages at launch 19, with true right-to-left
Store listing Localised in 18 languages
Modes at launch Classic and Blitz
Monetisation One lifetime unlock, priced per market
Servers we run 0

The app is days old, so there's no traction to report yet, and we'd rather say that than dress up a number a judge can check.

  • We held the fairness rules when they cost us. The easy revenue was there the whole time — a booster, a multiplier, a revive that keeps your best. We shipped a paid tier that removes ads and makes your existing revive instant, and that is all it does.
  • "It tells you exactly why." The miss margin is the feature everyone who plays it mentions first.
  • Nothing here is a mockup. Every phone in the video is a real device, cut from one continuous recording.

What we learned

  • Players don't separate the game from everything around it. A run that ends for a reason they didn't see feels the same whether the cause was a hazard, the interface, or our own effects. Anything that can cost somebody a run is part of the game's fairness.
  • "Hidden" isn't "absent." Hiding something from a player who paid to remove it is not the same as not running it.
  • Design constraints make the work smaller. "You cannot buy a higher score" sounded like a feature with a spec. It deleted work — no multipliers to balance, no boosters to price, no leaderboard integrity problem waiting for us later. The honest choice was also the cheap one.
  • If a loss feels cheap, the game is wrong, not the player. Treating that feeling as a bug report was the most useful habit we picked up.

What's next for PrismTap: Color Tap Reflex

  • Colour-vision patterns — a distinct pattern per colour, so colour is never the only signal. Designed, and the next thing we ship.
  • Daily Challenge — built and seeded so everyone plays the same sequence on the same day; not reachable from the menu yet.
  • iOS — it builds and runs, and needs its store paperwork.
  • Leaderboards worth having. Now that assisted runs are structurally excluded, a global board actually means something. That was the point of the constraint all along.

Built With

Share this project:

Updates

Submission history