PolyBall
Tap Free to play Android · browser · desktop No sign-up Version 0.10.8
PolyBall

Every note you hear, you played.

Catch the ball on its colour and the music builds, one note at a time. One miss ends the run.

Also on Windows, Mac and Linux, and on itch.io. Nothing to install to try it.

Made by one person. Every note synthesised at runtime, 15 languages, six build targets from one CI run. How it's built →

A Classic run in PolyBall on a phone: score 6, a cyan ball falling toward a five-sided ring with its colours around the edge.

The game itself runs in the browser, sound on. Open it full screen.


The sound

You are the band

PolyBall ships with no music files at all. Every sound you hear came from how you played.

Every catch is a note

Land the ball on its colour and you hear it. That was you.

Keep your streak and the band joins in

First the bass. Then the harmony. Hit Fever and the whole thing takes off.

One miss and it all stops

Silence. Then you tap play again, because that song was getting good.

Chord AmStreak 0

  1. Bass at 2
  2. Arpeggio at 5
  3. Lead at 8
Play it here, sound on. Each colour is a note of the chord underneath, so one key plays a different note as the chords go round. Keep tapping and the bass, then the arpeggio, then the lead come in, at the same streaks as in the game. Stop for two beats and it all stops, which is what a miss does. The chords, tempo and gates are copied from the game's source.

Trailer

See it in thirty seconds

A quick look

Five screens, before you press play

A run in progress with a growing streak
Catch, catch, catch. The streak builds.
Fever mode with the screen washed in gold
Fever, when the whole screen turns gold
The home screen
Three sides, or sixty-three
The shop with balls, trails and plates
Spend what you earned
Opening a mystery box
Boxes show you what's inside before you pay

Modes

Five ways to play

Classic

The pure loop. Endless, and it only gets faster.

Remix

Classic, plus a new twist every ten catches. Each stage ends on a boss ball.

Music

Perform the song. Balls land on the beat.

Time

Beat the clock. Clean catches buy back seconds.

Zen

No clock, no score, and no way to lose.

Leaderboard

Who's on top

The best Classic runs on five sides, live from the game. Beat one and your name goes up here.

Get it

Play anywhere. It's free.

Android is the best way to play, and the browser build needs nothing at all. Desktop builds are version 0.10.8.

iPhone and iPad are coming later. The browser version works there today.

How it's built

One person, six platforms, no music files

The engineering, for anyone who wants to look. Nothing below is rounded in my favour.

The game plays every note itself

No audio files ship with PolyBall. There is a synthesiser instead: sixteen additive voices with physically modelled partials, colour mapped to chord degree across an eight-bar progression, and bass, arpeggio and lead performed note by note on a swung grid. That is why the soundtrack can only be the run you just played.

One person cannot test six platforms by hand

So nobody does. Continuous integration builds macOS, the iOS simulator, an iOS device, Linux, Web and Windows from one run, and gameplay bots play twenty-four runs a pass with deliberate mistakes injected, so the economy numbers that come out the other end look like a real player's rather than a perfect one's.

The difficulty curve came from real thumbs

Opt-in telemetry records each move as a line of JSON under an anonymous rotating install id, partial runs included. That data re-derived the curve as a reaction budget instead of a guess, which removed the deaths that were caused by an impossible deadline rather than a mistake, all the way from three sides up to sixty-three.

It plays in Arabic the way Arabic reads

Fifteen locales, including Modern Standard and Egyptian Arabic, with right-to-left layout and bidirectional share text both covered by automated tests rather than a spot check before release.

The browser build was silent on every phone

And nobody had noticed. Creating an audio bus at runtime disconnects the master bus from the speakers on the web export, which is an engine bug, not a game one. The fix was to stop creating buses after boot. On top of that, iOS mutes web audio when the physical ringer switch is off, so the shell now nudges the context back awake. Both were found by a check that measures the real signal reaching the output, because counting buffers had said everything was fine.

  • Godot 4
  • GDScript
  • GitHub Actions
  • Supabase
Where the closed test is open to players today.
178countriesGoogle Play
Dead payload cut out of every export.
−32MBCV · PolyBall
Fonts in every export, after static subsetting.
40 MBdown to1.5MBCV · PolyBall

Fair play

What the game does with your data

Free, and fair
Ads sit between runs, never during one. Nothing you buy changes your rank.
Plays offline
No wifi needed to play. The leaderboard catches up when you are back online.
No account
Pick a name or keep the one the game gives you. No sign-up, no email.
Your data
Privacy policy · Delete my data · Press kit