Fair play checks for PvP

A word game is only as good as the opponent across from you. Here is what we do so that opponent is not a solver.

Last updated April 17, 2026 · By Kurt Bijl

In short: WordSalvo validates online moves server-side, checks completed PvP games for suspicious play patterns, and compares results to each player’s baseline across analyzed games. AI opponents are always labelled as AI — no human-shaped bots padding the lobby. Premium never touches tile draws, scoring, or the dictionary.
WordSalvo board seen from above with a quiet integrity motif — a subtle concentric ring pattern radiating from the center star, formed from the board squares themselves.

Moves are checked on our servers, not on your phone

Online moves in WordSalvo are submitted through a Firestore transaction and run through the same pure Dart engine that draws your board — placement rules, cross-words, stacking multipliers, and dictionary validity are all applied server-side. Nothing a modified client claims about a score or a word is trusted on its own.

The dictionary itself is a DAWG (Directed Acyclic Word Graph) compiled from the same wordlist your opponent uses. English draws from lists in the SOWPODS lineage; Dutch uses the OpenTaal wordlist. The file is byte-identical on client and server, so "that word isn't in the dictionary" cannot be a device-specific dispute.

Reports of missing or questionable words go through a human review queue — the `reviewWordReport` Cloud Function — and land in dictionary updates.

Completed PvP games are checked for suspicious patterns

When an online PvP game ends, a Cloud Function checks the completed game for patterns that look like outside solver use. This fair-play check is for flagging suspicious play, not grading practice games or coaching quality.

That check — the `fairPlayAnalysis` function — runs 14 weighted signals. Among them: brilliancy ≥98% across a game, perfect streaks of seven or more moves, think-time coefficient of variation under 0.3 (humans sit above ~0.5), fast-and-accurate plays under three seconds at >80% accuracy, and high-complexity perfection where you find the best move in a position with more than 200 legal options. Short games under eight moves are discounted to a 0.2–0.8× confidence multiplier because small samples lie.

Each signal only matters relative to you. WordSalvo keeps a rolling 20-game per-player baseline and looks at deviation — beating your own average by more than 2.5σ draws attention; steadily being a strong player does not.

Small editorial chart: a player's brilliancy distribution as a soft navy curve, with one dot sitting roughly three standard deviations to the right of the peak.

Real people by default — AI is always labelled AI

Online matchmaking pulls from a Firestore queue with a ±200 rating-point window. The opponent it returns is another human who joined that queue. We do not synthesise accounts, we do not stage bots with human names, and we do not grow a lobby count with filler.

AI opponents do exist at four difficulties — easy, medium, hard, and expert — and they run in a Cloud Function (`onAiTurn`), which means two things. First: an AI game requires a network connection. Second: every AI opponent carries an explicit "AI" label on the game card and the scoreboard. If the game does not say AI, it is not AI.

A game lobby card with a single opponent slot clearly showing an AI tag next to the opponent name and a difficulty pill.

Premium changes nothing that decides a game

WordSalvo has two paid options and neither of them touches the board. A one-time Ad-Free purchase removes the lobby banner and the between-game interstitial. The planned Word Master subscription unlocks deeper post-game analysis, unlimited daily-puzzle retries, the Word Book, priority matchmaking, and cosmetic themes.

What Premium does not change: your tile draws (the bag is shuffled by `tile_bag.dart` with no entitlement check), the dictionary (same DAWG for every player in that language), your scoring (engine-computed multipliers, no hidden bonus), or your matchmaking range — priority only affects queue position, not opponent rating.

Translation: two free-tier players can reach the top of a language leaderboard with nothing installed but the app. 0% of in-app purchases buy a win.

Chat has a filter; people have block, mute, and report

Every chat message passes through the `onChatMessage` Cloud Function, which applies a server-side toxicity filter before the message reaches the other player. The filter is not perfect — no automated filter is — so every message is also one tap away from a report, block, or mute.

Reports are written to Firestore and reviewed by us. Blocks are bidirectional: a blocked player cannot invite you, match you, or chat you. Mutes are local and quiet. A player who accumulates confirmed reports is handled manually — we do not auto-ban, and we do not stay silent when we act.

What happens to a flagged player

The fair-play verdict doc (`games/{gameId}/analysis/fairPlay`) is locked to Cloud Functions only — Firestore rules block clients from reading it, so a flagged player cannot see a score and calibrate around it. Per-player baselines at `users/{uid}/fairPlayBaseline/{statsKey}` are readable only by their owner.

When a game is flagged with high confidence, the fair-play system gives WordSalvo a clearer basis for review and action. It is designed to support trust in PvP without pretending that any anti-cheat system catches everything.

If you think you have been flagged wrongly, reach out from inside Settings → Help. We keep a per-player history long enough to explain the call.

Frequently asked questions

what counts as cheating in WordSalvo?
Using an outside engine, solver, or anagram tool to pick your moves. Sharing an account across multiple rated games. Coordinating with an opponent to throw or boost a rating. Exploiting a bug to submit an invalid board. Normal study — reading a dictionary, practising against AI, learning from post-game analysis — is not cheating.
how do you check for suspicious engine use?
Per-game suspicious-pattern analysis, combined with your own rolling baseline. The server looks at brilliancy distribution, perfect streaks, think-time variance, speed-vs-accuracy, and bingo frequency, then asks whether this game is far above your normal play. One brilliant game alone is not enough.
are there bots pretending to be human opponents?
No. Online matchmaking returns real players from a ±200 rating-point Firestore queue. AI opponents exist at easy, medium, hard, and expert, and every one of them carries an explicit AI label on the lobby card and the scoreboard.
what if I am flagged by mistake?
We review flagged games manually before taking any action, and we tell you when we do act — no silent bans. If you think we got it wrong, contact us from Settings → Help. Baselines are rolling, so one unusually strong game does not brand you.
does paying for Premium give me an advantage?
No. Premium removes ads, adds deeper post-game analysis, gives unlimited daily-puzzle retries, the Word Book, and cosmetic themes. It does not change tile draws, the dictionary, scoring, or opponent skill range. A free-tier player can top a leaderboard.
is the dictionary the same for everyone?
Yes. Every player in a given language plays against the same DAWG-compiled wordlist, shipped as an identical file on client and server. English uses lists in the SOWPODS lineage; Dutch uses OpenTaal. Reports of missing or wrong words go through human review.
Fair play in WordSalvo: PvP checks, no hidden bot lobbies