Inspiration

If your mum lives alone, you know the low-level worry. Is she up yet? Did she have breakfast? You don't want to ring every morning and make her feel watched, and you don't want to find out three days late either.

Her home already records the shape of her day. A camera sees the hallway at 07:30, a contact sensor sees the front door at 07:45, the kitchen gets busy just after eight. Those events exist to warn about strangers. I wanted to use them backwards: learn what a normal day looks like, and notice the day it doesn't happen.

Amazon has been here before. Alexa Together did passive check-ins and was discontinued in 2025, replaced by Emergency Assist, which only helps if someone can ask for help. StillThere is for the days nobody can ask.

What it does

StillThere learns an older person's daily routine over about two weeks, then watches for the habits that don't happen.

  • Most days it says nothing. Silence means things look normal. No daily reports to tune out.
  • When something is off, it tells the family once, and says why: "No sign of Jasmine being up yet. She's usually about by half seven, and it's nearly eleven. That's held on 30 of the last 30 days." It only gets in touch again if things get worse, so three messages a day at most.
  • It doesn't cry wolf. A flat camera battery and a person who hasn't got up look identical: silence. Every missing-activity finding is checked against device health first, and a camera that stopped reporting goes to maintenance, never to the family.
  • You can just ask. "Is Mum okay today?", "Why did you message me?", "What's her normal day like?", "She's away next week", "She's back". On an Echo Show the answer comes with a card: today's habits on a timeline, the learned routine, or the exact message that was sent and why.

How it fits Alexa+

StillThere is a self-hosted MCP server on AWS:

  • MCP 2025-11-25 over Streamable HTTP, five tools written to be asked rather than read
  • Every result carries a spoken sentence and structuredContent for a screen
  • Every tool links to an MCP Apps view (ui://still-there/today.html), so a host that supports MCP Apps, as Alexa+ does on Echo Show, draws the answer instead of only reading it
  • Checked line by line against the published Alexa+ MCP requirements: protocol version, Streamable HTTP, remote HTTPS, a bare 401 without WWW-Authenticate, a Bearer token in the header, and a warm round trip of 20 to 85 ms in the function

The Alexa+ MCP Toolkit and simulator are partner-only, as the hackathon FAQ confirms. So, as the track allows, the Alexa+ experience is simulated in a web app: an Echo Show built in React, with speech in and out. It talks to the live server over the public internet. I validated the server with the standard MCP Inspector, which lists the tools, runs them, and renders the MCP App in its Apps tab.

How I built it

StillThere architecture

Two halves.

The watching half runs whether anybody is asking or not. Activity events arrive at a webhook in Ring's documented v1.1 format. Each one is HMAC-verified, classified, deduplicated and stored in DynamoDB. Every 15 minutes EventBridge Scheduler runs an assessment that:

  1. learns the baseline from 42 days of history
  2. checks today against it
  3. checks device health
  4. applies the notification policy

When a family should hear something, Amazon Bedrock (Nova Lite) rewrites the deterministic finding into a readable sentence. That sentence is a proposal, not a decision. It is checked against the same safety rules as the original, and discarded if it speculates about health, claims footage was viewed, drops the clock time, or mentions a habit that was never assessed. Then SNS delivers it.

The asking half is the MCP server in a stateless Lambda. The simulated Echo Show sends a spoken question to Nova Lite with the live tools/list, and the model picks a tool. The spoken reply is the tool's own deterministic text, not the model's prose. So the worst case is a correct answer to the wrong question, never an invented claim about someone's mother. A keyword router takes over if Bedrock is unavailable.

All AWS resources are in Terraform:

  • CloudFront and S3 with OAC and a strict CSP
  • API Gateway HTTP API
  • eight arm64 Lambdas, one IAM role each
  • two DynamoDB tables
  • a customer-managed KMS key
  • Secrets Manager
  • EventBridge Scheduler
  • SNS
  • CloudWatch alarms
  • ACM and Route 53

It runs for about £2 a month.

What's real and what's simulated

Real: the MCP server, Bedrock tool routing and narration, the learned baseline, the assessment, the notification policy, the stored audit trail, and the SNS delivery. All of it runs on AWS now.

Simulated:

  • The Echo Show. It's a web page, labelled as one on screen.
  • The household. Jasmine is a synthetic persona with six weeks of generated history. A nightly job rebuilds her history and today's missing morning, then runs the deployed assessment, so the three messages are produced the real way every day.
  • The demo clock. It moves the time of day only. The date is really today.

No Ring account or physical device was used. The events follow Ring's documented webhook format, signed with a real key from the Ring Developer Portal.

Challenges I ran into

  • Silence is ambiguous. The hardest correctness problem was telling "she hasn't got up" apart from "the camera is offline". Every finding is now checked against device health, and unobservable findings never reach the family.
  • Alert fatigue. An early version messaged on every 15-minute run of a bad morning, which would have meant sixteen texts by lunch. The policy now sends once, then only when severity escalates.
  • Proving it's quiet. I claimed the system avoids false alarms, so the claim needed a number. The test suite lives through 60 ordinary days: 0.00 unnecessary alerts per 30 days for a regular routine, and 1.0 to 1.5 for a deliberately irregular one.
  • The cat. Interior motion isn't always a person. Only human or unclassified motion counts as proof of life, and a door opening is an anchor a pet can't fake.
  • No Alexa+ or Ring access. Neither platform could be tested end to end by an entrant, so I built to the published specs and validated with the tools that were available.

Accomplishments I'm proud of

  • An alert that can explain itself. The reasoning is stored, so "why did you message me?" quotes the exact words sent, which habits were missed, and how reliable each one is.
  • A language model that can't make things up about a person. It routes questions and polishes wording, and it never decides whether to alert.
  • An MCP App that renders in the reference host and in MCP Inspector, trimmed from 520 KiB to 263 KiB.
  • An open-source fix found along the way: botocore printed the values of sensitive parameters, like secrets and passwords, in validation errors. I reported it and opened a PR with tests (boto/botocore#3825).

What I learned

  • Time has to be an argument, never ambient. No function reads the clock, which is why 90 days of tests replay in under a second and the demo can walk through a morning in fifteen seconds.
  • Expiry isn't erasure. When consent is withdrawn, everything is deleted immediately rather than left for a TTL.
  • MCP's split between text and structuredContent lets one server serve a voice-only assistant and a screen without compromising either.

What's next

  • Account linking with OAuth 2.1 and PKCE, the one Alexa+ requirement not met yet
  • Real Ring account connection and device discovery
  • Native Alexa+ onboarding once the toolkit opens up
  • Making the simulated Echo Show a full MCP Apps host

Built With

Share this project:

Updates

Submission history