For anyone who'd rather build from source than flash a pre-built release — same firmware, full control, more setup. Just want it running? Flash it from your browser instead →
Download the Arduino IDE from arduino.cc/en/software and install it. Then add Espressif's ESP32 board package:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Open Tools → Manage Libraries... and install each of these (search by name, exact match on the first result). This is the full list — the v2.0 board's physical button and speaker don't add anything here, both run on APIs already built into the core ESP32 toolchain.
| Library | Author | Used for |
|---|---|---|
| GxEPD2 | ZinggJM | Driving the Waveshare e-paper panel |
| Adafruit GFX Library | Adafruit | Fonts and drawing primitives |
| Adafruit BusIO | Adafruit | Dependency of the GFX library |
| Adafruit NeoPixel | Adafruit | Driving the WS2812 LED strip |
| ArduinoJson | Benoit Blanchon | Parsing chess.com and Lichess API responses |
| WebSockets | Markus Sattler (Links2004) | The live RSocket-over-WebSocket connection to chess.com (Lichess needs no extra library — it's plain HTTPS) |
The WebSockets library always appends its own default User-Agent header when building the handshake — even when the caller (this firmware) already supplied one. That duplicate header corrupts the handshake chess.com expects, and the connection drops right after the first frame with no useful error.
Find WebSocketsClient.cpp inside your Arduino libraries folder (typically Documents/Arduino/libraries/WebSockets/src/) and locate the sendHeader() function. Skip appending the default User-Agent line when the caller already provided extra headers containing one. The exact patch and a full explanation of the bug are documented at the top of LiveGameClient.cpp in the firmware source — open that file for the precise before/after code.
With the clock connected over USB-C:
Clone or download the firmware from GitHub:
git clone https://github.com/ivolanski/IvoChess-Clock.git
Open IvoChess_Clock.ino in the Arduino IDE — it'll load the whole sketch (all the .h/.cpp files sit alongside it and load together).
Click Upload (or Ctrl/Cmd+U). First compile takes a few minutes; the ESP32 core and libraries above need to build. Once it's done, the board resets and starts running automatically.
To confirm it's alive, open Tools → Serial Monitor at 115200 baud — you should see startup logs, including whether it found a saved Wi-Fi network or started its own setup hotspot.
The firmware is running — now it needs a Wi-Fi network and a chess.com, Lichess, or ChessConnect connection to actually show anything.