Display your GitHub contribution graph on a 16x16 iDotMatrix BLE LED pixel display, powered by an ESP32-S3 running MicroPython.
- uv installed on your computer
- ESP32-S3-N16R8 board
- Anko 16x16 Bluetooth LED Pixel Display (iDotMatrix)
- USB-C cable for the ESP32
makeThis runs uv sync to install esptool and mpremote into a local virtualenv.
# Download the correct firmware (spiram-oct variant):
# https://micropython.org/download/ESP32_GENERIC_S3/
# Select the SPIRAM-OCT variant (.bin file)
# Put ESP32-S3 in bootloader mode: hold BOOT, press RESET, release BOOT
# Erase flash
uv run esptool.py --chip esp32s3 --port /dev/ttyACM0 erase_flash
# Flash firmware (note: address 0x0, not 0x1000)
uv run esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 460800 write_flash 0 ESP32_GENERIC_S3-SPIRAM_OCT-*.bincp src/config.example.json src/config.jsonEdit src/config.json:
- Set your WiFi SSID and password
- Set your GitHub username
- Create a GitHub Personal Access Token at https://github.com/settings/tokens (fine-grained, no extra permissions needed) and paste it in
- Optionally set
ble_device_nameto your display's full name (e.g., "IDM-825058") -- find it using the iDotMatrix mobile app or a BLE scanner
make installThis installs aioble on the device and copies all source files. To use a different serial port (e.g., on macOS):
make install PORT=/dev/cu.usbmodem1101Press RESET on the ESP32 or power-cycle it. The device will:
- Connect to WiFi
- Sync the clock via NTP
- Fetch your GitHub contributions
- Connect to the iDotMatrix display via Bluetooth
- Render your contribution chart
- Repeat every hour
Monitor output via: uv run mpremote connect /dev/ttyACM0 repl
The built-in NeoPixel RGB LED (GPIO 48) indicates the current phase:
| Color | Phase |
|---|---|
| Blue | Connecting to WiFi |
| Purple | Syncing NTP |
| White | Fetching GitHub data |
| Cyan | Connecting to display via BLE |
| Green | Rendering / sending frame |
| Flashing (step color) | Step failed |
| Flashing red | Unexpected error |
| Off | Idle / sleeping |