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:
- The shot clock was invisible. The ring under the cat you are
carrying with counts down three seconds to a turnover. On the joining side it
was drawn permanently full — so you lost the ball to a clock you could not
see, and swiped at fresh carriers inside a grace window you could not see
either. It counts down for both of you now.
- Your shot did nothing for a fifth of a second. The button was
pressed, and then nothing happened — no sound, no recoil — until the other
browser answered. The shot is felt the instant you let go now, on both
sides. The ball still leaves when the referee says so; your cat just reacts
like a cat.
- The match was silent. Steals, being stripped, and supers had no
callout and no sound for the joining player — the court reacted to nothing
but the score. STOLE IT, STRIPPED and every super are called on both
screens, with the screen flash for whoever it belongs to.
- Your own cat got yanked backwards whenever the connection skipped a
beat, because the correction was measuring against a moment your screen had
already stopped showing. It measures against the picture you were actually
looking at now — which changes nothing at all while the connection is
healthy, and stops the tug when it is not.
⏳ 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 GHOST — steal the ball 3 times in one match.
- IRON PAW — win a match by 10+.
- HOT HAND — score 5 unanswered buckets (a loss still counts if the heater happened).
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
- Online guests now bank their XP and stats at full time (a timing bug silently ate them).
- Leaving an online match through the menu really leaves it — no ghost match playing on
behind your screens.
- The game survives its own crashes with a START AGAIN screen, the ball no longer
visually teleports on steals, and three AI stalemates are fixed.
- The daily streak is insured: every 5th day banks a TIMEOUT (hold 2) that spends
itself on exactly one missed day.