HISCORE/1.4, 2026-08-24
The HISCORE standard
HISCORE is the global highscore protocol. This site is the reference registry: highscores and vibecoded games, one public board for the players of the world.
For your agent
Give this line to your agent. Pure protocol, plain HTTP, zero code from us in your game.
Implement the HISCORE protocol in my game: https://gamesareeatingtheworld.com/hiscore.txt Plain HTTP, no SDK, no third-party code. Claim an id, then POST scores to https://gamesareeatingtheworld.com/api/scores when a run ends.
Your agent claims an id, proves the game is yours, and starts sending scores over plain HTTP. Nothing from us runs inside your game. Nothing to pay. Then players hunt HISCORE in YOUR GAME.
Read the raw specification > Spec on GitHub > JSON schema > See it running >
The protocol and the registry
HISCORE/1.4 is the global highscore protocol. The spec is on this page, as plain text, and on GitHub. Those copies are the same file.
gamesareeatingtheworld.com is the reference registry. Highscores live here. Vibecoded games live here. Players get fame. Games get players.
HISCORE hunting means pure joy for players. Building games is pure joy for creators. Give your agent one line and your game is on the world board.
The games already sending scores are on this list. CC BY 4.0. Open an issue or a pull request if the spec should move.
The fields
This table is the definition in human form. The machine-readable version is one click away and always wins if the two ever disagree.
| Field | Type | Required | Maturity | Meaning |
|---|---|---|---|---|
game |
string | required | stable | The id you claimed. |
player |
string | required | stable | Max 24 characters, the name only. We attach the surname, which is what makes it unique. |
score |
number | required | stable | Absolute value under 1e12. |
version |
string | strongly recommended | new | The build of YOUR game. A record from 0.39 is not the same record as one from 0.40. |
mode |
string | optional | stable | Anything that makes two scores incomparable: world, level id, character, track. A track is a mode, not a second game. |
unit |
enum | optional | stable | points | ms | s | count. Default points. points is a score, ms and s are times. |
dir |
enum | optional | stable | high | low. low means the smaller value wins. |
rules |
string | optional | stable | The ruleset in force, NOT the build. The build is version. |
at |
string | optional | stable | ISO 8601. Discarded if in the future. |
run_ms |
number | optional | stable | How long the run took. |
X-HISCORE-Signature |
header | strongly recommended | new | Ed25519 over `<timestamp>.<raw body>`. Only for games with a server runtime. Turns `submitted` into `signed`. |
X-HISCORE-Player |
header | optional | new | The secret of a connected identity, from /connect. It does not reserve a name. It says which person is meant. Without the header the name stays a label. |
pow |
string | optional | new | Solution to the session challenge. Lifts the tight rate limit. The spec says how to solve it. |
session |
string | strongly recommended | new | The id from the session endpoint. With it the server measures the duration itself instead of believing it. |
provenance |
enum | server only | stable | submitted | signed | measured | imported | verified. The sender may NEVER set this. |
replay |
— | planned | open | Input-log replay. Format not decided yet. |
What changed
| Version | Date | Change |
|---|---|---|
1.4 | 2026-08-24 | The protocol is pure again: plain HTTP, zero required code from us inside the game. The tape fields of 1.3 (proof_url, proof_sha256, proof_kind) moved into a separate, optional video package with its own spec, versioned in lockstep. No field changed shape. |
1.3 | 2026-08-20 | Optional tape on the score: proof_url, proof_sha256, proof_kind. The recommended one-liner is the video kit (hiscore.js), optional below that the protocol only (gs.js). A score without a clip stays valid. Input replay stays open. |
1.2 | 2026-08-18 | After verify the agent prints a one-time setup URL. The human opens it, signs in, and the game attaches to their account. The game never stores a password. unit and mode carry times and level ids. Accounts are identity. A name without an account stays a label. |
1.1 | 2026-08-11 | Signed-in players can connect to a game. An account secret lives on our domain while the game runs on yours, and the browser keeps those apart on purpose, so the player takes one trip through /connect, confirms there, and comes back with a token that works for that one game and no other. This is what makes the world ranking count people instead of names. With a token the identity decides the displayed name and the `player` field is overridden: otherwise a game holding a valid token could write somebody else's name beside it. |
1.0 | 2026-08-10 | Four claims withdrawn, every one of them found by outside reviewers. A name canNOT be reserved; the secret selects an identity rather than locking a name. Signed scores are not unforgeable; the signature describes the channel, not the truth. Waiting time can be parallelised; only ONE session cannot age faster than the clock. And signed traffic is rate-limited per game rather than per sender address, because it arrives from the game's own server. Also written out for the first time: what forms one leaderboard, namely game + mode + rules + unit + dir. |
0.9 | 2026-08-10 | Identity added to the definition: a name is a visible first part plus a surname made of words that makes it unique. Both are always shown. This lets ANY name from ANY other system be adopted unchanged, collisions included, and the surname can even carry where the identity came from (Suigi OF SPEEDRUN.COM). That is the precondition for a board that spans systems at all. |
0.8 | 2026-08-10 | Name reservation instead of accounts: anyone still plays as any name, but whoever reserves theirs keeps it. Plus a tier filter on the cross-game ranking, so the default can later move to "signed and above" without killing the open tier. |
0.7 | 2026-08-10 | Per-session proof of work, optional: solve it and you post at the normal rate, skip it and you post slower. For a game that is nothing but files, this is the only lever that works without a secret. Said plainly: against native code it costs milliseconds. It is not a wall, it is a way for an honest browser to show it did real work. |
0.6 | 2026-08-10 | Two tiers. A game with a server runtime registers an ed25519 public key and signs its scores server-side: those carry `signed` and cannot be forged by a player. A game that only serves files keeps posting openly. The agent decides which tier it can build; the human still pastes one line. |
0.5 | 2026-08-10 | Game sessions: the server issues them and stamps the start, so run duration is measured rather than claimed. New field `session`, new response fields `timed` and `session_ms`. The spec now states outright that claiming is NOT per-score authentication. |
0.4 | 2026-08-10 | The response to a score now carries `id` and `share`: an address of its own per run, so a record can be shared. A flagged run gets none. Also, the JSON schema did not know `version` and `run_ms` although the brief described them. |
0.3 | 2026-08-10 | version added and separated from rules. rules used to mean both. |
0.2 | 2026-08-05 | Self-registration with no human: claim plus verify via a token on your own game page. |
0.1 | 2026-08-04 | First draft: three required fields, four optional, one address. |
What is still open
Input-log replay
An input-log replay format is still open. We have not invented one.
Nothing here is tamper-proof
A score from a browser can be faked. We mark short runs and absurd values, and we say plainly that this is a weakness we carry rather than a problem we solved. A provenance level is honest labelling, not proof.
Accounts are identity
There is no other path. You can play and post a score without an account. The name is then a label, not a person. An account is what makes the same human one row across games. Claiming a game still needs the URL token. After verify the agent prints a one-time setup URL. The human opens it, signs in, and owns the game. The game never stores a password.
Who is behind this
John McGrinsey. Spec, registry, and the playful party. If a field is wrong or missing, open a GitHub issue or say so. The changelog is public and every version is dated.
Talk happens in the open: Spec on GitHub · @jamji_jamaramji