The topic of I built a $100 ePaper photo frame that never touches the cloud, and it looks like a… is currently the subject of lively debate — readers and analysts are keeping a close eye on developments.
This is taking place in a dynamic environment: companies’ decisions and competitors’ reactions can quickly change the picture.
Digital photo frames have been around for years, and yet, somehow, the best options still require you to hand your photos to someone else’s server. We’ve got Google’s Nest Hub which pulls from Google Photos and Amazon’s Echo Show that pulls from Amazon Photos. Even dedicated frames from the likes of Aura and Nixplay route everything through their own cloud. They all look great on a shelf, sure, but your device is at the whim of those companies graciously continuing to support them as time goes on.
I’ve been tinkering with ePaper displays and ESP32 boards for a while now, and after building everything from productivity dashboards to a basic Kindle, I figured it was time to try something a bit more practical. I wanted a photo frame that pulls from my own library, processes images locally, and never phones home. The result is a setup built on the Seeed Studio reTerminal E1002, Immich, Home Assistant, and ESPHome. The reTerminal E1002 costs $100 from Seeed Studio at the time of writing, and it’s perfect for this kind of project.
It took some work to get right, though it was a lot easier than last time around thanks to the native support ESPHome added for this display. As well, the image quality isn’t going to rival a 4K display anytime soon. But it sits on my shelf, rotates through photos throughout the day, and every piece of the pipeline is something I own and control.
The reTerminal E1001 and E1002 are the end-game of ESP32 ePaper displays, packing expandable IO, an SHT40 temperature and humidity sensor, a buzzer, microphone, and more, all in a metal-frame. The E1001 is a monochrome display, and the E1002 is a full-color display.
The reTerminal E1002 is one of Seeed Studio’s newest ePaper displays, and it’s the reason this project works as well as it does. It’s a 7.3-inch panel running E Ink’s Spectra 6 technologies, which means it has six pigment colors: black, white, red, green, blue, and yellow. These colors get blended at the subpixel level to produce up to 4,096 displayable colors, so while it’s not exactly going to match your phone screen, it’ll still do the job for photos on a shelf.
The real advantage of ePaper for a photo frame is that it doesn’t need power to hold an image. Once a photo is rendered, it just stays on the display without a backlight or any need to refresh, which in turn, means no active energy consumption. The screen looks like a printed photo from across the room, and it doesn’t blast light at you the way an LCD does. From a distance, it can look like a framed print rather than a typical LCD-based photo frame.

The hardware itself is built around an ESP32-S3 with 8MB of PSRAM and 32MB of flash, which is more than enough for what I’m asking it to do. It has a built-in temperature and humidity sensor, three physical buttons, a microSD slot, and a metal frame with a mounting hole on the back. Most of the processing happens in my Home Assistant instance, so all it needs is a buffer large enough to hold the resized image.
The trade-off with a setup like this is the refresh speed. A full screen update takes about 15 seconds because of how the Spectra 6 technologies works. It uses voltage waveforms to push pigments forward and pull others back to create each color, so there’s no partial refresh either. But for a photo frame that updates a few times a day, I really don’t care. It refreshes, the new photo appears, and then it sits there looking good until the next one shows up.
The photo library side of this runs on Immich, which is hands down the best self-hosted alternative to Google Photos I’ve used. It handles automatic backups from my phone, organizes everything into albums, and has a solid API that makes it easy to pull photos programmatically. I’ve been running it on my home server for a while now, and much of the experience feels the same as Google Photos, right down to the mobile app.
The pipline I’ve built works like this: a Python script running through Pyscript on Home Assistant connects to Immich and grabs a random photo from a designated album. This runs on a fixed schedule using Home Assistant automations, taking in the following data:
It then takes the photo it receives and processes it for the ePaper display, resizing it to 800×480 and dithering it down to the Spectra 6 color palette. This step matters quite a lot, because standard image dithering doesn’t account for how ePaper pigments actually look on the panel.
As I experienced when first using this panel, the colors on an ePaper screen are far less saturated than their digital hex values would suggest, so I use calibrated palette values that match the real-world output of the display. The processed image gets saved to Home Assistant’s local web directory, where the reTerminal can fetch it. The ESPHome YAML is incredibly simple for this part, as the paths are dynamically set using substitutions at the top of the file.

I set this up as an automation that runs every few hours, matching the display’s deep sleep cycle. However, I also have a manual trigger through an input boolean in Home Assistant, so I can force a new photo whenever I want. Fetching an image and processing it takes mere seconds, and it’s served to the reTerminal E1002 immediately.
On the display side, ESPHome handles everything. All of the YAML is pretty straightforward, especially given that there is now official support for the panel in ESPHome. When it wakes up from deep sleep, it connects to WiFi, fetches the latest processed image from Home Assistant’s web server, renders it to the display, reports its battery voltage and sensor readings back to Home Assistant, and goes back to sleep.
The deep sleep approach means battery life is fantastic if you’re running it unplugged. With four updates a day, you’re looking at weeks of runtime on the built-in 2,000mAh battery. I keep mine unplugged most of the time, and it’s nice to know I could move it anywhere in my home without having to worry about a cable.
The three physical buttons on the reTerminal give me manual control too. The green button wakes the device and forces an immediate refresh, which is useful when I’ve just pushed some new photos and want to see one right away. I also love that there’s no account, no app, nor a subscription to make all of this work. The entire stack is open source, it runs locally, and if Seeed Studio disappeared tomorrow, the hardware would still work.
This was one of my longer projects, but that’s exactly the reason I enjoy it. A commercial photo frame can set you back several hundred dollars, locks you into a cloud service, and gives you no control over the device itself. Here, though, I can just tear it down and build something else if I want instead, and it’s a lot cheaper, too. If you want to try it out for yourself, I’ve published the Pyscript and ESPHome YAML on my GitHub.
Why it matters
News like this often changes audience expectations and competitors’ plans.
When one player makes a move, others usually react — it is worth reading the event in context.
What to look out for next
The full picture will become clear in time, but the headline already shows the dynamics of the industry.
Further statements and user reactions will add to the story.
