Play a chess game over Meshtastic using Web Serial or Web Bluetooth. The UI runs in the browser and exchanges moves directly between radios.
This project is mostly vibe coded.
- Zero server. Pure radio-to-radio chess.
- Random handshake picks colors and a shared game ID.
- Move-count sync to detect stalls and recover missing moves.
- Web Serial and Web Bluetooth connections
- Lobby channel with matchmaking and direct connect fallback
- Random handshake to pick colors and a shared game ID
- Move-count sync and reconnect checks
- Simple, single-page UI
- A browser with Web Serial or Web Bluetooth support (Chromium-based)
- Two Meshtastic radios on the same mesh
- Recommended: add the
GameLobbychannel before playing
- Serve the folder with any static file server.
- Open
index.htmlin your browser, or play it at https://kb1jdx.com/chess-meshtastic/. - Click Connect Serial or Connect Bluetooth to pair with your radio.
- Use the lobby to invite or direct connect to an opponent.
- Wait for the handshake to assign colors, then play.
- After connecting, the app performs a handshake to pick colors and start a game.
- Moves are transmitted over the mesh.
- If a move is missing, the app uses move counts to retry and resync.
index.html: UI and game logicmeshtastic-chess.js: Serial framing + Meshtastic protobuf handlingmeshtastic_bundle.json: Protobuf schema bundlevendor/protobuf.min.js: Protobuf runtimejs/meshtastic.bundle.js: @meshtastic/js bundle (BLE)js/meshtastic.js: bundle loaderimg/GameLobby.png: QR code for the lobby channel
- The opponent node ID can be entered as
0x...,!..., or decimal. - If you need to reset a game, use Reset Game.
- This is a lightweight experimental project, not a full client.
- Lobby channel details:
- Name:
GameLobby - PSK:
OpLah30Ci9oMvUDbXRGVcw3C55TOgUpQ23fxnYPpq2I= - Recommended to add it before playing for smooth matchmaking.
- QR code:
img/GameLobby.png
- Name:
- Licensing: the app uses the original third-party sources by default.
If you want offline copies, download these into
lib/:
- If the handshake never completes, confirm both radios are on the same channel and the opponent node ID is correct.
- If moves do not transmit, reconnect and try again to re-run the handshake.
- If you see "Connection lost. Retrying...", the app is re-syncing move counts.
- Meshtastic team and community
- Chessboard.js and Chess.js
- @meshtastic/js (GPLv3)