Keyboard-driven TUI chess client for Lichess, built with Ink and chess.js.
shellchess is a terminal-first client for seeking and playing real games on Lichess without leaving your shell.
- Board-first terminal layout that adapts to terminal resizing
- Lichess OAuth token setup with local config storage in
~/.shellchess/config.json - Real-time board and clock sync from the Lichess Board API
- Keyboard navigation for piece selection and moves
- Promotion picker, resign, and draw offer actions
- Node.js
>=20 - A Lichess API token with
board:playscope
Published package name:
shellchessInstall globally:
npm install -g shellchessThen run:
shellchessYou can also run it without a global install:
npx shellchessOn first launch, shellchess asks for a Lichess token and stores it at:
~/.shellchess/config.json
The file is written with 0600 permissions.
Create a token with:
- Scope:
board:play - Description:
shellchess
shellchessCurrent live matchmaking support is limited to the time controls accepted by the Lichess Board API matchmaking flow.
Arrow keys: move cursorEnter: select piece / confirm moveEsc: clear selection or cancelr: resignd: offer draw
Promotion mode:
Left/Right: choose promotion pieceEnter: confirmEsc: cancel
Install dependencies:
npm installRun the app locally:
npm run devRun checks:
npm test
npm run typecheck
npm run buildIf you want to contribute:
- Fork the repo.
- Create a branch for your change.
- Run the local checks before opening a PR.
- Include screenshots or terminal recordings for UI/layout changes.
For UI work, there is also a local dev board so you do not need to start a live Lichess match every time:
npm run dev:boardDev board shortcuts:
Ctrl-R: reset current presetCtrl-P: switch presetCtrl-O: flip orientation
- The terminal font matters. Some fonts render filled Unicode black chess pieces poorly, so
shellchessuses a stable glyph rendering strategy tuned for terminal compatibility.