A daily game is a simple promise: today, everyone plays the same board. Tomorrow there is a new one, and yesterday's is gone. Arena13 has a lot of them: a daily word, ten trivia questions, a chess puzzle, a stopwatch target, a run of rule cards and a crowd battle road, each with a leaderboard that starts fresh every day. This is how that works, and the few rules that keep it fair.
The same board without a server
You might expect a server to hand out today's puzzle. On Arena13 it does not. Each game turns today's date into a day number and uses it as the seed for a small random number generator. The same seed always gives the same sequence of "random" numbers, so every phone and laptop that runs the game on the same date builds exactly the same board. Many of our games use mulberry32, which fits in a few lines:
function rng(seed) {
var a = seed >>> 0;
return function () {
a = (a + 0x6D2B79F5) >>> 0;
var t = a;
t = Math.imul(t ^ (t >>> 15), t | 1);
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
The day number counts from a fixed start date written into each game. The games where the content comes from a list, like the daily word, the trivia questions and the chess puzzles, simply walk down the list in order: day 1 gets the first entries, day 2 the next, and so on.
The rule you can never break
Once a daily game is live, its start date, its generator and its list order are frozen. Change any of them and every past and future board changes too. Yesterday's answer page would show the wrong word, and a player sharing yesterday's result would be describing a puzzle that no longer exists. So we never reorder the word list, never regenerate the question file and never touch the generator after launch. If a game needs a new rule, it gets a new mode.
Your day and the board's day
Here is a detail most players never notice. The daily puzzles follow your local date, so a new puzzle arrives at your midnight, wherever you are. The daily leaderboards follow one clock for everyone, UTC, because a single board cannot have a different midnight for every country. For a few hours around midnight, depending on where you live, the puzzle and the board are on different days. We chose that on purpose: the puzzle should feel like part of your day, and the board has to be one shared race.
A fresh leaderboard every day
The leaderboards live in a small database, and "today" is just a filter on when a score was posted. Nothing is deleted at midnight. Each game page can show today's top 10 or the all-time top 10, and finished days stay in the database. Three games each day are the daily tournament, and the top three on those boards at midnight UTC win coins, which are points with no cash value.
Keeping the board honest
A leaderboard anyone can post to will fill with fake scores. Ours has a few guards, all cheap to run:
- Round tokens. When a game page loads its leaderboard, the server hands back a signed token for that game. A score has to come with a token that is for the same game, old enough for a real round to have happened (each game sets its own shortest possible round), less than a day old and never used before.
- Score caps. Every game has a maximum score that a real round cannot beat.
- Rate limits. Posts are limited per network, counted by a salted hash, never the raw address. The limits are generous on purpose, because a whole school or office can share one network.
None of this stops a determined cheater with time to spare. It does stop the lazy ones, which is most of them, and it costs nothing to run.
Daily battles between friends
After a round you can send a challenge link. The link carries your score and your name, so whoever opens it sees exactly what they have to beat. There is no account and nothing to install: the battle is saved in their browser, and beating it pays a few coins.
How it was made
Arena13 is a static site with a small database for the leaderboards, and all of it runs on free hosting plans. I designed it and built it with help from Claude, an AI coding assistant.
Today's boards are already running. Start with the daily word or Blind Ten, then see where you stand on the leaderboards.