Adopts the weather-display pattern: .env file parsed by tools/load_env.py
and injected as -D compiler flags. WIFI_NETWORKS uses "SSID:password" format.
ESP32 now sends a heartbeat POST after each display update so the server
can track frame status for the HA integration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ESP32-S3 firmware (PlatformIO) that fetches JPEGs from a photo server,
decodes on-device with PSRAM, Floyd-Steinberg dithers to the Spectra 6
6-color palette, and displays on a 7.3" GDEP073E01 e-paper panel.
Deep sleeps 1 hour between updates.
Photo server (Python/Flask) with web UI for photo management, Traefik
routing at photos.haunt.house with Google OAuth, and Home Assistant
REST sensor integration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>