Ghosts and bots: who you race when no one is online

What a ghost is, how the 100 labelled bots work, when you get a ghost instead of a live opponent, and how ghost matches count toward your LP at half weight.

Published: 5 min read

A ghost is a recording, not a player

When you race a ghost, you are racing a run that was already typed. The server stored every keystroke of that run with its timing, and during your match it plays the run back next to you as a second lane. The ghost cannot react to you, speed up or slow down; it types exactly what it typed the first time.

Every ghost is labelled as one. Before the race you see the ghost marker and the date the run was recorded, and the screen tells you whether the ghost typed the same text as you or a different one. That claim is checked on the server by comparing the two texts, so it is never a guess.

The ghost lane moves on your clock, not the countdown's. It starts with your first keystroke, so you and the recording are always compared over the same 30 seconds.

When you get a ghost

Press Find match on the Ranked 1v1 card and the server looks for a live opponent near your level. If nobody turns up within 4 seconds, you are matched with a ghost. The screen tells you this before you even click, and while you wait it shows the real number of other players in the queue. If that number is zero, it says nobody else is waiting rather than playing a fake searching animation.

The wait is enforced by the server, not your browser, so nobody can skip the human search. A ghost match also has a shorter countdown, 3 seconds instead of 4, because there is no second player who has to confirm.

Which ghost you get

Your own 30-second English runs on the home page feed the same pool: once your account is old enough, a clean run of yours can turn up as someone else's ghost.

The server picks the ghost and you cannot choose it. It goes through the options in a fixed order:

  • A real past run near your level. Real ghosts come from 30-second English runs by accounts at least a week old, and runs flagged by anti-cheat never enter the pool.
  • A run by one of the site's named bots that you have not faced yet.
  • An older synthetic run without a name, if no bot fits.
  • A ghost you have already raced. That match is played unrated, and the screen says why.

The 100 named bots

A league with no players feels empty, so the site has 100 bots. Each has an invented name taken from typing, keyboards and nature, such as Nova, Quill or Thock; none is a real person. A bot has no profile and no account. Its name comes from a fixed list in the site's code, not from anything stored in the database, so no stray text can ever appear in its place.

Bots cover speeds from 20 to 150 WPM, with most between 40 and 100, where most players are. Each bot has a personality that shapes its rhythm and mistakes, from careful and steady to fast-but-messy, and every one stays below the kind of perfectly even rhythm that only a machine produces. Each bot has 3 runs at slightly different paces, all 30 seconds of English text, so a bot feels like a distinct opponent rather than a single speed number.

Their runs are generated from a simulated typing rhythm, then scored by the same server path that scores your runs. A bot's WPM, accuracy and match score are computed from its keystrokes exactly as yours are.

How bots and synthetic ghosts are shown

A bot always appears as its name followed by bot, for example Nova · bot, next to a synthetic ghost chip. The explanation on screen is plain: a practice run generated by a bot, not a real player. This label follows the bot everywhere it appears: the opponent line before the race, the lane during it, the result screen and your list of recent league matches.

In Battle Royale, empty seats are filled only with synthetic runs, normally from the named bots, and a lobby with fewer than four real players is called Ghost Royale.

Ghost matches and your LP

A ghost match can count for LP, but at half weight compared with a match against a human. The screen marks the LP change from a ghost match as half weight, so you always know which kind you played.

You play each ghost once for LP. Each of a bot's three runs is a separate ghost, so a bot can count up to three times, once per run. Racing a ghost you have already faced is still allowed, but that match is unrated.

The LP you win or lose depends on how likely you were to beat that particular ghost. The ghost's score is read from its own stored run, not from anything your browser sends. If you beat ghosts about as often as your level predicts, gains and losses even out, so farming bots does not create free LP. Your placement matches are unrated whoever your opponent is.

One rule matters as much against a ghost as against a person: once the match is committed, leaving counts as a forfeit, and so does a run that never reaches the server by the deadline.

Why ghosts are never disguised

Showing bots as real players would make the site look busier, and that option was considered and rejected. The reason is simple: if you cannot trust the word opponent, you cannot trust anything else on the result screen either. A win over a recording should never look like a win over a person, in your own head or on a shared screenshot.

So the line that names a real opponent is used only for humans, the queue shows its true size, and every ghost carries its label and its run date. When the site is quiet you still get a match in seconds, and you always know exactly what you raced.

Start typing All posts