1. Calendar-aligned windows
Both platform vendors leave this open, and it is not a small gap.
Apple: leaderboards have a minimum recurrence of five minutes, a maximum of 30 days, and may not overlap. Duration and restarts are fixed minutes, hours and days — so a 30-day rolling board is expressible and a calendar month is not, because months are 28, 29, 30 or 31 days and a fixed duration cannot track that. A calendar year is unambiguously impossible.
Google Play Games Services ships daily, weekly and all-time. There is no monthly at all.
Here a window is a CRON expression, so 0 0 1 * * is a calendar month and 0 0 1 1 * is a calendar year.
2. Your history, your storage
Nothing in the market offers unbounded history. The reference has what this one stores instead.
PlayFab’s queryable-versions limit is bounded, tier-gated and metered — retained versions use storage within the service — and the canonical tutorial defaults it to 1, which is no history at all.
Game Center keeps expired occurrences roughly 30 days from expiry and says outright it is not an archival store.
Here, closed windows live in your own D1, for as many windows as you keep — at a price you can calculate in advance, which is the other half of that trade. The score ledger is plain SQL you can join against your own tables. No platform SDK gives you any SQL access to your leaderboard at all.
3. One board across iOS, Android and web
Game Center is Apple-only.
Play Games tamper protection is Android-only — and Google’s own guidance is to disable it if your game also runs on the web and shares leaderboards across both.
So a cross-platform title on the platform SDKs needs two leaderboards, gets no web story, and has to switch off the anti-cheat it adopted them for.
One board here serves all three — which is exactly why this package must own server-side validation rather than inherit it.
4. Server-authoritative by default
Every vendor that offers server-authoritative writes ships it off.
This ships it on. Submitting requires the submit scope: mint it for your trusted server’s token, never for a player’s, and a device cannot post a score it invented.
Turning it off is one line, and it is the vendor default, which is why it is not ours.
The principle runs deeper than the gate. A submission body carries a score and nothing else — the player comes from the authenticated session, the timestamp from the server’s clock, the rank from the data. A client that could name any of those could score as somebody else, backdate past the tiebreak, or simply declare itself first.
Per-board bounds and an admin hide/remove API round out the baseline — which is the entire anti-cheat surface the vendors actually demonstrate.
5. This costs money, and here is exactly how much
The honest one.
Game Center, Play Games Services and Steam are free at any scale. None documents a per-player, per-request or per-entry leaderboard fee — the only costs are the platform entry fees. They do not publish leaderboard pricing because there is nothing to publish.
PlayFab and Unity both publish meters you can compute against, and their at-scale costs are derivable from their own numbers in minutes.
So this is not more transparent than the field, and it is not cheaper. At a million players, on published prices:
| Per month at 1M players | |
|---|---|
| Game Center / Play Games / Steam | $0 |
| PlayFab | ~$247 |
| Pithy (materialized, typical improve rate) | ~$220 |
| Pithy (materialized, worst case) | $940 |
| Unity | ~$2,928 |
Mid-pack. A few times PlayFab at worst case, well under Unity, and infinitely more than the free platform SDKs.
For a game with a million players the whole spread is under $3,000 a month — noise against the revenue a million-player game earns. But say it straight: a successful app pays Cloudflare, and it may pay more here than it would on PlayFab.
What the money buys is the other four points: cross-platform reach the free SDKs cannot give, and adopter-owned SQL data that PlayFab and Unity do not offer at any price.
At roughly a tenth of a cent per player per month, the honest pitch is “a tenth of a cent per player buys you your own database” — not we’re cheap.
So when is free the right call?
A single-platform title that never needs its own data. Free is correct there, and nothing on this page argues otherwise.
The platform SDKs are also capped — Apple 500 boards, Google 70, both with fixed windows and no calendar month — and the data lives in Apple’s or Google’s service.
The moment you ship cross-platform, or want to join scores against your own tables, the free option is not on the table — and the paid ones cost roughly what this does.