A dedicated, distraction-free ESP32 device for managing a personal book collection. No phone. No cloud. No notifications.
Tracks read books, manages a TBR queue, logs reading progress, and will eventually generate recommendations, all stored locally in flash.
Hardware
Phase 1 target: ESP32-2432S028 ("Cheap Yellow Display")
ESP32-WROOM-32 · 2.8" ILI9341 320×240 TFT · XPT2046 resistive touch · micro-SD · RGB LED · LDR, one $12 board
Also prototyping: GC9A01 round 240×240 SPI display on bare ESP32 modules.
Non-obvious CYD gotchas (documented for posterity):
- Display (HSPI) and touch (VSPI) are on separate SPI buses, TFT_eSPI breaks, use LovyanGFX
- GPIO 21 must be HIGH before
display.init()or backlight stays off - XPT2046 touch axes are swapped and inverted vs. display, raw X → screen Y, raw Y → screen X, vertical axis flipped
- ILI9341 needs
rgb_order = trueor red/blue are swapped - Board revision roulette: v1/v2 = ILI9341, v3 = ST7789
Firmware Stack
- Framework: Arduino via PlatformIO
- Display: LovyanGFX ^1.1.16
- Storage: LittleFS (no SD needed for v1)
- WiFi: WiFiManager captive portal, no hardcoded credentials
- Books API: Google Books OAuth device flow (QR code on screen → auth on phone) + OpenLibrary fallback
- OTA: ArduinoOTA over local WiFi
Local-first Data Model
/books.json - title, author, status, date read /progress.json - active reading sessions /settings.json - calibration, tokens, prefs
Everything lives in flash. No account required. No sync.
Roadmap
| Phase | |
|---|---|
| 1 | Hardware bring-up, display + touch confirmed working |
| 2 | Book list UI, add/complete via touch |
| 3 | Google Books / OpenLibrary sync |
| 4 | Reading streaks + stats |
| 5 | On-device recommendation logic |
| 6 | Custom PCB |
| 7 | Custom Acrylic Casing |
Julia M