Building a GitHub Dashboard on ESP32 E-Paper

I built this mostly because playing with hardware is fun. There's something satisfying about making a physical thing that sits on your desk and actually does something. Plus, let's be honest - having a little e-paper display showing live GitHub stats makes your desk look way more interesting.
Does it solve a problem? Kind of. I can glance at my notifications and contribution stats without opening a browser. But that's the excuse I gave myself. The real reason was wanting to build something cool with an e-paper display and ESP32.
Screens
Press Button (GPIO 39) to cycle through:
Notifications - Reviews, mentions, assignments
Profile - Repos, stars, open PRs, followers
PR Overview - Open, Waiting to review, Ready to merge, Request changes
Each screen fetches fresh data when you switch to it.



Hardware
LILYGO T5 V2.3.1 (~$15-20) - ESP32 with 2.13" e-paper and two built-in buttons:
GPIO 39: Cycle screens
GPIO 0: Force refresh
That's it. Flash and go.
How It Works
Data fetching:
REST API for notifications
GraphQL for profile/activity (smaller payloads)
Only fetches active screen data
Only refreshes display when data changes
Power:
Deep sleep between updates (default 10 min)
Wakes on timer or button press
Web server runs 30 seconds after boot for config access
Web Interface
First boot creates AP: "NotificationHub" (password: configure)
Connect and go to 192.168.4.1

Four tabs:
Dashboard - Status, refresh button
WiFi - Network config, admin password
Providers - GitHub token and username
Settings - Update interval



GitHub Token
Generate a Classic token with:
notificationsread:user
Add it in Providers tab.
Setup
Flash firmware
Connect to "NotificationHub" (password:
configure)Go to
192.168.4.1(or whatever your network assigns)Configure WiFi and admin password
Add GitHub token and username
Reboot
Updates every 10 minutes. Press buttons for manual control.
Built with Arduino MCP
Used arduino-mcp - connects Claude/Cursor to Arduino CLI:
"Compile for ESP32"
"Upload to board"
"Convert this PNG to C array"
Way faster than copy-pasting commands.
Claude Desktop config:
{
"mcpServers": {
"arduino-uvx": {
"command": "uvx",
"args": ["arduino-mcp"],
"env": {}
}
}
}
API Endpoints
GET /api/status # Current status
POST /api/refresh # Force refresh
POST /api/reset # Factory reset
Memory Handling
ESP32 RAM is tight:
Paged API requests
Dynamic JSON buffers
Independent screen state
Display hibernation during sleep
What's Next
Could add:
GitLab/Bitbucket support
Larger displays (4.2" or 7.5")
Historical graphs
Battery indicator
Webhooks for instant updates
3D printed case
Stack
Hardware: LILYGO T5 V2.3.1
Software: ESP32 Arduino, GxEPD2, ArduinoJson
APIs: GitHub REST + GraphQL, NTP
Links
Code: github.com/niradler/github-dashboard-esp32-epaper
Arduino MCP: github.com/niradler/arduino-mcp
License: MIT | Cost: ~$15-20 | Time: 1-2 hours



