
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
About the author
HI there 👋
I'm Nir Adler, and I'm a Developer, Hacker and a Maker, you can start with me a conversation on any technical subject out there, you will find me interesting.
Comments
Join the discussionNo comments yet. Be the first to comment.
DIY
Building your own ESP32 tools and projects. Security labs, IoT automation, and maker experiments. Learn through creation, understand through building. If you can imagine it, you can make it.






