Inspiration
Every "is mum okay?" product solves the easy half: detect an anomaly, push a notification. In a real household that fails twice a week — she slept in, she was in the garden, the cat tripped the hallway camera. After the third false alarm the family mutes the app, and now it is worse than nothing. We wanted the house to take the first step, the way a good neighbour knocks before calling anyone.
What it does
- Learns a rhythm from 14 days of Ring event history (
GET /v1/history/devices/{id}/events): first and last presence per day (median ± MAD so one 3 am bathroom trip doesn't redefine "morning"), hourly presence probability (which also yields quiet hours), and the p90 waking gap. - Watches today through Ring webhooks (v1.1 envelopes, HMAC-SHA256
X-Signatureverified against the raw bytes before parsing). - Knocks first: when the morning never starts, or the house goes quiet for longer than this
household ever does, it plays a check-in chime on the Ring Chime
(
POST /v1/devices/{id}/media/audio/playback) and waits ten minutes. - Any sign of life is an answer — motion, a doorbell press, a door event. A step past a camera closes the incident silently. No phone, no app, no button, which is the point for someone who doesn't carry a phone around the house.
- Escalates only after two unanswered knocks, to family, with the last sign of life, what the
home already tried, and a single still (
POST /v1/devices/{id}/media/image/download). - Leaving through the front door earns an away grace period; vehicle motion is never a sign of life; it never knocks during learned quiet hours; it stands down even after escalating if she walks past a camera.
How we built it
- Next.js 14 (App Router) + TypeScript.
lib/rhythmis pure —step(state, events, model, now)returnsknock / escalate / resolveactions and nothing else — so the escalation policy is covered by 22 unit tests rather than hope. lib/ring: a thin Partner API client (server-side only, as Ring requires), webhook types, and constant-time signature verification.lib/sim: a synthetic household (14 days of history, four scenarios). The sandbox replays every synthetic event through the real signed/api/webhook/ringroute, so the demo exercises the same parse → verify → engine path as production traffic.POST /api/liveswitches the same dashboard to a real account from a Ring Developer Playground token;scripts/ring-probe.tsinspects an account from the terminal.- The family message is assembled deterministically first, then a model is asked only to rephrase it: Ollama on the home hub → Bedrock → the rules sentence. A fact gate rejects any draft that drops the pre-written "last sign of life" sentence or introduces a clock time that is not in the evidence.
Challenges
- The local model turned "14 days learned" into "last sign of life was 14 days ago" — in a message to a worried family. That draft is now a regression test, and the gate ships the rules version whenever a model fails it.
- Getting the knock timing right without a physical Chime: the Playground/sandbox exposes synthetic devices and events, so the demo runs against the same endpoints the production path uses, and the engine never sees Ring types directly.
Accomplishments
A caretaking design that respects the person being cared for: it asks her first, it treats walking to the kitchen as a valid answer, it records nothing continuously, and it only pulls a family in when the home itself could not get an answer.
What we learned
Ring's event history is enough to learn a household's rhythm without any wearable — and the chime is a surprisingly humane output channel.
What's next
Multi-camera households (component_id), a weekly "how was her week" summary for family, and a proper OAuth account-linking flow for long-lived installs.
Built With
- amazon-bedrock
- amazon-ring
- next.js
- node.js
- ollama
- playwright
- react
- ring-partner-api
- typescript
- vitest
Log in or sign up for Devpost to join the conversation.