This is the first large-scale analysis of Grandmaster activity across Chess.com and Lichess from 2008 to 2025, based on years of data collection and millions of games. I explored which platform top chess players prefer and how Chess.com and Lichess have evolved over the years.
All data comes from my project ChessMonitor, which maintains one of the largest chess databases in the world. Feel free to check it out! :)
Shameless plug: f you're looking for a similar way to compare your online rating with the FIDE rating, take a look at my project: https://www.chessmonitor.com/
Having a quick look at ChessMonitor, it looks like much of the analysis tools mirror what can be found on Lichess (unsure about Chess.com). Is the value providing the aggregate analysis between Lichess and Chess.com? Or is there functionality past what can be found on the respective sites?
Chess.com Insights are similar to what my project is doing. However, Lichess has nothing similar. They do have something called "Chess Insights" but it's not really comparable IMHO.
That said, there are also some unique features like "Openings" which allows you to quickly identify your best/worst openings.
I’d suggest fitting an isotonic regression instead. I think it’s a reasonable expectation that online and FIDE ratings are monotonically related but it seems unlikely to me that they are linearly related even though it may be an ok approximation for players in a particular rating range.
I suspect that the online population — especially at lower ratings — is significantly different to the over the board population. I also expect — especially in the FIDE case — that ratings stratify the players into hobbyists, serious amateurs, professionals, etc and so different FIDE rating ranges are likely to scale to online ratings differently.
All of the above should be implicitly accounted for in an isotonic regression so long as monotonicity holds globally. You can easily do it with sklearn and I suspect it may give you better results.
One thing I'd love to know or see is common mistakes I make or the type of mistake/trap I fall into in the pivotal moments of games (some kind of fork/pin combo for me I suspect) ... and/or repeated mistakes I've made in the same position.
I'm currently not doing Stockfish evaluations (everything is based on simple win/loss-rate) but I hope I'm able to integrate this in the future. Then I can show much more in-depth statistics like the one you mention.
The scroll feature to rewind/forward moves on a game, with syncing the state in the URL, is just awesome.
Do you mind sharing how it's done? I just published a library [1] that deals with syncing complex state in the URL, and I'd love to hear more about actual use-cases in the wild.
Thanks, I just like it when all state is in the URL and you can just bookmark it. Also using the browser back/forward button should work well thanks to that. I'll check out your library!
My code for that is rather simple. I'm using Next.js and the code looks something like this (a little simplified):
const router = useRouter(); // get the router/location object
const information = useFetch({ position: router.query.position }); // fetch information from the server
function changeChessPosition(newPosition) { // called when position changes
router.replace({ query: { postition: newPosition } }); // replaces the state in the URL
}
In addition, I have some caching in place so that each position is only downloaded once and the change function looks a little more complicated in my case as there are multiple values that can be change for each page.
There are many similar features. Overall the UI on ChessMonitor is much more focused on statistics.
Another key feature Lichess does not have, is the Openings page. It is very powerful when used correctly. You can look at your openings and immediately see for which openings you might need to consume more theory (or which you should not play at all).
Classic chess are way too predictable and players who've managed to learn popular openings have an advantage. Chess960 fixes that.
And due to comparably low popularity of Chess960 I often play it with Stockfish. It has several difficulty levels which are a convenient tool for practice.
So it would be nice to include games with bots (checkbox?) on ChessMonitor as well.
I'm aware of Chess960, but this will probably never be supported on ChessMonitor for three reasons: First, Chess960 basically tries to prevent players from preparing (by having a random starting position) which does not align well with providing statistics. Second, it would require major UI and storage changes on ChessMonitor (like adding an option to select the starting position to compare games). And third, Chess960 is simply not as popular amongst non-professional chess players.
Slight nuance: the 960 figure includes the regular starting position, and there's some variation in different tournaments about what would happen if the classical starting position were selected. So, at least in some tournaments, it's actually Chess959. But I guess that has less of a ring to it.
Surprisingly, storing a game (with all moves) can take less space than encoding a single board. This is because you can effectively encode a move in a single byte (as there are less than 255 moves possible in each position). Applying compression to the resulting binary string will allow you to reduce the space even more.
And shameless plug: Using this encoding, I'm storing millions of games on https://www.chessmonitor.com/ There you can link your Chess.com or Lichess account and view all kind of statistics of your games.
That is a beautifully designed website. I don't think I've ever used an OAuth authentication flow as smooth as the one that your site uses to access my Lichess credentials (same as my HN name, btw, in case you want to beat me at a correspondence game).
Heh, I guess there are board states that are not possible to reach through a valid sequence of moves, but I guess otherwise it's not possible that games are more compressable by definition, since any valid board state could be represented as a sequence of moves.
This does raise the question of the efficiency of reverse engineering a series of minimal moves for some board state.
Are you saying that, to encode a valid position, ignoring the cost to encode both the starting position and the move definitions, you can encode the move sequence using less information than encoding a single position?
I'd expect that ordering moves by popularity at each half move index, using say the above dataset, would allow you to select lower indexed values at each step, allowing a nice context based arithmetic compression to really shrink them well.
Yes, in contrast to storing the board (which can be a fixed size), this depends on the length of the game of course.
That said, there are some optimizations you can apply that will compress moves even further (for example the order of the moves as explained in the Lichess blog post is important). In the end it's a tradeoff between (de)serializing the game fast and reducing the size (even more).
It seems, then, if you wanted to efficiently store lots of positions, it would be smart to store a large list of openings, a large list of following sequences, and then your positions can be stored as a list of sequence ids.
I created a website to analyze chess games. By connecting your Chess.com/Lichess account you can access all kind of statistics related to your chess games. You can even link more than one account.
Shameless plug: In case you want to track your chess progress and see more statistics on your openings (win rates, etc.), I'm developing a website where you can link your accounts to view stats for all of your games. It's free and currently in Beta: https://www.chessmonitor.com/
All data comes from my project ChessMonitor, which maintains one of the largest chess databases in the world. Feel free to check it out! :)