Inspiration

Ring tells you when something moves. The questions people actually have about their front door are often about things that never happen or are more complex: did the kids get home from school, did the cleaner leave before guest's check-in time, has that package been sitting on the porch all afternoon? A doorbell that only reports events that occur can't answer those, because the answer is the absence of an event or more are complex. Parents, caregivers, short-term rental hosts and small shops all ask questions like these.

We wanted to be able to say it in one sentence:

"Tell me when the kids get home from school. If nobody's home by 4pm, alert me." "Alert me whenever my cleaner arrives after the guest checkin time 2pm." "Alert me whenever the gardener stays longer than an hour."

What it does

You type what you want watched for. Amazon Bedrock turns the sentence into watch rules and reads them back in plain English, so you can confirm them before anything is saved. After that, every Ring motion or doorbell event is checked against all of your rules in a single Bedrock call. When a rule fires you get an email with the snapshot, and the alert shows up in the app's live feed.

Four kinds of rule come out of ordinary sentences:

Kind Example Fires when
When it happens "Tell me when the delivery van arrives." first seen inside its window, once a day
If it hasn't happened by "If my kids aren't home by 4pm, alert me." the window closes and it was never seen
If it lasts too long "If a package sits on the porch for 2 hours, remind me." still seen after N minutes
During a time window "Any activity between midnight and 5am." anything matching inside the hours

The second and third kinds are the reason the project exists. "Nobody came" and "still there" are exactly what a motion alert can't tell you.

Rules describe what to look for, such as people, objects or vehicles, and never who. Any rule can be paused with one tap.

How we built it

Ring sends Lookout a signed webhook whenever a doorbell sees motion or someone presses the button. Lookout checks the signature, ignores duplicates, and grabs a snapshot of the moment through Ring's Image Snapshot API. It also reads your devices, their status and recent event history.

Amazon Bedrock, running Nova 2 Lite, does two jobs. It turns your sentence into structured rules and reads them back to you before they're saved. Then, for every event, it looks at the snapshot and checks it against all of your rules in one call, returning a caption and a yes or no for each rule with a reason. Each check costs a fraction of a cent, and a daily cap keeps spending predictable.

A cron job runs every minute to catch the rules about things that didn't happen or have gone on too long. Alerts go out by email with the snapshot attached and show up in the app's live feed.

The rule logic is covered by 46 unit tests, including time zones, overnight windows, and making sure an alert never fires twice.

Challenges we ran into

The Ring Playground can't send motion or doorbell webhooks (the organizers confirmed this on the forum), so an event-driven app had no way to receive a real event. We built a feeder, the Demo page in the app plus scripts/feed.ts, that builds Ring v1.1 payloads exactly as documented, signs them with the same HMAC scheme and sends them through the real webhook route. Those events are labelled "Simulated event" in the UI.

Snapshots were the next wall. The Playground device reports offline with an empty history, the pre-signed snapshot URL returns 416 MEDIA_NOT_FOUND, and a malformed request body comes back as 403 REQUEST_FORBIDDEN, which sent us debugging auth for a validation error. The demo falls back to scene images (AI-generated stand-ins for doorbell footage), and the app handles "no frame" cleanly. The official sample also checks a Bearer token while the docs specify HMAC, so we followed the docs.

Absence rules are harder than they sound. "Nobody home by 4pm" has to fire once, at the right local time, across overnight windows and time zones, from a cron that runs every minute. That logic got the most tests.

On the AI side, the model sometimes echoed rule ids with an id prefix, so the parser accepts both forms. Finding the right cross-region inference profile id (us.amazon.nova-2-lite-v1:0) took longer than the integration itself.

Accomplishments that we're proud of

Completing the project, end to end.

What we learned

One Bedrock call can check a frame against every rule at once, which keeps cost flat no matter how many rules you add. Nova 2 Lite follows a strict JSON contract reliably at temperature 0, and the reason it gives is more useful than its confidence numbers, which cluster around 0.95. Writing rules as visual descriptions instead of identities made the privacy line easy to hold.

What's next for Lookout

Ring partner OAuth account linking to replace Playground tokens, per-camera rules, push notifications, and taking a fresh snapshot before sending a "still there" alert.

Built With

  • amazon-bedrock
  • amazon-nova
  • aws-budgets
  • aws-iam
  • aws4fetch
  • hono
  • react
  • ring-api
  • ring-webhooks
  • serverless
  • sqlite
  • typescript
  • vite
  • vitest
Share this project:

Updates

Submission history