From 51237d66ef82394397af492ea88a5e7506d0d69d Mon Sep 17 00:00:00 2001
From: Brad Barnett <127794626+bdbarnett@users.noreply.github.com>
Date: Wed, 23 Sep 2026 16:33:03 -0500
Subject: [PATCH] google_photos README: what Publish app needs, the 403 for
unlisted testers, and a Privacy section
---
lib/examples/google_photos/README.md | 29 ++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/lib/examples/google_photos/README.md b/lib/examples/google_photos/README.md
index 92761acc..bcaa25a6 100644
--- a/lib/examples/google_photos/README.md
+++ b/lib/examples/google_photos/README.md
@@ -47,12 +47,18 @@ token for hour-long access tokens.
1. **Google Cloud project** — : create a
project (any name), then *APIs & Services → Library → enable
**Google Photos Picker API***.
-2. **OAuth consent screen** — user type *External*. Fill in the app name and
- your e-mail. Then either **publish to Production** (an unverified app is
- fine for personal use; Google shows a warning you click through once) or
- stay in *Testing* and add your account as a test user. Testing refresh
- tokens expire after **7 days**, so Production is the one that keeps
- working. A Google Workspace account can use *Internal* instead.
+2. **OAuth consent screen** (*Google Auth Platform* in the current console)
+ — user type *External*. To keep the sign-in working indefinitely,
+ **publish the app to Production** on the *Audience* page. Google keeps
+ *Publish app* greyed out until the *Branding* page has an app name, a
+ support e-mail, a home page URL and a privacy policy URL; this example's
+ page and its [Privacy](#privacy) section serve for the last two. An
+ unverified app is fine for personal use: the sign-in shows a "Google
+ hasn't verified this app" warning once (*Advanced → Go to …*).
+ Alternatively stay in *Testing* and add your account under *Test users*,
+ but Testing refresh tokens expire after **7 days**, and an account that
+ isn't listed gets "Error 403: access_denied". A Google Workspace account
+ can use *Internal* instead.
3. **Credentials** — *Create credentials → OAuth client ID → Desktop app*.
Download the JSON (`client_secret_….json`). It has to be *Desktop app*:
a *TVs and Limited Input devices* client downloads as an identical-looking
@@ -101,6 +107,17 @@ The slideshow interval is `slideshow_s` in the prefs file (default 5).
Override with `GPHOTOS_TOKENS`, `GPHOTOS_PREFS`, `GPHOTOS_CACHE`.
+## Privacy
+
+This example has no server. Everything it stores stays on your own PC or
+board, in the three files above. It talks only to Google: the one-time
+sign-in (`accounts.google.com`, `oauth2.googleapis.com`), the Photos Picker
+API (`photospicker.googleapis.com`), and the image links Google returns for
+the photos you picked. It can't see any photo you didn't pick. The QR code
+is drawn on the device, not fetched from a service. To revoke its access,
+remove the app at and delete
+the tokens file.
+
## Images on each platform
Google serves JPEG (PNG for PNG originals). LVGL decodes: