$BALLIN

PATCH NOTES

EVERY UPDATE, RECEIPTS INCLUDED — VERIFIED BY A 39-GATE SUITE BEFORE IT SHIPS

The Front Door

LIVE SEPTEMBER 2026 · r33

A pass over the first screen you see and the one you pick a baller on — plus a handful of things that were quietly wrong on a phone, found by measuring screens nothing had ever measured.

🐱 The cats on the menu are twice the size

The three doors on the front page — SINGLEPLAYER, MULTIPLAYER, PLAY A FRIEND — are three characters standing on a court, and on a phone they were being drawn at half size for no reason. Pixel art can only be scaled by whole numbers or it turns to mush, and the rule that picked the full-size art was asking about desktops rather than about how much room there actually was. A 390px phone gives each door a 118px column; the art is 104px wide. It fits, and now it is used. The title got the same treatment.

While that was being done, something that had already shipped turned up: the basketball marking which door you are on was positioned relative to the door rather than to the cat, so at the small size it sat neatly beside her ear and at the full size it sat on her face. It is beside her now, at every size.

🏀 TIP OFF is always on the screen

Turn a phone sideways — which the menu itself recommends — open the roster, and both buttons were below the fold: the panel scrolled, but nothing said so, so the screen looked like a character select with no way to start a match and no way back. Six characters and their abilities genuinely do not fit a short screen, and squeezing them until they did would have cost the information the screen exists to show. So the buttons are pinned to the bottom instead and the roster scrolls behind them.

⌨ Every screen change used to drop the keyboard

Playing with a keyboard and pressing a menu button rebuilt the screen — which deleted the button you were on, so the next Tab started again from the top of the page, above the menu that had just opened. Every time. The keyboard now stays where the menu is. Space works on menu buttons too; it never did.

🙂 If you asked for less motion, you get less motion

There is a match playing itself behind the front page. For anyone whose device is set to reduce motion, it does not run — the court is still there, it just holds still, along with the bouncing ball and the blinking shot-clock lamp.

🤝 A stranger is not your friend

The scoreboard called every online opponent FRIEND, including the random person QUICK MATCH had just paired you with. It says RIVAL for a stranger and FRIEND when a room code was shared, which is the difference the front page has always drawn.

Two things that could strand you after a match are fixed as well. If your opponent closed their tab on the result screen, REMATCH stayed pressable — and pressing it played a full ninety seconds against a cat that never moved, counted and paid like a real match. Worse, that same moment put you back in the public queue without asking, so the next stranger to press QUICK MATCH could pull you off your own result screen. Both gone: the screen tells you they left and offers to find somebody else.

📱 Two people on one phone were told to do the impossible

LOCAL 1V1's hint said to drag your half of the court. Dragging is explicitly refused in that mode — two people cannot share one pointer — and the four pads along the bottom that actually work went unmentioned. It names them now. The hint line under the cabinet was also showing keyboard controls to phones from the moment the game loaded, on every menu screen, because it was only ever written when a match started.

🔧 Under the hood

Seventeen screens had never been measured at any size — every fit check in the suite walked the front page. There is a gate for all of them now, at seven different screen shapes, and it asks the question that matters: is there something you can press without scrolling. It found the roster.

Two of its own checks were caught being decorative — they could report a problem but could never actually fail — by a control that deliberately breaks the page and demands they notice. That is a house rule here: a gate that cannot fail is worse than no gate.

On a host that blocks online play, the game said the relay was down. It is not; the host refuses the connection, and the browser reports that a fraction of a second after the game had already put the wrong sentence on screen. It now corrects itself, and the room-code screen — which had no version of that explanation at all — says the same thing.

The Progression Update

SHIPPED AUGUST 2026 · r28–r32

The biggest update the arcade has had: a new baller, a new mode, a soundtrack, feats, stats, and highlights that post as real video.

🔒 Online is back, and nobody sees your IP address

Two browsers playing each other directly have to exchange IP addresses. That is not a bug or a shortcut, it is what makes a direct connection direct — it is true of every peer-to-peer game and every video call, and the lobby used to say so before you pressed anything.

Saying so is not good enough. Quick Match pairs you with a stranger, and "we warned you" is a disclosure, not a protection. So online play came down for a few days, and it is back built differently: the two browsers no longer talk to each other at all. Every match is routed through the server, so you and your opponent never exchange addresses — quick match or room code, stranger or friend, no exceptions and nothing to switch on.

There is no longer any way for it to happen. The first version of this routed around the problem but kept the direct connection as a fallback. That fallback is gone — the code that could open one was deleted — so a bug, a bad config or an outage cannot quietly put it back.

One thing got worse, and it is worth naming. A direct connection could drop the occasional out-of-date position update and carry on. Going through a server means a lost packet holds up the ones behind it, so on a bad connection you may see a brief stutter where you used to see none. The game catches itself up immediately. That is the trade, and it was worth making.

There is one casualty, and it is deliberate. The old invite link is gone. Sending someone a link and pasting a code back never involved a server at all — which was the charm of it, and exactly why it could never be relayed. Room codes replace it completely: MAKE A ROOM, read your friend the five glyphs, they type them in. Old links just open the game.

One thing this also fixes: the roughly one pair in ten who could never connect — strict mobile and office networks that will not let two browsers meet — now connect like everybody else.

⏱ The shot clock now warns you

Hold the ball too long and it goes over to the other cat. That is a real rule — a three-second shot clock, same as the ring under your feet has always shown — but the only warning was a one-pixel arc you were never looking at, and the words SHOT CLOCK only arrived once the ball had already gone. Reported, fairly, as "it feels like the game just takes it". Now you get two clicks — at one second, and at a half — and the ring goes thick, orange and pulsing for the last second. The rule has not changed; you can just see it coming.

🤝 Both players get the same game

Online, one browser runs the match and the other joins it — and the one that joined has quietly been playing a worse version. Not slower: worse. Four things it never had, all fixed:

⏳ Nobody waits on a spinner any more

Searching for a stranger when nobody else is searching is not an error — the queue is working, there is simply no one in it — so nothing ever failed, and QUICK MATCH spun for ever. Now, after twenty seconds, it says so and keeps looking: you stay in the queue and get paired the moment somebody turns up, and meanwhile there are two real buttons instead of an animation. Room codes do the same, and the room screen no longer claims to know why nobody came — it cannot know.

And when two browsers genuinely cannot reach each other — some mobile networks will not allow it — that now lands on a screen that says so and offers LOCAL 1V1, instead of a red line over a panel still cheerfully reporting that it is looking. A partner who pairs and then never connects times out too, so a backgrounded phone on the other end cannot hold you for ever.

🐣 Your first ever match is not a LEGEND

The daily rival is drawn from four sharpness tiers, evenly — so half of all first-time players met ALL-STAR or LEGEND as their first and only game of the day, with no way to ask for anything easier. A player's first ever daily is now a ROOKIE. Every day after that is the same draw for everybody, exactly as before.

⚡ Lighter on a phone

The court's scanline overlay was being re-blended against the live canvas every single frame, at full display size — the single largest per-frame cost on a phone, for an effect that is pixel-for-pixel identical without it. Gone. The frosted blur behind menus is off on touch devices for the same reason: the court keeps drawing behind it, so it was a full-screen filter re-run sixty times a second to soften five percent of show-through nobody can see.

Also: tapping the menu mid-match on a phone used to leave you reading keyboard instructions for the rest of the game, and the controls screen described the upright layout as though dragging the court only worked that way. It works both ways, and now says so.

🧭 The menu got simple

Nine identical buttons became two decisions. PLAY THE DAILY and QUICK MATCH are now the two big buttons on the select screen — the game you should play today, and a stranger to play it against. Every other mode (THE GAUNTLET, PRACTICE, LOCAL 1V1, PLAY A FRIEND) lives one tap down behind MORE WAYS TO PLAY, and the housekeeping row shrank to housekeeping size.

🕹 The stick got quicker

Two phone fixes, straight from a field report. Full speed now arrives at about 60% of the stick's travel — the movement axis is a speed, and the top of the travel was dead range that cost real millimetres of thumb. And the stick's base now chases your thumb: drag past the edge and it follows, so reversing direction reads the instant your thumb turns back. Aiming is untouched — an angle wants its whole travel.

🎮 The first screen is a game now

Opening the arcade used to mean reading. A heading telling you to choose a baller, a paragraph of super rules, six cards — and PLAY three hundred pixels further down, which on a phone is off the bottom of the screen. Now the game is the first thing there: PLAY THE DAILY and QUICK MATCH sit at the top, and the roster moved underneath them, where picking someone is an invitation instead of a toll gate. The menu also centres itself when it fits rather than hugging the top of a tall phone with a quarter-screen of nothing beneath it.

💾 Progress that vanished, and why

If your XP or your STATS have ever reset on you, here's the likely reason: your progress is stored by your browser, per web address. Open the game from a temporary preview copy of the site and it keeps its own separate save — you play a whole session into it and then never see those numbers again. The game now sends you back to the real address automatically, so that can't happen by accident. And if your browser is blocking saved data outright (private mode, or blocked site data), the STATS panel now says so instead of quietly losing everything. The one address that keeps your progress is ballinb20.pages.dev — bookmark it.

🔁 Crashed? Come straight back

If your browser crashes, your phone dies, or you close the tab by accident, the match is still there when you get back. Reload the game and it drops you into the same match at the live score and clock, and you take your baller back off the rival. It works whichever of you dropped — the one who stayed keeps the game running and the other one rejoins. There's nothing to type: the two browsers remember a private ticket for each other, good for a few minutes.

And if the wifi drops on both of you at once, you find each other again and carry on from where the match actually was — whoever was refereeing keeps the score, so you don't come back to two different games.

🏃 If they quit, the match goes on

Someone closing the tab used to end your game too — you'd be posted back to a menu mid-possession. Now the rival picks their cat up and you play to the buzzer, at the score it stood, and the match counts. The scoreboard says RIVAL TOOK OVER · AI from that moment and the result screen says who left, so a win over the computer is never dressed up as a win over a person. This matters most for whoever joined the game: their match used to depend entirely on the other browser staying open, and now it doesn't.

🔌 Alt-tab no longer freezes the match

Online, one browser runs the match and the other renders it — and browsers freeze a hidden tab. So the room maker checking a text froze their opponent's whole world, until the game called a live match dead. Now a hidden tab hands the court to a worker the browser does not park: the match keeps running for both players, whoever tabs away. The other player's movement was also smoothed — corrections now measure real divergence instead of dragging your cat backward by the length of the network delay.

🏆 THE GAUNTLET — three rivals, one life

Three matches back to back up a fixed ladder — STARTER, ALL-STAR, LEGEND — and anything short of a win ends the run. A tie is not a win; you did not beat them. Every match pays XP like any other, and clearing all three pays a +60 XP bonus.

🎵 The game has a soundtrack now

A dark synthwave groove, synthesized live like every sound in the game — no files, nothing downloaded. It listens to the match instead of looping at it: the hi-hats arrive with your first bucket, an arpeggio leans in while a super is burning, and the last ten seconds double the time and add a snare. It sits deliberately under the effects — the swish is still the loudest thing in the room. MUSIC ON/OFF lives on the select screen, and both it and mute stick in your save.

🏅 Every baller plays free — and the feats pay

The whole roster is open from your first match. The three specialists each carry a feat — a one-match challenge themed to who they are, paying a one-time +40 XP bounty:

The match counts along with you — STOLE IT · THE GHOST 1/3, HEATER 3/5 — and when you hit the target the announcer says FEAT DONE; finish the match and the bounty lands. Nothing is for sale, and your save keeps every receipt.

📊 Your own numbers — the STATS panel

Total finished matches, W–L, overall winrate, and a per-character line — games, wins, losses, winrate — with your most-played baller tagged FAVE. Only matches that reach the buzzer count — including one the rival took over after your opponent left, because you still played it out. Walking out yourself records nothing, in either direction.

🐱 New baller: BASECAT

The first meme signing — the tiny cream kitten under a hard hat that's too big for it, drawn with its own head against the real reference. Its super, BASE JUICE: three buckets in a row and the bottle tips right where you're standing — that floor floods blue, defenders wade, you don't. The spill even posts its own wet-floor sign.

Basecat in this game is the meme, not any token. No tickers, no contracts — just the cat.

🐈‍⬛ BALLIN looks like BALLIN now

Drawn straight from the real cat's photos: her own chunky head, full cheeks, short wide-set ears, a proper black cat's dark nose and black whiskers — and the meme's whole personality, big round startled pupils, on the court and on her card.

🚪 QUICK MATCH and ROOM CODES — online, no links

The matchmaker is live. QUICK MATCH finds you a stranger; MAKE A ROOM shows a five-glyph code your friend just types — no links, no pasting, and the alphabet never uses 0, O, 1 or lookalikes, so a code survives being read out loud. The server's only job is pairing and handing both sides a relay to route through — it never sees a single frame of the match itself.

📹 Highlights post as real video

The clip your phone hands to X is now a real MP4 — built the moment the final score appears, ready before you press the button. If your device can't make one, the animated GIF route still runs.

🏀 The ball feels like a ball

Squash on every impact, stretch in flight, a rim that rattles when you clang one, split-second freeze-frames on buckets, dust on hard landings — all of it earned by real contact, none of it decoration.

🔧 Under the hood

The Arcade Era

SHIPPED r4–r27

Where the game came from: the 320×180 head-basketball court, five supers, the daily rival picked by the date so everyone on earth faces the same opponent, local 1v1 on one keyboard or one phone, online 1v1 connecting two browsers directly with no server in between, phone controls with a real floating stick, the Locker Room, and a security pass that locked every page down to default-src 'none'.

PLAY FREE BACK TO COURT