尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证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.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 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.