What's New
- Large images now process on the device. The image pipeline was rewritten to stream row by row instead of holding full-resolution buffers in RAM. Photos that previously failed with out-of-memory errors — especially on high-resolution panels like the 1872×1404 reTerminal E1003 — now processand display directly on the frame. Large PNGs decode as a stream, never
holding a full copy in memory. - Grayscale (GC16) panels convert correctly on-device. Dedicated 16-level grayscale decode and dithering (linear-light error diffusion against your panel's calibrated ramp) replaces the 6-color path that produced wrong tones. Black & white and grayscale sources render properly.
- New Scale Mode setting: Cover or Fit. Choose whether photos crop to fill the panel (Cover) or letterbox with a clean white or black background (Fit). Applies to on-device processing and syncs with the server, the mobile app, and Home Assistant (companion releases: server v1.15.0, HA integration v2.10.0, app v1.4.0).
Improvements
- On-device processing now matches epaper-image-convert exactly: gamma-space resampling, calibrated gray ramps, and per-channel dynamic-range compression — pure white backgrounds render clean, with no red speckle.
- Rotation follows your configured display orientation instead of guessing from each image's aspect ratio.
/api/current_imagereliably reflects what's on the panel across every display flow, serving the original image or its thumbnail; direct uploads stream straight to the panel with no file round-trip.- Settings edited on the device or via Home Assistant now advance the config revision, so a server-side sync can no longer revert them.
- New host-based test suite covering the image pipeline, the current-image/thumbnail lifecycle, and orientation handling.
Installation
Web Flasher (Easiest)
Flash directly from your browser (Chrome/Edge/Opera required):
https://aitjcize.github.io/esp32-photoframe/#flash
Manually
Choose the appropriate merged binary for your board:
photoframe-firmware-waveshare_photopainter_73-merged.bin: For Waveshare 7.3" 7-color e-paperphotoframe-firmware-seeedstudio_xiao_ee02-merged.bin: For Seeed XIAO EE02photoframe-firmware-seeedstudio_reterminal_e1002-merged.bin: For Seeed reTerminal E1002photoframe-firmware-seeedstudio_xiao_ee04-merged.bin: For Seeed XIAO EE04photoframe-firmware-seeedstudio_reterminal_e1004-merged.bin: For Seeed reTerminal E1004photoframe-firmware-seeedstudio_reterminal_e1003-merged.bin: For Seeed reTerminal E1003 (10.3" grayscale)photoframe-firmware-seeedstudio_xiao_ee03-merged.bin: For Seeed XIAO EE03 (10.3" grayscale)
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 write_flash 0x0 photoframe-firmware-[board]-merged.bin