HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
lichess-org
lila
Scala2013–2026
lichess-org / lila

lila

♞ lichess.org: the forever free, adless and open source chess server ♞

47Distinct people
48Mentions
1Explicit recommenders
19KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

♞ lichess.org: the forever free, adless and open source chess server ♞

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

lichess.org and the corresponding open source project[1] are really quite something. If you're at all interested in chess or code, I recommend following it -- their great…

csmajorfive used a recommendation phrase. One indexed comment matches. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 5:04:57 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year48 dated mentions

Observed mentions: 2013-07-26 15:36:25 UTC to 2026-02-24 01:37:19 UTC.

024682013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments20132014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 4 mentions; 1 submissions, 3 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 4 mentions; 2 submissions, 2 comments20192020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 7 mentions; 0 submissions, 7 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 8 mentions; 0 submissions, 8 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 5 mentions; 0 submissions, 5 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 4 mentions; 1 submissions, 3 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC202
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC110
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC303
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC202
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC413
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC303
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC422
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC707
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC303
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC808
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC000
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC505
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC413
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC202

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
lichess.org Lila (li[chess in sca]la) is a free online chess game server focused on realtime gameplay and ease of use. It features a search engine, computer analysis distributed with fishnet, tournaments, simuls, forums, teams, tactic trainer, a mobile app, and a shared analysis board. The UI is available in more than 140 languages thanks to the community. Lichess is written in Scala 3, and relies on a modified Play 2.8 framework. scalatags is used for templating. Pure chess logic is contained in the scalachess submodule. The server is fully asynchronous, making heavy use of Scala Futures and Pekko streams. WebSocket connections are handled by a separate server that communicates using redis. Lichess talks to Stockfish deployed in an AI cluster of donated servers. It uses MongoDB to store more than 12 billion games, which are indexed by elasticsearch. HTTP requests and WebSocket connections can be proxied by nginx. The web client is written in TypeScript and snabbdom, using Sass to generate CSS. All rated games are published in a free PGN database. Browser testing done with Browserstack. Proxy detection done with IP2Proxy database. Software builds and CI/CD done with Depot. Please help us translate Lichess with Crowdin. See lichess.org/source for a list of repositories. Join us on Discord for more info. Use GitHub issues for bug reports and feature requests. Installation ./lila.sh # thin wrapper around sbt run The Wiki describes how to setup a development environment. HTTP API Feel free to use the Lichess API in your applications and websites. Supported browsers Name Version Notes Firefox 100+ Full support (recommended) Chromium / Chrome 100+ Full support Edge 100+ Full support Opera 97+ Reasonable support Safari 14+ Reasonable support Older browsers will not work. For your own sake, please upgrade. Security and performance, think about it! License Lila is licensed under the GNU Affero General Public License 3 or any later version at your choice. See copying for details. Production architecture (as of July 2022) Credits See lichess.org/thanks and the contributors here: Competence development program Lichess would like to support its contributors in their competence development by covering costs of relevant training materials and activities. This is a small way to further empower contributors who have given their time to Lichess and to enable or improve additional contributions to Lichess in the future. For more information, including how to apply, check Competence Development for Lichess contributors.
Read the full README on GitHub

What Hacker News says

48 sources
You'll also have some fun pinning down the difference between an "inaccuracy", a "mistake", and a "blunder". These are meaningful delineations for humans but not for a chess algorithm. Objectively, any amount of centipawn loss either changes the best possible outcome for the player or it does not. So in practice, a drop in win probability greater than 14% is considered a blunder on Lichess. For reference, lichess uses the following function to map centipawn advantage to the probability bar, derived from observed outcomes: https://github.com/lichess-org/lila/pull/11148 From an ML perspective, this is basically logistic regression with a single feature. However, once we leave the realm of theoretical centipawn value and begin to optimize predictive power, we could imagine adding in other things like the players' ELOs or time remaining per p
Read the rest
layer, etc. I think there are some interesting theoretical differences between predicted win probability derived from Stockfish CP and actual outcomes. As in, you could even imagine predicting positions where certain players struggle and steering them towards those positions. [0] [0] https://www.youtube.com/watch?v=KgOC1D8wkyE
In What Is a Centipawn Advantage?
Nice but AFAICT one can self-host lichess https://github.com/lichess-org/lila so I'd imagine based on how active it is, how inclusive it is (including languages like Chinese) I would provide some comparison with it. In terms of long term maintenance I have a hard time, and sorry to be so negative, to imagine it will last longer solely based on the size of the existing community. PS: even has container images, e.g. https://github.com/lichess-org/lila-docker so before I could finish writing this message I had my own instance running.
In Show HN: Family Chess: Play across firewalls and Internet cultures
I have not tried it, but lichess is open-source : so you can probably customize it for your specific use case. More specifically modify line that allow to pick the theme https://github.com/lichess-org/lila/blob/64b6f7966c8ed48dc90... With one of the value given here : https://github.com/lichess-org/lila/blob/64b6f7966c8ed48dc90... ie : replace in stomSelector lila.puzzle.PuzzleTheme.mix.key by lila.puzzle.PuzzleTheme.defensiveMove.key and run a custom lichess as explained in the ReadMe
In X-Ray Defence
When you open Lichess to solve a puzzle: - The server sends all puzzle information, including the solution, to the client - The client is responsible for validating your moves - The client is also responsible for telling the server whether you have solved the puzzle or not. However, the client does the 3rd step by just sending a request with some formdata, which has a key called "win". Basically, the client does not send your sequence of moves to the server to have the server verify them but directly sends whether you solved the puzzle or not. Many, including me, have discovered this bug independently and tried to report it to Lichess. I've tried contacting Lichess 2-3 years back when I originally discovered this, but Lichess has always responded with "puzzles aren't competitive; exploiting them doesn't matter." (https://github.com/liches
Read the rest
s-org/lila/issues/16393#issuecommen...) Admittedly, they are correct: puzzle rating doesn't really matter. So, here's a little web app I made to exploit this. You just need to copy and paste your LILA2 cookie from Lichess. Requests are made through a proxy to set the Origin header. The source code is at: https://github.com/bittere/lisolve
In Lisolve: Exploiting the Lichess Puzzle System
> - l: Probably some length? I don't understand why the author didn't just look this up in the source code. Lichess is open source and we can see exactly what this field is here, it's the average lag: https://github.com/lichess-org/lila/blob/45b5f0cfbbf6c045ad7... send = (t: string, d: any, o: any = {}, noRetry = false): void => { const msg: Partial<MsgOut> = { t }; if (d !== undefined) { if (o.withLag) d.l = Math.round(this.averageLag); if (o.millis >= 0) d.s = Math.round(o.millis * 0.1).toString(36); msg.d = d; } if (o.ackable) { msg.d = msg.d || {}; // can't ack message without data this.ackable.register(t, msg.d); // adds d.a, the ack ID we expect to get back } const message = JSON.stringify(msg); ... Which is calculated from how long the server takes to respond to ping mes
Read the rest
sages that the client sends: private schedulePing = (delay: number): void => { clearTimeout(this.pingSchedule); this.pingSchedule = setTimeout(this.pingNow, delay); }; private pingNow = (): void => { clearTimeout(this.pingSchedule); clearTimeout(this.connectSchedule); const pingData = this.options.isAuth && this.pongCount % 10 == 2 ? JSON.stringify({ t: 'p', l: Math.round(0.1 * this.averageLag), }) : 'null'; try { this.ws!.send(pingData); this.lastPingTime = performance.now(); } catch (e) { this.debug(e, true); } this.scheduleConnect(); }; private computePingDelay = (): number => this.options.pingDelay + (this.options.idle ? 1000 : 0); private pong = (): void => { clearTimeout(this.connectSchedule); this.schedulePing(this.computePingDelay()); const currentLag = Math.min(performance.now() - this.lastPingTime, 10000); this.pongCount++; // Average first 4 pings, then switch to decaying average. const mix = this.pongCount > 4 ? 0.1 : 1 / this.pongCount; this.averageLag += mix * (currentLag - this.averageLag); pubsub.emit('socket.lag', this.averageLag); this.updateStats(currentLag); };
In What happens when you make a move in lichess.org?
> the player who committed more blunders lost 86% of the time In some sense this is almost tautological. While finding an exact definition for a chess blunder isn't straightforward, here is one example from the Lichess UI: https://github.com/lichess-org/lila/blob/b527746b179cdde6438... Basically, if you make a move which decreases your winning probability more than 14% over the best move, that's a blunder. But winning probability is a nonlinear function of stockfish centipawns. A drop in 100 centipawns when you're up 15 points isn't a blunder. When the game was equal, it is. Point is, by the time you know it's a blunder you already know something about the outcome of that move, that it swung the winning probability by more than 14%. So the analysis is kind of just measuring some function of winning probability and saying that it is highly
Read the rest
correlated with winning probability.
In Avoid blundering: 80% of a winning strategy

Showing the 15 most recent of 48 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.