Vibe Arcade Blog

Dev stories, game design, and the art of building with AI

Building a Universal Game Leaderboard Without Login

We have 25+ browser games and every one of them needs a leaderboard. Here's how we built a framework that wires into any game, remembers who you are without making you create an account, and evolved because kids told us it wasn't fair.

· Vibe Arcade

architecture backend leaderboards vibe coding behind the scenes

The Problem: 25 Games, One Leaderboard System

When you run an arcade with one or two games, building a leaderboard is a weekend project. You write a backend, store some scores, display a table. But Vibe Arcade doesn't have two games. We have over twenty-five, and we're adding more regularly through our overnight build pipeline. If every new game required its own bespoke leaderboard implementation — its own score submission logic, its own display widget, its own backend wiring — we'd spend more time on leaderboards than on the games themselves.

We needed a framework. A standardized pattern that any game could implement, that our AI-assisted build pipeline could wire into new games automatically, and that a human could review and approve without needing to understand each game's internals from scratch. The leaderboard couldn't be an afterthought bolted onto each game differently. It had to be a first-class, repeatable system.

Design Philosophy: No Login, Low Friction

Before we wrote any code, we made a deliberate UX decision that shaped the entire architecture: no login. No account creation. No email verification. No OAuth flow. You play a game, you get a high score, you type your name, you're on the board.

This matters because of who plays Vibe Arcade. Our audience skews young. Kids don't have email addresses to verify. They don't want to create passwords. They're here to play a game they found through a search result or a link a friend sent, and the moment you put a signup wall between them and a leaderboard, you've lost them. The leaderboard exists to make the game more fun, not to be a conversion funnel.

But "no login" doesn't mean "no memory." The system remembers who you are for ease of posting your name the next time. If you played Neon Snake yesterday and typed "Alex" as your name, the system pre-fills that name when you finish a round of Space Destroyers today. You can change it anytime. There's no account, no profile, no data you need to manage. Just a name that follows you around the arcade so you don't have to re-type it every session. It's a small thing, but it's the kind of small thing that makes the difference between a leaderboard people actually use and one they ignore.

The Framework Approach

The AI built the initial leaderboard for our earliest games, and it worked. But as we added more games, a pattern emerged: every leaderboard integration looked roughly the same. The game needed to report a score. The score needed to be validated server-side before it hit the leaderboard. The leaderboard needed to display in a consistent way. The player needed to enter a name. The name needed to persist across sessions.

Rather than re-implement this for every game, we extracted it into a framework. A standardized integration pattern that every game follows. The game calls the leaderboard with a score, a game identifier, and any mode-specific context. The framework handles everything else — submission, validation, display, name persistence. Every game's leaderboard implementation is similar enough that our overnight pipeline knows how to wire it into new games automatically.

This is where the human-AI collaboration is clearest. The AI can replicate the framework pattern for each new game because the pattern is well-defined and consistent. But a human reviews the implementation for each new game, and the pipeline runs automated checks to make sure the integration is correct. The framework makes the AI's job predictable and the human's job reviewable. That's the design goal: not full automation, but reliable automation with meaningful oversight.

Version One: Simple High Scores

The first version of the leaderboard was exactly what you'd expect. You play a game. You get a score. If it's high enough, it goes on the board. The board shows the top scores, sorted highest-first. Simple, correct, and sufficient for the first wave of games.

Scores are validated server-side before they hit the leaderboard. We have rate limiting and anti-abuse measures in place. We're not going to detail the specifics of how those work — that's operational security we'd rather not publish — but the short version is that we take score integrity seriously. A leaderboard that's trivially cheatable is worse than no leaderboard at all, because it destroys the motivation of legitimate players.

Version one worked well for games like Neon Snake and Space Destroyers, where "high score" is the only metric that matters. You play, you accumulate points, the biggest number wins. For a while, that was all we needed.

"It's Not Fair"

The moment that changed the architecture came from the people who play our games the most: kids.

As we added games with multiple difficulty modes and game variants, the leaderboard stayed flat — one board per game, all scores mixed together. We didn't think much of it. A score is a score, right?

Wrong. The feedback started coming in, and it was blunt in the way that only kids can be. "It's not fair." A player who survived for three minutes on hard mode doesn't want their score sitting below someone who racked up a huge number on easy mode. A player who completed a speed run in a timed challenge mode doesn't want to compete against someone playing the untimed classic mode. The unfairness was obvious to the people playing the games, even if it hadn't been obvious to us when we designed the system.

"It's not fair if my hard mode score competes against someone playing easy mode."

That single piece of feedback — repeated in different words by different young players across different games — drove a real architectural change. We needed per-mode leaderboards. Not just one board per game, but one board per game per mode. Hard mode has its own leaderboard. Easy mode has its own. Timed challenges have their own. Each mode is its own competitive context, and players only compete against others who played the same way they did.

The implementation wasn't trivial. The framework needed to accept mode context alongside the score. The display needed to let players switch between mode-specific boards. The backend needed to partition scores cleanly. But because we'd built a framework rather than twenty-five bespoke implementations, the change happened in one place and propagated to every game. That's exactly the payoff you hope for when you invest in a framework early.

Supporting Different Metrics

Per-mode leaderboards weren't the only evolution. As the game library grew, we discovered that "highest score wins" isn't the only competitive metric that matters.

Some games are time-based. In a speed-run mode, the best score is the lowest time. The leaderboard needs to sort ascending instead of descending, and the display needs to format the value as a time rather than a point total. Other games might track completion percentage, move count, or other metrics where "more" doesn't always mean "better."

The framework now supports different metric types. Each game declares what kind of score it produces — points (higher is better), time (lower is better), or potentially other types as we add games with new competitive dimensions. The framework handles the sorting, formatting, and display logic based on that declaration. The game doesn't need to know how leaderboards work internally. It just says "here's a score, here's what kind of score it is" and the framework does the rest.

This sounds straightforward in retrospect, but we missed it initially. The first version assumed every score was a number where bigger meant better, because the first games we built all worked that way. It took building a game with a time-based challenge to reveal the assumption baked into the system.

What We Learned

The universal leaderboard is one of the clearest examples in Vibe Arcade of architecture that was shaped by its users rather than designed in advance. We didn't sit down and plan per-mode leaderboards or multi-metric support. We built the simplest thing that worked, shipped it, and then listened.

The listeners, in this case, were mostly kids. They don't read your documentation. They don't file structured bug reports. They say "it's not fair" and they mean it. And they're almost always right. A ten-year-old who feels cheated by a mixed-mode leaderboard is articulating a real design flaw, even if they can't name it.

The other lesson is about frameworks in an AI-assisted workflow. When the AI builds a new game, it follows the leaderboard integration pattern. When we need to change how leaderboards work, the change happens at the framework level and every game benefits. The AI implemented the changes. The feedback came from humans. The architecture evolved through collaboration between both.

We didn't start with the right architecture. We started with a sufficient one and let real usage — real kids, playing real games, saying real things about fairness — tell us where it needed to go. If we'd designed the "perfect" system upfront, we'd have spent weeks building features nobody needed yet and probably missed the things that actually mattered. The users knew. We just had to listen.


Related reading: What Is Vibe Coding? · How We Built Neon Snake · How We Built Space Destroyers · Vibe Coding Tools: From Chatbots to AI IDEs