Rating overview

Two numbers per player, per pool, in your own D1: a skill rating that moves both ways with every result, and an experience total that only ever rises.

They are separate on purpose, and that separation is the whole design. One number cannot both rank a player fairly and reward them for turning up.

A skill rating has to be able to fall, or it stops being a prediction. An experience total has to be monotonic, or the reward for playing is sometimes a punishment. Merge them and you get a ladder where the person with the most free time is the best player, which is exactly the failure this exists to avoid.

The algorithm is a choice, not a hardcode

Three ship built in, and the third is the only one that rates teams:

AlgorithmRosterWhat it gives you
elo1v1Transparent, one tunable, and the one everybody already understands
glicko1v1Glicko-2, carrying an uncertainty term — so a player returning on stale form is not rated as if they never left
trueskillAny rosterThe only one that rates teams

Registering your own is a supported extension rather than a fork.

Wiring a 1v1-only algorithm to a four-player game fails on deploy, not on the first recorded result. That check is worth more than it sounds: the alternative is a ladder that silently produces nonsense for a month.

Pools

A pool is named, so several games can share one ladder or each can keep its own. A player’s rating is per pool, which means good at chess and good at checkers are two facts about the same person rather than one blended average.

A pool is also what matchmaking buckets its open queue on. That makes this the skill source that capability needs: with rating composed, the queue widens a player’s skill band the longer they wait until any opponent qualifies; without it, the queue buckets by region alone.

Recording an outcome is server-authoritative

Posting a result requires a scope, minted for your trusted server’s token and never for a device. A rating a client can write is a rating a client can invent, and the whole ladder is then decoration.

On by default, and the default is the one you want.

What it deliberately does not do

It does not rank. leaderboard does that, and the distinction is the same one this page opens with: a leaderboard ranks what has happened, a rating estimates what will. A high score is an achievement; a rating is a prediction. Composing both is normal, and conflating them is the mistake.

It does not run matches. It records outcomes. Who played whom, and how the game resolved, is multiplayer’s.

It does not decide what a win is worth. The experience award per outcome is yours, in config.

It has no anti-smurf detection, no matchmaking rating separate from displayed rating, and no rank decay. Those are real features of mature competitive games, and each is a design decision this package deliberately leaves to you.

When you would reach for it

Any game where players are matched against each other and fair match means something. A ladder, a ranked mode, a skill-based queue.

Not for a single-player game with a high score — that is a leaderboard. Not for a casual game where everybody plays everybody, unless you want the experience half for its own sake.

What it needs

No required peers.

auth is optional and effectively required: ratings bind to a player, so without an identity composed every route denies.

Pairs with matchmaking, which reads the skill number to bucket its queue, and with multiplayer, whose resolved sessions are the outcomes you record.

ESC