tiny
The ring as a fleet endpoint·
Each ring is a tiny fleet endpoint — 'Silver ring', 'Black ring' — reachable with use_device invoke through the phone that holds it.
In 10 seconds
Each ring is a device in your tiny fleet — "Silver ring", "Black ring" — with a presence dot (last sync
< 15 min) and a panel. use_device invoke "Silver ring" "battery" → a ring command the phone claims → a sentence.
No token, no URL, nothing to rotate: the ring is projected from its health-device row. Shipped 2026-09-19 18:50Z.
How it works·
health_devices hd_… ──project──▶ /api/devices kind: endpoint · platform: ring · name: label · via: the phone
use_device invoke "Silver ring" "battery" ──▶ worker /ring/<hd>/api/chat ──▶ ring_command queue ──▶ phone ⇄ ring
use_device list ──▶ online: last sync < 15 min · capabilities: find battery status measure_hr measure_spo2 set_auto_hr sync memo_pull record
| field | value |
|---|---|
| source of truth | health_devices — the fleet row is read-only, never carries a secret, cannot be revoked separately |
| routes the worker hosts | /ring/<hd>/api/telemetry (battery, charging, last HR/SpO₂/temp, steps, firmware, last sync) · /ring/<hd>/api/chat (a prompt → the ring verb it names → result sentence) |
| presence | online: true while the ring synced within 15 min, else false — the same signal as the staleness watchdog |
| panels | web /devices renders telemetry; iOS/Android device lists show the ring kind with its label swatch |
| proof | use_device invoke "Silver ring" "battery" from an agent on prod → "Your silver ring is at 99% battery." |
The ring never speaks HTTP. The endpoint is a projection: everything still flows through the phone gateway's claim loop (Agent tools) and the health platform (Health platform).
The original plan (superseded) — a Mac-hosted ring/serve.py endpoint
The first design (2026-09-19 morning) copied q-the-brain / raspberry-the-pi: a long-lived Python daemon on the
Mac mini holding the BLE central, exposing GET /api/health, GET /api/telemetry, POST /api/control/{find,hr,
spo2,temp,sync,settime}, GET /api/events (SSE) behind a Bearer token at ~/.ring/token, published through a
cloudflared tunnel and registered with POST /api/devices {kind:"endpoint", url}. It was never built: the ring
holds one central, and in daily life that central is the phone — so the endpoint had to be a projection of the
health device the phone already syncs, not a second radio owner. The Mac driver remained the reference and capture
toolkit; ring-cli bridge covers the "ring lives at a desk" case.