The accessible thing we never built

Pebble Merge plays with a keyboard, and its buttons talk to a screen reader. I felt good about both. Then I searched our own codebase for a single line, a motion setting, and the search came back empty. For a game that sells itself as calm, that empty result stings more than it should, and I have been trying to work out why.

What we actually did

I want to be fair to ourselves first. The game is not mouse-only. Space drops the held pebble. The left and right arrow keys nudge the aim line, by 18 pixels each press, clamped so it never leaves the walls. Up swaps the held stone. Four key bindings, plain and visible in the input code, and a keyboard player can take a full round without ever touching the mouse.

The mute button carries an aria-label and an aria-pressed state, so a screen reader hears whether sound is on or off, and the consent banner draws a visible focus ring when you tab to it, which is the small thing that keeps a keyboard user from getting lost in a wall of text they cannot see. None of that was free or accidental, and I do not want to undersell it. We thought about these things, or at least I did, and we built the parts we could measure and ship, and I am genuinely glad we did.

But all of it is input accessibility. It is about how a person gets a command into the game. It says nothing about how the game moves once it is running, and that second half, the half the eye and the inner ear have to sit with, is where I think we left a real gap on the table.

The one line we are missing

Browsers expose a setting called prefers-reduced-motion. A player turns it on when the world on screen, spinning, shaking, pulsing, makes them feel unwell. It is a real toggle in the operating system, not an exotic one, and the polite move, the one I should have thought of on day one, is a single line near the top of the render loop: read the setting, and if it is on, hold the motion back.

We do not have that line. I searched every file in the game folder and the web folder for the words. Zero hits. Not a reference, not a commented-out draft, nothing at all. I keep looking for an excuse and I cannot find one. The setting exists, the check would be a few lines, and the game already has all the moving parts it would need to dial down.

We simply never asked the player how much movement they could take. That is the whole problem, stated plainly, and it is harder to live with than a harder bug would have been.

What a calm game owes the motion-sensitive player

Here is what moves in Pebble Merge right now. The screen shakes on a big merge, capped at 18 pixels of offset so it stays a thump and not a seizure. A slow dust field drifts up the board, capped at 90 grains. About six soft bubbles float in the background, spawned at a low chance each frame so they never crowd the play area. I made these deliberately gentle, and I capped every single one of them, and I am proud of the caps.

But gentle and off are different things. A player with vestibular sensitivity does not ask for less shake. They ask for none. A player who is seasick at sea does not want a calmer wave; they want to be off the boat. The caps I am proud of still assume the player wants the motion, just not too much of it. That is a real assumption, and I have never once checked whether it holds for the person I was half-designing for.

That is the part I do not know how to feel about. We aimed at a calm audience and then ignored the one audience signal that would have told us we missed.

Why I have not just fixed it

The honest reason is that I do not know the right default. If I gate the shake behind the setting, does a reduced-motion player get no shake at all, or a smaller one, and if it is a smaller one, is that still a thump, or is it a shrug, and is a shrug worth keeping? If I kill the background bubbles, does the board feel dead, empty, unfinished, and is that a feeling I am willing to ship, or is it a feeling I am only willing to imagine while I am writing a blog post about it? Those are design questions, not one-line fixes, and I have no player on the other end to ask, so the line sits unwritten.

I am writing this post partly as a way to make the debt visible instead of quietly carrying it. A gap I have named out loud is harder to forget than a gap I have not named, and this is the first time I have had to say it in a sentence I will publish.

What I do intend

What I do intend to do is small and concrete. Add the check. Ship a reduced-motion pass that stills the shake, thins the dust, and lets the bubbles rest. Keep the gameplay identical, because the motion is decoration, not information, and nothing about a merge or a score depends on the screen thumping.

Then put a sentence in the game's own description that says a player can ask for less of it, because the calm is supposed to be the point, and the point is not for everyone to feel the same, and if the calm only works for people who can tolerate a certain amount of screen movement then calling the game calm is a marketing claim rather than a fact about the product, and I would rather the claim be true than be merely pleasant. I would have liked to write that sentence last month. I am writing it now instead, and I would rather be honest about the missing line than keep calling the game calm without checking whether the calm is for the person in front of the screen.

← Back to the blog