AWS Builder Center
The First Commit of Our Hackathon Game | WeMakeDevs × AWS (Winners of Ship It Track)

The First Commit of Our Hackathon Game | WeMakeDevs × AWS (Winners of Ship It Track)

An AWS-powered elder-care companion that brings together smartwatch signals, voice agents, and consent-aware family escalation, while exposing the real-world challenges of shipping Bedrock, Step Functions, and DynamoDB under hackathon demo pressure.

Student at MSRIT

Suraksha: an agentic companion that stays quiet until it matters

Deployed Link : https://suraksha.d2dqtm6sqego9a.amplifyapp.com/explore  

Youtube video: https://youtu.be/XVr34XeXvlE 

Glance of the Game
Most elder-care products turn a parent into a dashboard. We wanted the opposite: a companion that lives with Amma on a watch and a tablet, remembers what she asked for, respects what she said to keep private, and only wakes the family when something is actually wrong.
That product is Suraksha. This is how we built it on AWS — and where the platform pushed back.

The problem

Adult children living in another city do not need a live feed of their parent’s day. They need to know that someone is with her when she falls, when she does not wake up, or when she says she feels unwell — without making her feel watched.
Suraksha is family care without surveillance. Most days it says almost nothing. That is the point.

What Suraksha is

Amma (72, Bengaluru) wears a Galaxy Watch and talks to Suraksha on a tablet. Rahul and Priya get a calm family view. They only get a push when the system decides they should.
She can speak a task in Hindi or Hinglish — “remind me thirty minutes after I wake,” “don’t tell Priya about my health,” “if I fall, call my son.” A tool-calling companion agent on Amazon Bedrock turns that into real actions: reminders, check-ins, consent rules, health notes. Long-term memory is a DynamoDB single table of facts, not a chat blob. Every tool call is gated by Cedar before it runs. The model never invents policy; code does.
On the watch: wake, vitals, fall. On the family side: a command timeline and a one-tap respond page when escalation starts.
Suraksha on WearOS

Why we built it on AWS

We needed one region, managed identity, serverless compute that could host a real FastAPI agent runtime, durable orchestration for “ask Rahul, wait, then Priya,” and voice that did not leave AWS.
LayerServices
EdgeWear OS · parent tablet · family web
Front doorAmplify · Cognito · API Gateway HTTP API · Secrets Manager
RuntimeLambda containers (API, worker, escalation)
AgentsStrands-style tools on Bedrock Nova 2 Lite
VoiceAmazon Transcribe (STT) · Amazon Polly (TTS)
Memory & trustDynamoDB · Cedar ConsentGuard · CloudTrail · CloudWatch
Care loopsEventBridge (1-minute sweep) · Step Functions · Web Push
Amplify hosts the Next.js app. Cognito issues JWTs for people. The watch hits a public /ally/watch route with a device key — people and devices are not the same trust model, and API Gateway lets us split that cleanly.

Architecture in one pass

Architecture of suraksha
Reading the diagram top to bottom:
  1. Speak a task — audio goes through Transcribe; the companion agent calls tools on Bedrock; Polly speaks the confirmation back.
  2. Consent before side effects — ConsentGuard asks Cedar on every tool; allow/deny and an audit row land in DynamoDB where Amma can read them.
  3. Watch events — wake and fall enter the API; the EventBridge worker picks up due reminders, wake-window misses, and investigation timeouts every minute.
  4. When it is wrong — a deterministic gate plus a Bedrock judge can start Step Functions: Rahul → timeout → Priya → ask Amma about the neighbour → neighbour only if Cedar allows → failsafe notify-all. Replies come back as push actions with waitForTaskToken.
Solid lines are runtime data. Dashed lines are auth, secrets, and observability.

Hard parts we actually hit

New-account Lambda concurrency is 10

Our first deploy looked fine in CDK and failed in the account. Fresh AWS accounts reject reserved and provisioned concurrency when the regional limit is still 10. Voice turns paid for that with cold starts. We shipped without provisioned concurrency, documented the flag, and planned -c provisionedConcurrency=1 only after a quota increase. Demo timings had to absorb real Lambda wake-ups — not a scripted sleep.

Bedrock inference profiles are not “just a model id”

Nova 2 Lite needed an inference-profile ARN in IAM as well as the model id in env. Getting either wrong meant InvokeModel failures that looked like “the agent is broken.” We made a hard product rule: no silent fallback. If Bedrock is down, the API returns llm_unavailable and the UI says so. That forced a smoke script against every reply schema before we trusted a build.

Step Functions waitForTaskToken and the IAM cycle

Family escalation is not a fire-and-forget SNS blast. Each child gets a callback task; timeout advances the chain; accept stops it. Wiring states:SendTaskSuccess tightly to the state machine ARN created a CloudFormation dependency cycle between the escalation Lambda and the state machine. We had to authorize task-token callbacks more broadly than we liked, document why, and put a failsafe “notify every child” path on States.ALL so a bad task never stranded Amma in limbo.

Secrets Manager does not seed itself from CDK

VAPID keys, the watch device key, and HMAC reply secrets cannot be created as SecureString values by CloudFormation. Deploy order became: write the ally/runtime bundle first, then cdk deploy, then seed users. Skip the secrets step once and the stack comes up with a hollow runtime — a classic “green deploy, red product” failure.

Cedar means the model does not get to write policy

The tempting path is “let the LLM emit a forbid rule.” We refused it. Consent tools render Cedar from fixed templates; Amma confirms with a clear yes; a BeforeToolCall hook evaluates before any side effect. That made family Q&A slower to build and much harder to lie with. Answers must cite records returned this turn, or say not sure / private.

DynamoDB single-table + a one-minute sweep

Reminders are either clock time or “N minutes after wake.” Due work lives on a GSI (due_at#parent). EventBridge invokes the worker every minute. That is cheap and boring — and correct. We considered streaming every watch tick into a heavier pipeline and rejected it; elder care at this scale is sparse events, not a clickstream.

Watch auth vs human auth

Putting the watch behind Cognito would have meant a refresh flow on a wrist. Keeping /ally/watch public with a device key in Secrets Manager was the right trade-off, but it meant the authorizer matrix on API Gateway had to stay explicit: health and watch and escalation reply public; everything else JWT.

What we would do next

Raise the Lambda concurrency quota and turn on one provisioned concurrent execution for the API alias so the first spoken turn is not the coldest. Tighten CloudTrail data events on the table for a clearer Amma-facing audit story. And keep the product rule that made the build honest: the model decides language and judgement; code decides actions; safety does not have an off switch.

Closing

Suraksha works when the architecture stays quiet. Memory under consent, a watch that can interrupt, and a family chain that only runs when the judge says it should — that is the whole system. Most days, Suraksha says nothing at all. On the days that matter, she already knows what Amma allowed her to do.

Teammates

  1. Naomi (@neomi)
  2. Harshendra M (@harshendram)
  3. Shashwath Prabhu (@eliothewizard1278)
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article