BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
Finds the moves that cost you games in your own lichess or chess.com games, shows you why, and trains you on them until they stop. Free, no account, no ads.
GamesJavaScript · HTMLGitHub @thatsiavashOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A free chess trainer built on your own lichess or chess.com games. It finds the moves that lost you games, explains them, and trains you on them until they stop. Stockfish runs in your browser.
Taken from the repository README
Loading the full README.
Read the full README ↗A free mistakes trainer built on your own lichess or chess.com games.
It reads your rated games, runs Stockfish in your browser to find the moves that cost you, names each mistake (a hanging piece, a fork you walked into, a mate you missed) and trains you on those exact positions, spaced out, until they stop happening. After each position you see why: what your move allowed, the better move played out, and what really happened in your game. Insights rank your mistakes by the games they decided.
One static HTML file plus the engine. No server, no account, no ads. Your games and progress are saved in this browser, not on our servers. notlichess uses Microsoft Clarity to see how the site is used: it records clicks and screens, with all text hidden, and the site says so on the landing page, in the footer and in Settings. The page never calls Clarity's consent API: Clarity applies its own consent mode to visitors from the EEA, the UK and Switzerland (no cookies until a consent signal).
Serve this folder with any static file server (for example
python3 -m http.server) and open it. The engine runs in a Web Worker, which
browsers do not allow from a file:// page.
index.html: the whole app (HTML, CSS and one script), built from src/sw.js: the service worker, so the app opens offline (it keeps the page, the manifest, the icons, the font and Stockfish)fonts/: Nunito, the page's font, served from this site (SIL Open Font License, fonts/OFL.txt)src/: the source. page.html is the page, app.css the styles, and js/ the script in parts, joined in the order in js/ORDERbuild.py: joins src/ into index.html (and refuses any em dash)test/: checks for the chess core, with sample data (see test/README.md)sf/: Stockfish 17.1 lite, compiled to WebAssembly (see sf/README.md)tools/: scripts that built the peer baselines (and the retired opening book) from the Lichess open databaseEdit src/, then:
python3 build.py
npm install # once, for the linter
npm test
npm run lint
Commit src/ and the rebuilt index.html together. If you touched the mistake explanations, run
npm run explain and review git diff test/explanations.txt before committing.
The earlier version, with the opening trainer, puzzles and Play tab, is kept
in git: tag v1-full-platform and branch archive/full-platform.
Render serves the repo root as a static site: no build command, the root as
the publish directory, index.html as committed. Set these headers in the
static site's settings (Headers):
| Path | Header | Value |
|---|---|---|
/sw.js | Cache-Control | no-cache |
/ | Cache-Control | no-cache |
/index.html | Cache-Control | no-cache |
/sw.js is served from the root, as JavaScript, with no redirect (no
redirect or rewrite rule may catch it): browsers refuse a service worker
that comes through a redirect, and a copy held by the CDN would keep every
player on an old version./ and /index.html are revalidated on every visit (the service worker
asks with no-cache, and the ETag makes that a 304), so a deploy shows on
the next visit.Vary: * on any file the service worker keeps (the page, manifest.json,
icons/, fonts/, sf/): the browser's Cache API refuses such a response..wasm files as application/wasm, the type browsers need to compile
Stockfish as it downloads.After each deploy, two checks:
curl -sI https://notlichess.org/sw.js
curl -sI https://notlichess.org/
The first shows 200, a JavaScript type (application/javascript or
text/javascript), cache-control: no-cache and no location. The second
shows the new etag (it changes with each deploy of index.html) and
cache-control: no-cache.
A normal deploy needs nothing more: the page comes from the network first on
every visit, and a change to Stockfish, an icon or the font comes with a new
VERSION in sw.js (npm test names the value). The off switch is for an
emergency: players stuck on a broken page or cache that a normal deploy does
not reach, for example after a bug in sw.js itself. Deploy this as /sw.js
in place of the normal one (the same code is test/sw-off.js):
/* notlichess.org: the service worker's off switch. In an emergency, deploy
this file as /sw.js in place of the normal worker (README.md, Deploy):
it takes over from the worker in charge at once, deletes every cache
named notlichess-* (no other) and unregisters itself. It has no fetch
handler, so every request goes to the network, as if there had never
been a worker. To return to the normal worker, deploy sw.js from git. */
'use strict';
self.addEventListener('install', function () { self.skipWaiting(); });
self.addEventListener('activate', function (event) {
event.waitUntil(caches.keys().then(function (names) {
return Promise.all(names.filter(function (n) { return n.indexOf('notlichess-') === 0; }).map(function (n) { return caches.delete(n); }));
}).then(function () { return self.registration.unregister(); }));
});
Browsers fetch /sw.js again on the next visit (the page registers it on
every visit with a player, and an app left open checks hourly). The off
switch takes over at once, deletes every cache named notlichess- and
unregisters itself; from then on every request goes to the network, as if
there had never been a worker. Nothing of the players' is lost: their games
and progress live in localStorage, not in those caches. While it is
deployed the app does not open offline.
To return to the normal worker, deploy the repo's sw.js again: the page
registers it on the next visit, and the app opens offline again.
All of this was checked on Chromium only (headless, against a local server). Before a release, check by hand on an iPhone (Safari), an Android phone (Chrome) and desktop Firefox and Safari: a first visit, a reload with no network, a new deploy picked up on the next visit, and the two checks above after the deploy.
fonts/ with its licence (the latin subset as Google Fonts serves it, from the @fontsource-variable/nunito package)sf/ with its licensetools/MIT licensed.