···9292 from the hash params on load. Dev uses atproto's loopback client via a Vite plugin (no hosted
9393 metadata needed locally).
94949595+17b. **Granular OAuth scopes — no `transition:generic`.** The client requests exactly the writes it
9696+ performs, nothing more:
9797+9898+ ```
9999+ atproto
100100+ repo:bzh.herve.atmot.result?action=create
101101+ repo:bzh.herve.atmot.stats?action=create&action=update
102102+ repo:app.bsky.feed.post?action=create
103103+ ```
104104+105105+ This is least-privilege (the app can never touch any other collection in your repo) and gives a
106106+ clearer consent screen than the broad `transition:generic`. Verified end-to-end against a
107107+ self-hosted reference PDS (v0.4.5006): PAR → consent (rendered as "Repository: Publish changes" +
108108+ "Bluesky") → token granted with the exact scope → `createRecord`/`putRecord` all succeed. `repo:`
109109+ alone authorizes the `com.atproto.repo.*` write calls; no separate `rpc:` scope is needed. Reads
110110+ (leaderboard, own records) need no scope at all. Trade-off: a PDS too old to parse granular scopes
111111+ would reject authorization outright — acceptable, since `transition:*` scopes are themselves slated
112112+ for deprecation and the reference implementation supports granular today.
113113+95114## Tooling
961159711618. **Dev tooling (Vite/Vitest) bumped to latest majors** to clear all `npm audit` advisories. The
+4
README.md
···104104OAuth in dev uses atproto's loopback client (no hosted metadata needed). In production the SPA serves
105105`/client-metadata.json`, and `client_id` equals that exact URL.
106106107107+AT Mot requests **granular OAuth scopes** (least privilege) rather than the broad `transition:generic`
108108+— write access is limited to exactly the three collections it creates: `bzh.herve.atmot.result`,
109109+`bzh.herve.atmot.stats`, and `app.bsky.feed.post`. See DECISIONS.md (#17b).
110110+107111## Deploy (Cloudflare Pages)
108112109113The git remote lives on [tangled.org](https://tangled.org), so Cloudflare's git-connected builds