All case studies
Flappy Cyber Copter — the gap you could not possibly reach
The flappy format earned its bad name honestly: most clones place gaps the player cannot get to. Bounding that is a generation constraint, and it costs nothing.
- Client
- In-house title
- Platform
- WebGL / browser
- Engine
- Unity
- Genre
- Arcade
Unity WebGLC#Brotli (.br) compressionApache
The challenge
The flappy format has a reputation that makes it harder to ship well, not easier. Everyone has played one, most people quit in frustration, and a large share of clones genuinely are unfair — so a new one arrives already suspected of being cheap. The design work is almost entirely about earning back that trust in the first thirty seconds.The central problem is momentum. A flappy game only feels good if the avatar has weight: a tap adds upward velocity rather than teleporting the player up, and releasing lets gravity take over gradually. That weight is what makes the game about anticipation instead of reaction — the player is steering something that responds a beat after they ask. Get the physics wrong in either direction and it breaks completely. Too floaty and the player feels disconnected from their own input. Too snappy and the skill disappears, because there is nothing to anticipate.
The second problem is the one that earns the genre its bad name: gap placement. If a gap is generated at a position the player cannot possibly reach from where they currently are, the death is not a mistake, it is an ambush. This happens easily, because gap height is usually randomised independently of the player's position — so two consecutive gaps at opposite extremes produce an impossible transition. The player experiences a loss they could not have avoided, concludes the game is rigged, and closes the tab. In an endless game with no story and no progression, that single impression is the whole product.
Third is the ceiling. Most flappy clones treat the top of the screen as a wall that kills, which is correct, but they give no warning as the player approaches it. A player climbing to clear a high gap can hit an invisible limit they were never shown, which reads as arbitrary even though it is consistent.
Fourth, this is a browser game with no install step, so there is no sunk cost whatsoever. A player who dies three times to something they did not understand leaves and never returns. Unlike a store app, there is no notification, no icon on their home screen, nothing to bring them back.
And fifth, the genre has no content to hide behind. There are no levels to tune, no unlocks to pace, no art to carry a weak minute. If the feel of a single tap is wrong, there is nothing else to look at.
Our approach
The physics were tuned to carry momentum in both directions. A tap adds upward velocity rather than setting a fixed position, and releasing lets gravity accumulate gradually instead of dropping the copter immediately. The result is an avatar with mass — it keeps rising briefly after the last tap and keeps falling briefly after the next one. That lag is not a defect to be minimised; it is the entire skill of the game. Removing it would make the copter easy to control and the game pointless.Gap placement is constrained relative to the player's reachable range, not randomised freely. The vertical distance between one gap and the next is bounded so that the transition is always physically achievable from a reasonable approach — the player may have to start climbing early, but there is always a line through. This is the single change that separates a fair flappy game from the clones that earned the format its reputation, and it costs nothing at runtime: it is a constraint on generation, not a check at play time.
The ceiling is treated as part of the playfield rather than a hidden kill line. The grid and the pipe tops give the player a visible sense of the vertical bounds, so climbing too high is a mistake they can see coming. A limit the player can perceive is difficulty; a limit they cannot is a bug they will blame on the game.
Readability was prioritised over spectacle in the visual design. The copter silhouette stays distinct against the synthwave background, and the pipe gaps are the brightest, highest-contrast shapes on screen. The neon glow sits behind the gap edges rather than across them, so the thing the player is aiming at never gets washed out by its own effect. In a game where every death is a misjudged gap, anything that makes the gap harder to read is a direct cost.
Difficulty rises through gap spacing and scroll speed rather than through gap size. Narrowing the gaps would eventually make them unreachable regardless of skill; bringing them closer together and moving the world faster keeps every gap individually passable while giving the player less time to set up. The ceiling of the game stays in the player's hands.
One clip ends the run, with no shields and no mid-flight saves. In a game this short, a safety net removes the only tension there is — and the restart is immediate, so a death costs seconds rather than patience.
On the technical side this build is worth a note: Unity emitted it with plain .br extensions rather than the .unityweb naming the rest of our library uses. Both are Brotli, and the extension alone says nothing about compression — so the file bytes were read to confirm, and the folder carries its own server rule declaring br encoding for .data.br, .wasm.br and .framework.js.br. Without it the browser would not decompress at all and the game would fail to parse rather than merely load slowly. The canvas is responsive, fixed to the full stage with the game scaling its own UI, so it fills the player page at any window size.
The result
A flappy game where the deaths are the player's own. Gap-to-gap distance is bounded by what is physically reachable, so there is always a line through — which is precisely what the clones that gave this format its reputation fail to guarantee.The copter carries momentum in both directions, rising briefly after the last tap and falling briefly after the next. That lag is the skill: every tap is a decision about where you will be half a second from now.
The ceiling is visible as part of the playfield rather than a hidden kill line, so climbing too high is a mistake the player can see approaching.
Difficulty scales through spacing and speed, never by narrowing gaps — every gap stays individually passable, so the limit is the player rather than the generator.
Shipped with .br extensions rather than .unityweb; the compression was confirmed from the file bytes and the folder carries its own encoding rule, because a mis-declared Brotli file does not load slowly, it fails to parse.
Fills the stage at any window size, on desktop and mobile. Playable on this site right now, with no download and no account.
