Inspiration

More than a quarter of Americans over 65 live alone, and about one in four older adults falls each year. When you're the daughter two hours away, the question on your mind is rarely "what happened at the door?" It is "is Mom up and about today?"

Security cameras answer the first question. Nothing in the home answers the second without a wearable to charge, new hardware, or a camera pointed at the person. Yet a Ring doorbell, an indoor camera and a door sensor already record the shape of an ordinary day: up around 7:40, the aide rings at 10, a parcel at noon and brought in by one. What tells you something is wrong is the absence of those events.

Ring's own Appstore lists "Elderly care monitoring" as a category it is waiting for. Porchlight is built to be that app.

What it does

Porchlight learns a person's ordinary day from four weeks of Ring Event History. When a day looks wrong, it checks in gently, first with the parent and then with family.

  • Quiet morning: no sign of life by the check-in time it learned (the latest usual start plus 45 minutes).
  • Unusually quiet: active earlier, then silent far longer than this person's normal quiet stretch.
  • Doorbell not answered: the scheduled aide rang and nobody opened the door within 4 minutes. This is urgent.
  • Package still outside: Ring's own package_delivery classification starts a timer (90 minutes, or 45 when the home reads 30 °C or more, or 5 °C or less). When it runs out, Porchlight takes a privacy-masked doorbell snapshot and asks a vision model on Amazon Bedrock whether the box is still there.
  • Front door at night: the door sensor opens during quiet hours. This is urgent, and the alert includes an infrared snapshot.
  • Home too hot or cold, water, CO, camera offline: a nudge first, then family. Porchlight also says when it can't see, instead of failing silently.

The escalation ladder. The parent always gets the first chance, through a chime and a big "I'm OK" button on their screen, or by voice: "Alexa, tell Porchlight I'm OK." Then they get a text. Only then is the primary caregiver alerted, and after that the rest of the circle. One tap of "I'm on it" stops everyone else being woken. When it resolves, everyone who was told gets an "All clear".

Family dashboard: today's timeline against the learned routine, open check-ins with exactly what Porchlight has done so far, an evening note, and "Ask Porchlight" ("Did the delivery get brought in?"). Rose's screen: a large-type home display for the parent that says plainly what the family can and cannot see. Alexa+: "Alexa, ask Porchlight how Mom's doing","…check on Mom", "…I'm handling it". Status answers come with an MCP Apps card for screen devices.

Rose's TV (Fire TV): most older parents already watch TV every day, so Porchlight also lives there. On the Fire TV, Rose sees a large clock, a greeting and today's care visit, with the same promise as her home screen: the family can't see inside her home. When Porchlight checks in, one calm card fills the screen and is read aloud, with one big button ("I'm OK", or "I brought it in"), and a press of OK on the remote answers it. When the doorbell rings, the TV shows the privacy-masked Ring snapshot and who the care schedule says is due, such as "Ana (home aide) is due at 10:00 AM". That comes from the schedule, never from recognizing a face.

Privacy and dignity by design

  • Nothing inside the home is ever viewed. Indoor cameras contribute only "there was movement at 7:41".
  • Snapshots are taken only when a decision depends on one, or when the doorbell rings so Rose's own TV can show who is there, and only from the front door. A doorbell snapshot is never sent to a model. Ring privacy zones from configurations are blacked out before any model or person sees the image. Cameras with end-to-end encryption are skipped, and Porchlight asks a person instead.
  • Who gets told, and when, never depends on a model. The rules and ladder are deterministic and covered by tests. AI only writes the evening note, answers questions and looks at the porch. Anything uncertain ("unsure", or confidence below 0.6) becomes "ask a person", never a guess.
  • Each family member chooses which check-ins reach them. Quiet hours silence the chime. One click deletes all data.

How I built it

Ring Partner API, through ring-partner-kit, a typed, zero-dependency TypeScript client I wrote for this project and released separately as open source:

  • GET /v1/devices?include=status,capabilities,configurations,location discovers everything in one round trip. Roles are proposed from capabilities, because Ring has no device-type field, and chimes are detected by audio.customizable_slots.
  • GET /v1/history/devices/{id}/events, with composite filters and page[key] pagination, learns the routine from 28 days of history. In live mode against the Developer Playground it is also the event feed.
  • Webhooks (motion_detected with sub_type, button_press, contact sensor, temperature, device_offline/online) are verified with HMAC-SHA256 over the raw bytes (X-Signature), deduplicated on meta.request_id, and answered fast, with processing afterwards.
  • POST /v1/devices/{id}/media/image/download (latest_in_range, PNG, 303 to a pre-signed URL) gives the porch checks and night snapshots, with privacy zones masked in a pure-TypeScript PNG decoder and encoder.
  • POST /v1/devices/{id}/media/audio/playback plays the good-morning and reminder chimes. It is gated on online state, snooze and enabled slots, and never retried, because a retry is a second sound in someone's home.
  • POST …/media/streaming/whep/sessions gives the family a "Live view" button over WebRTC.

Ring's computer-vision guidelines recommend a tiered funnel, and Porchlight follows it. Ring's free sub_type classification is stage 0, and the paid model runs once per decision, never once per motion event.

Amazon Bedrock (Converse API): image plus text in, with a strict JSON contract for the porch check (default amazon.nova-lite). A text model (default amazon.nova-pro) writes the evening note from structured facts only. A Bedrock API key (AWS_BEARER_TOKEN_BEDROCK) is enough to turn it on.

Strands Agents SDK (TypeScript): "Ask Porchlight" is a Strands agent on Bedrock with six tools over Porchlight's records and the live Ring camera: get_day_summary, get_open_checkins, get_recent_activity, get_usual_routine, check_porch_now and get_devices. It is told to answer only from tool results and never to guess about health or who a visitor was.

Alexa+ via MCP: /mcp is a self-hosted MCP server built with the official TypeScript SDK on Streamable HTTP, protocol 2025-11-25, with 8 tools (get_status, get_day_summary, check_porch, send_check_in, acknowledge_check_in, resolve_check_in, resident_im_ok, ask). Status tools link an MCP Apps UI resource (ui://porchlight/status-card.html). The Alexa+ tab in the app is a simulated host that is a real MCP client (initialize, tools/list, tools/call, resources/read) and shows the JSON-RPC traffic.

Fire TV app: apps/porchlight-tv is a native Fire OS app in Kotlin with Jetpack Compose for TV (androidx.tv:tv-material), modelled on Amazon's hello-world-fire-tv sample. It is another client of the same server: GET /api/state, the /api/events server-sent event stream, POST /api/resident/ok and /api/resident/package-inside, and /api/snapshots/:id for the doorbell picture. Read-aloud uses Android TextToSpeech, and the network code is plain HttpURLConnection with no Google Play Services. It follows the Fire OS manifest rules (LEANBACK_LAUNCHER, leanback and touchscreen not required, a 320×180 banner, minSdk 28 for Fire OS 7), with large type, WCAG AA contrast and a focus state you can see from the sofa, with no zoom or glow.

A contract-faithful Ring simulator in ring-partner-kit serves the same REST shapes, signs real HMAC webhooks and renders porch snapshots. The five scripted demo days run through it end to end.

Tests: 41 (npm test), covering the SDK, the rules engine, end-to-end scenarios over HTTP and the MCP endpoint.

Challenges I ran into

  • No webhooks in the Developer Playground. Live mode polls Event History every 15 seconds. The engine treats webhooks and polling as one deduplicated stream, so production can use webhooks with polling only filling gaps.
  • Event History has no motion sub_type. Telling a delivery from a person in history takes one unfiltered query plus five filtered ones (motion.human, motion.package_delivery, …), tagging each event by the filter that returned it.
  • links.next never goes away. It appears even on an empty page, so a loop that follows the docs never ends. The kit stops on an empty page or a repeated cursor, with a page cap.
  • The official hello-world sample authenticates webhooks with a Bearer token, not the documented HMAC X-Signature. I wrote the verifier from the API reference instead.
  • Designing for dignity. The hardest product decision was the order of the ladder: the parent first, always, and the family only when the parent doesn't answer.

Accomplishments that I'm proud of

  • Porchlight works with hardware the family already owns, and it never needs to look inside the home.
  • The decisions are deterministic and tested, and the models are fenced in with an explicit "ask a person" path.
  • It respects Ring's own guidance: the computer-vision funnel, privacy zones, end-to-end encryption, UX rules (device names, not IDs; online state in text; WCAG 2.2 AA colors) and one-click delete.
  • ring-partner-kit is something other Ring developers can use today, simulator included.

What I learned

The most useful signal in a home is often the one that didn't fire. And for a caregiving app, the most important design choice is who gets asked first.

What's next for Porchlight

  • Real SMS and voice-call steps on the ladder. Family alerts already work as real phone push through ntfy.sh.
  • Ring sensors and chimes on real hardware, once Early Access opens. Today they are built to the documented contract and exercised against the simulator.
  • Multi-home circles (a parent and an in-law), and a weekly trend note: "Mom has been getting up 40 minutes later this month."
  • On Fire TV, a check-in only appears while Porchlight TV is open (it is the ambient screen). Next: interrupt whatever is playing, as a Fire TV notification or picture-in-picture card, so Rose sees it during a show.
  • Publishing on the Ring Appstore.

Porchlight is not an emergency service or a medical device. It notices absence and asks people to check.

Built With

  • alexa-plus
  • amazon-bedrock
  • amazon-nova
  • compose-for-tv
  • fire-os
  • fire-tv
  • jetpack-compose
  • kotlin
  • mcp-apps
  • model-context-protocol
  • node.js
  • ring-developer-playground
  • ring-partner-api
  • strands-agents
  • typescript
  • webrtc
  • whep
Share this project:

Updates

Submission history