tiny
Voice memos·
Voice memos from the ring to your inbox: the media door, storage, transcription and what the agent can do with them.
In 10 seconds
Four taps, a sentence, four taps → the phone pulls the memo → POST /api/health/media → transcribed at ingest →
inbox item and one agent turn: a memo is a message to your tiny, and the one-sentence answer is pushed back.
Proven on prod: "what is the battery level of my silver ring?" → "Your silver ring is at 99% battery." in 28 s.
The door·
POST /api/health/media — device-token auth, like ingest:
{"deviceId": "…", "token": "…",
"kind": "audio_note", "mime": "audio/ogg",
"started_at": "2026-09-19T15:51:40Z", "duration_s": 365.3,
"device": {"name": "JY-Y3-011A"},
"data_base64": "T2dnUwAC…"}
| field | value |
|---|---|
| limits | ≤ 8 MB; sha256 dedupe — the same memo posted twice returns the first id (200), so gateways retry safely |
| storage | R2 under the owner; inbox item ring_memo with attachments[{url, media_id, duration_s}] + push |
| transcript | at ingest (≤ 25 s, OpenAI speech-to-text) — the push body is your first line, the reply carries transcript; a failed pass is retried by health_memos transcribe |
| owner routes | GET /api/health/media · GET …/:id (streams) · PATCH {transcript} · DELETE (also removes the inbox item) |
| driver | ring-cli audio-pull → captures/memo.opus (+.wav) → ring-cli audio-post; the bridge echoes 0x36 only after a 2xx |
A memo is a message·
Right after transcription the worker enqueues a one-shot agent job (ring-memo-<sha>, idempotent per memo): "act on
it exactly as if the owner typed it, reply in one or two sentences". It runs within a minute with the full tool set
(calendar, reminders, memory, devices, health) and the reply is pushed — ✅ 🎙 ring memo 17:45: ….
Off switch: health_alert_rules {memo_agent: false}. Empty transcripts (charger rumble) never start a job.
The button as a hotkey — health_alert_rules {button_prompt}
Taps arrive as button samples (cmd 40) → ring_button event. Set a standing instruction and each tap runs one agent
turn (ring-button-<sha>), reply pushed:
Proven on prod with a synthetic tap: "Your Black ring is at 100% battery, and you've taken 0 steps today."
button_prompt: null turns it back into a plain event. Real tap codes (1|2) are still to be observed from a finger.
Two things real memos taught us
The ring may keep recording long after you stop talking — a 6-minute file held ~30 s of speech; duration is not content. And a local Whisper pass once called a real memo "no speech" while the server found the words — trust the server transcript.
"What did I note this morning?" → health_memos. "Pull my memos" → ring_command memo_pull. Memos are ordinary
inbox items: forward, summarise, turn into calendar events.