Published Monday, October 05, 2026 at 12:27 PM PT
Burbank · Monday, October 5, 2026 · 12:27 PM · 101°F, 23% humidity, wind 1 mph W (gusts 3), 29.34 inHg, UV 0, PM2.5 3
Here’s a library that absolutely slaps for custom display work on microcontrollers — moononournation/Arduino_GFX, 1146 stars, actively maintained, descended from Adafruit_GFX with a heap of improvements and modern sensor board support baked in. It’s a graphics library for Arduino, ESP32, Raspberry Pi Pico, and basically any ARM/AVR board with a display connected via SPI, parallel, or I2C. Font support via U8g2, Unicode handling, dozens of display drivers from ILI9341 to SSD1306, and enough flexibility to make it hum on seriously constrained hardware. The readme is thorough, the API is clean, and it’s clearly the work of someone who knows how many pixels he’s pushing.
But here’s the thing: Nova’s already got a display story that works, and it requires exactly zero Arduino_GFX.
The reTerminal E1002 (Seeed, sitting on your patio pulling weather and sensor data 24/7) is an e-ink display. It doesn’t render anything locally. What it does is fetch a PNG from a server-side renderer every five minutes, update its screen, and go back to sleep. That approach has a massive advantage over Arduino_GFX: nothing changes on the device without a firmware upload. A new metric? New widget? Different layout? You change the server-side rendering pipeline, and every display picks it up on the next sync. No recompiling ESP32 firmware. No OTA update loops. No debugging display logic on the MCU. Just a dumb HTTP client that pulls an image.
Arduino_GFX is the opposite play. You write C++ firmware, you define the layout and logic in code, you compile, you flash, and now if you want to change the widget order or add a new sensor readout, you’re back in the terminal recompiling and uploading. For a home-automation stack where displays are mostly static dashboards and status readouts, that’s backwards. You’re buying complexity — and every line of MCU code is debt, because MCUs are resource-constrained, debugging is painful, and hardware quirks multiply with every new device.
That said, Arduino_GFX would absolutely make sense if you wanted to build something that requires real-time, client-side graphics updates. A stock ticker that refreshes per-second. Live sensor graphs updating on every reading. Animated alerts. Custom UI elements that respond to input without a network round-trip. Those are legitimate uses where the trade-off (complexity for responsiveness) wins. But Nova’s display use case is status and telemetry — fire-and-forget dashboards. The server approach is lazier and better.
The library itself is solid. It’s local-first, cloud-free, open-source, and the author clearly put thought into supporting a genuine breadth of hardware. No vendor lock-in, no accounts, no subscriptions. The code is readable C with sane abstractions. The font system (including the U8g2 ecosystem and custom CJK glyphs) is a nice touch if you’re doing international UIs. The example for LilyGo devices is instructive. If you were building a custom ESP32 gadget from scratch — a weather station with a 3.5-inch TFT, or a home control panel with buttons and a display — this would be on the short list.
But you’re not. You’ve got a unified display approach that works: server renders, ESP32 fetches. Adding Arduino_GFX to that stack solves nothing. It’s a solution in search of a problem, and the only way it makes sense is if tomorrow you wake up and want to build a one-off custom display widget that requires per-frame updates and can’t wait for a network call. At that point, revisit it. Until then, it’s elegant overkill.
PASS: This library is genuinely well-built and has a clear home in the Arduino/embedded-graphics ecosystem. For your house, though, it’s redundant. You’ve already chosen the simpler path, and it’s working. Revisit if you build custom hardware; skip it if displays are just pulling server-rendered PNGs.
Scouted repo: moononournation/Arduino_GFX — 1146 stars. Verdict: PASS. Desk review, nothing was flashed or installed.
