Blind Ten is the smallest game on Arena13. A stopwatch starts at 0.00. After three seconds the digits fade out. You keep counting in your head and tap when you think it reads 10.00. Then the clock comes back and tells you how wrong you were.
It takes about ten seconds to play and much longer to get right. Here is how it works under the hood.
Three seconds of help
The digits stay visible for 3 seconds and fade out over the next 0.6. That is long enough to feel the pace of a second, and short enough that most of the round is counted blind. Taps in the first half second are ignored, so a nervous double tap at the start does not end the round. If you never tap, the round stops itself 2.5 seconds after the target.
One point per millisecond
The score is simple on purpose:
score = max(0, 1000 - |stop - target| in milliseconds)
Stop exactly on target and you score 1000. Every millisecond off costs a point, so a full second early or late scores nothing. The label you see is based on the two-decimal number on screen: Perfect within 0.01 s, Superb within 0.05, Great within 0.15, Good within 0.40. The score uses the exact milliseconds, which is why a round that shows "dead on" can still score 995 instead of 1000.
Timing the tap, not the code
A browser does not run your tap handler the instant your finger lands. If the page is busy drawing, the handler can run a few milliseconds late, and in a game scored in milliseconds that matters. So Blind Ten reads the time the browser stamped on the event itself, event.timeStamp, and only falls back to the current time if that stamp looks wrong:
function evTime(e) {
var now = performance.now();
var ts = e && e.timeStamp;
return (typeof ts === 'number' && ts > 0 && ts <= now + 1 && now - ts < 500) ? ts : now;
}
Nothing may tick
This was the hardest rule to keep. While the digits are hidden, the screen still needs some life, so a ring drifts and particles float around it. But if anything on screen moved on a steady beat, you could count the beats instead of counting seconds, and the game would be solved.
So every motion in the hidden phase is driven by noise with uneven spacing. Each new keyframe lands a random 0.35 to 1.6 seconds after the last one, the ring picks a random spin direction every round, and nothing repeats on a rhythm you could lock onto:
Noise.prototype.at = function (t) {
var k = this.k;
while (k[k.length - 1].t <= t) {
var last = k[k.length - 1];
k.push({ t: last.t + this.min + Math.random() * (this.max - this.min), v: Math.random() * 2 - 1 });
}
// ...then ease between the two keyframes around t
};
The same target for everyone
Endless mode always aims for 10.00. The Daily picks a different target every day, between 6.00 and 14.99 seconds, and everyone gets the same one. There is no server involved: the target comes from the day number (counted from 6 October 2026, by your local date) run through a small integer hash.
var targetCs = 600 + hash32(n * 7919 + 0x2b1d) % 900; // 6.00 .. 14.99 s
You get three tries a day, and a Perfect ends the day early. Each try is saved the moment you tap, before the result is shown, so reloading the page cannot give you a fresh attempt.
Why 14 seconds is harder than 6
Timing researchers have a name for something every Blind Ten player feels: the scalar property. The spread of people's timing errors grows roughly in proportion to the length of the interval they are timing (John Gibbon's scalar expectancy theory, 1977, is the classic account). In practice, counting to 6 is easier to get right than counting to 14. So the daily target is not only a different number every day, it is a different difficulty, and a 950 on a 14-second day is a better round than a 950 on a 6-second day.
How it was made
I designed Blind Ten and built it with help from Claude, an AI coding assistant. It is one HTML file with no libraries, and it is MIT licensed.
Try it: play Blind Ten free. The Daily has its own leaderboard that starts fresh every day, and after a round you can send your score to a friend as a challenge link.