Case Study · Application Development
Building WhoPlaysNext: What Happens When You Build the Tool You Wish Existed
Every pickup volleyball game you’ve ever played probably started the same way ours did: a group chat, a “who’s in tonight?” text, and a lot of guessing once you actually showed up. That’s the itch that turned into WhoPlaysNext — a scheduling app we built for ourselves first, and now run for real players in San Diego.
Where it started
There wasn’t a brief for this one. No client, no kickoff meeting — just a familiar problem. Pickup sports run on scattered group chats: someone posts a game, ten people say “in,” three actually show up, and once you’re at the court nobody agrees on whose turn it is. Every generic scheduling tool we looked at assumed you were booking a single fixed slot, not managing a rotating queue of walk-ins and teams.
So we did what we’d tell a client to do: stopped trying to bend an existing tool into shape, and built the thing that actually matched how people play.
What it turned into
WhoPlaysNext ended up being a full Progressive Web App — React on the front end, Django underneath — built around three things people actually needed: a way to post and find games, a fair queue system for who plays next, and a map for finding a court in the first place.
Players post a game up to a week out, join a queue that handles walk-ins and team play without anyone having to referee it, and drop themselves into groups with a QR code instead of another link nobody clicks. There’s a map for finding venues, an admin approval step before a new one goes live, and Google sign-in so getting started doesn’t feel like filling out a form. Behind the scenes, a small admin panel and a handful of scheduled jobs keep things tidy — approving new venues, sending feedback digests, cleaning up old queue activity — so it doesn’t need someone babysitting it.
A few decisions we’re still glad we made
Nothing about this was flashy engineering for its own sake — most of the interesting choices were about not over-building it.
Court queues need to feel current, but we didn’t reach for WebSockets on day one. A simple polling interval keeps the queue feeling live without the operational overhead of a persistent connection layer nobody needed yet — one of those “right tool, not the impressive one” calls we’d make again.
Location permissions are where a lot of apps quietly break. That little “share your location?” prompt has three or four possible answers, and most apps only really handle one of them. The venue map tracks the browser’s actual permission state and adjusts the UI to match — including a real path forward if someone says no, instead of just nothing happening.
And on the security side, we moved auth tokens out of browser storage and into httpOnly cookies specifically to close off a class of XSS-driven token theft — then spent a bit more time than expected making sure that change didn’t quietly break public pages for people who weren’t logged in. Small fix, longer tail than it looked like at first.
We host it ourselves, too
WhoPlaysNext doesn’t sit on someone else’s platform — it runs on the same containerized infrastructure we’d stand up for a client: Docker services for the API, frontend, database, and webserver, shipped through GitHub Actions, a replicated database with failover routing, and Prometheus/Grafana watching it so we find out about problems before anyone else does.
It’s not a demo. It’s the same stack, same process, same attention we’d give any client’s application — just pointed at our own idea instead of someone else’s.
Under the hood: React, Vite & TypeScript · Tailwind CSS · a Progressive Web App with offline support · Django REST Framework & Python · MySQL with replication · Docker & Docker Compose · nginx & HAProxy with Keepalived · GitHub Actions · Prometheus & Grafana · Mapbox · Google OAuth
Curious?
The app is live at whoplaysnext.net if you want to poke around. And if you’ve got your own “we built a workaround because nothing fit” problem, that’s usually where we’re most useful.
bluearcadiagroup.com · info@bluearcadiagroup.com
