Inspiration

Sixty-three million Americans are family caregivers (AARP & National Alliance for Caregiving, Caregiving in the US 2025), and many live far from the person they look after. Alexa Together, Amazon's caregiving subscription, ended in May 2025. What's left is a choice between calling every day, which feels like checking up on her, and a camera, which feels like spying. Timer alerts ("no activity by 10 am") can't tell a lie-in or a weekend away from an emergency, and they miss the changes that build up over weeks.

Jirani is Swahili for neighbour: someone who notices when your curtains stay closed, knocks first, and only calls your family if you don't answer.

What it does

Meet Margaret, 79, who lives alone in Columbus, Ohio; her daughter Amina in Seattle; and Joe next door, who has a spare key.

  • Learns her rhythm, not her picture. Jirani builds a baseline from Ring signals: door and contact sensors, doorbell motion and presses. Video is off by default.
  • Remembers what she said. "I'm at my sister's this weekend" becomes a plan. When the house is silent that weekend, nobody is bothered.
  • Asks her first. When a morning breaks pattern and nothing she said explains it, Jirani climbs a ladder: a voice check-in and a check-in card on her Fire TV ("I'm OK" / "Call Amina"), then Joe ("Could you knock?"), then Amina with the evidence (which expectation broke, by how much, what context was checked, who was asked and when). Only at that level, and only if Margaret agreed in advance, can Amina see the front door. Jirani never calls 911 itself; at the top of the ladder it suggests it, with a summary ready. It never unlocks a door or acts on the home: it only asks, tells and explains.
  • Notices slow drift. A weekly report flags changes too slow for anyone to see, like night-time bathroom trips rising over three weeks, in plain words. It suggests a conversation with her doctor and never diagnoses.
  • She stays in charge. "Jirani, pause for two hours." Family sees that it's paused, not why.
  • Starts gently. The first nudge is a soft tone on a Ring Chime, following Ring's documented audio-playback recipe. It's simulated in the demo: no real Chime is linked, and the app says so.
  • Shows the front door only when it counts. At the third level, and only with Margaret's consent given in advance, Amina can open a 28-second view of the front door through Ring's WHEP live view. The public site plays a labelled replay of the Ring Developer Playground's simulated stream, so judges don't need a Ring token.
  • Speaks her language. The voice client and the TV card work in English and Spanish.
  • Closes its own false alarms. If late events show she was fine all along, the alert closes itself and says so.

How I built it

  • Statistics decide; the LLM only explains. The rhythm engine (packages/core) is pure TypeScript with no I/O and no LLM: robust baselines per signal, thresholds like "later than her median wake time + max(2.5 robust SD, 45 min)", and a drift test that compares the last 7 lived-in days against up to 21 earlier days with a guard week, so a slow rise isn't learned as normal. On 40 simulated households it caught a three-week rise in night trips in 31 of 40 and falsely flagged 0 of 40 steady routines.
  • Ring: a typed client for the Ring Partner API (devices, status, capabilities, event history, user), run against the real API with a Ring Developer Playground token, plus HMAC-SHA256 verification of Ring's webhook v1.1 payload (including Ring's contact-sensor event names). Live view uses Ring's WHEP endpoint, tested live against the Playground (1280×720, closes itself at 28 s); the Chime nudge follows Ring's documented status → configurations → audio-playback calls, tested against Ring's example payloads.
  • Alexa+: a self-hosted MCP server, spec 2025-11-25 over Streamable HTTP, with 10 tools (tell_jirani, answer_checkin, pause_monitoring, how_is_she, why_alert, weekly_report, …). Each speaker only gets their own tools: Margaret's pause control isn't available to family, and the front-door camera isn't a tool on her side. Alexa+ add-on tools aren't open to hackathon entrants, so the /talk voice client and the TV card are the Alexa+-style front end: a simulated Alexa+ experience making real MCP calls.
  • The agent: a Strands agent on Amazon Bedrock running Amazon Nova 2 Lite (EU inference profile, temperature 0). It reaches Jirani only through the MCP server, must cite what the tools returned, and says "I don't know" otherwise.
  • AWS: six Lambda functions behind Function URLs and EventBridge Scheduler, one DynamoDB table with Streams, Amazon SES for emails to Joe and Amina, Secrets Manager for the Ring HMAC key and API token, all in AWS CDK (eu-north-1).
  • Surfaces: Amina's phone dashboard and a /talk voice client (Next.js on Vercel, Clerk sign-in), built on a fork of Amazon's ring-api-helloworld; Margaret's check-in card in Amazon's react-native-multi-tv-app-sample, running on the Vega Virtual Device.
  • Test data: the Ring Developer Playground has no sensors and records no events, so I built and open-sourced ring-routine-sim (on npm). It generates weeks of one household's Ring-shaped events with drift you can inject, and replays them signed exactly like Ring signs webhooks.
  • 113 automated tests (the demo scenarios, ladder, drift statistics, webhook, Chime, MCP, agent wiring, CDK stack); CI on every pull request with a Codecov coverage badge. Errors from the Lambdas and the dashboard go to Sentry with no personal data. The dashboard was checked on real phones on BrowserStack.
  • Also contributed a multi-day routine scenario to ring-sandbox, another developer's Ring emulator (open pull request).

Challenges I ran into

  • No events in the Playground. Every event-driven feature needed realistic data, so the simulator became its own open-source project.
  • The webhook format. My first parser followed an older payload shape. Ring's documented v1.1 payload puts the event in data.type and the device in attributes.source, and contact sensors are contact_sensor_faulted / contact_sensor_cleared. Fixed in Jirani and the simulator together, with tests that parse Ring's documented examples verbatim.
  • Region constraints. My AWS project lives in eu-north-1, where models are only callable through inference profiles and CloudFormation can't create a budget.
  • Races. The every-minute evaluator could run during a replay and leave a stale "no morning activity" alert open, so alerts now close themselves when late events show activity.

Accomplishments that I'm proud of

  • One story across three surfaces (voice, TV, phone) with no dead ends, and a TV card that Margaret answers with her remote.
  • An honest separation: the numbers decide, the model explains, and every suppressed alert keeps its reason so why_alert can show it.
  • A new open-source package other Ring developers can use today: npx ring-routine-sim.

What I learned

  • Asking the person first changes the whole design: most "alerts" become a gentle question.
  • MCP tool filters per speaker are a simple, strong privacy boundary for an agent.
  • Context ("I'm at my sister's") prevents more false alarms than any threshold tuning.

What's next for Jirani

  • Real Ring contact sensors once Ring's sensor support leaves Early Access, and a real Alexa+ connection to the MCP server.
  • More than one household (one demo household is configured today).
  • Try the Chime nudge on a real Ring Chime (it's built against Ring's documented calls, but Chime Controls is in Early Access and I have no Chime).
  • A production sign-in on Jirani's own domain.

Not a medical device. Jirani describes changes in routine and suggests conversations. It does not diagnose anything and never contacts emergency services itself.

Not a medical device. Jirani describes changes in routine and suggests conversations. It does not diagnose anything and never contacts emergency services itself.

Built With

Share this project:

Updates

Submission history