tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#a-web-app-for-players-and-venues')" >A web app for players and venues
I built the logged-in web app from scratch on Django, Vue 3 and Tailwind 4. Players get profiles with followers and insights; venues, machines, manufacturers and collections get pages of their own; and there's search, leaderboards and notifications throughout. Operators manage their machines, venues and competitions in the same app.
Every ball, charted
Scorbit devices upload a log of every game. I parse those into per-player, per-ball timelines, picking out multiballs and extra balls, and chart them, so a score tells the story of the game rather than just its ending. Players can react to scores, and claim them with a photo.
Leaderboards straight out of Postgres
Leaderboards are SQL views, with 14, 30, 90, 180 and 365-day versions generated automatically. Claimed scores are a materialized view that refreshes only when scores change, so the busiest leaderboards stay fast without a cache to keep in sync.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#tournaments-and-scorbitvision')" >Tournaments and ScorbitVision
Venues run events and competitions with entry rules and age limits, and show them on ScorbitVision: live leaderboards and machine boards for the screens on the arcade floor.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#find-a-game-near-you')" >Find a game near you
I moved venues onto PostGIS, imported them from Pinball Map, synced the machine catalog from OPDB, added check-ins, and moved the map from Google Maps to MapLibre.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#an-api-built-to-last')" >An API built to last
API v2 became the default, documented with OpenAPI, with Scorbitron pairing codes and sign-in with Google, Apple, Facebook and Discord. Test coverage went to 100%, and CI fails below it.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#the-marketing-site')" >The marketing site
I rebuilt scorbit.io from scratch: a custom WordPress theme on Tailwind 4 and Blade, replacing an off-the-shelf Divi theme. Its leaderboard, team and tournament blocks pull live data from the Scorbit API, and images are served through Cloudflare.
