The Photo Frame I Didn't Have Time to Fix
Description and use
Photoframe was migrated from Google Photos to self‑hosted Immich, updated for Raspberry Pi OS Bookworm, and hardened for daily use across multiple Pi models and display resolutions.
Problem
Google Photos Library API was cut, preventing the photoframe project from accessing user photos, and the project needed to run reliably on various Raspberry Pi models and display resolutions.
Outcome
The photoframe project was successfully migrated from Google Photos to Immich, made compatible with Raspberry Pi OS Bookworm, and hardened for daily use on multiple Pi models and display resolutions. A strict release gate and automated agent workflow ensured reliability.
Workflow
- 1. Identify Immich as photo source and map albums to photoframe keywords.
- 2. Implement Immich API key authentication and /immichconfig route.
- 3. Update Flask error handling and add memory‑aware image selection.
- 4. Replace tvservice with framebuffer fallback and add health checks.
- 5. Add exponential backoff retry logic for network failures.
- 6. Implement clean shutdown handling and hide credentials from logs.
- 7. Build a headless Lite image with pi-gen and CI under QEMU.
- 8. Establish a release gate: all changes must be tested on Pi hardware before tagging.
- 9. Release v3.0.0‑rc2 after multiple independent reviews and extended Pi 4 testing.
Evidence
Google cut the Photos Library API down to photos an app uploaded itself, and a frame that reads your library has nothing left to read.
The fix was obvious on paper: teach photoframe to talk to Immich.
A pull request became the vetting gate for the release flow.
- Record date: 2026-10-10T16:41:15.969Z