-
-
Someone lingers at the gate at night. Quiet Porch alerts the owner, speaks once, and stays quiet otherwise. Staged test, 2× speed.
-
Every decision timestamped, every silence explained. Quiet Porch's night ledger, shown here as a labelled replay of a synthetic night.
-
Real Ring footage from a staged test, above. Below, a labelled replay of a synthetic night: Quiet Porch acts rarely and shows its work.
-
Last night my camera saw five things. It did nothing about three of them." Meet Quiet Porch, the Ring app that mostly does nothing.
-
Quiet Porch: a Ring private app that mostly does nothing, and can prove it. Silent by design, built for any Ring home.
Inspiration
Four alarms in one night, all of them a family member coming home late. A $1,300 quote to catch and release an armadillo. A camera that reliably reports everything and decides nothing. The pattern was not a detection problem. The detection worked fine. The problem was that every detection became the homeowner's job, so after three months the alerts got switched off.
So we asked what a porch would do if it were allowed to handle things, and if it had to show its work afterwards.
What it does
Quiet Porch runs a night shift on a Ring camera. Signed Ring motion webhooks and the recorded event frames feed a deterministic escalation ladder that stays silent for everything harmless.
When someone lingers, it pages the owner once, turns on the interior light, and at twenty seconds of confirmed dwell it speaks to the person at the gate in a calm voice: "You're on camera at the side gate. The owner has been notified." If the next frame shows an empty gate, the ladder stops and records why.
Every decision becomes one ledger line with the Ring capture timestamp, the age of the evidence it acted on, the level reached, and the reason it stopped. In the morning Alexa+ reads it back: "Five events. Three silent. Two handled."
There is also an "I'm stepping out" command. Say it, and the next ten minutes are suppressed and recorded as expected instead of becoming four alarms.
How we built it
TypeScript on Node 22, running on a Raspberry Pi with Home Assistant alongside a real Ring installation.
Ring motion webhooks arrive signed and verified. The first frames are fetched through the Ring Partner API and described by Claude on Amazon Bedrock: what, where, what they are wearing. That description goes into a deterministic ladder, which is the part that decides. The model never acts.
Each frame is bound to its Ring capture time, so every escalation can be checked against a frame young enough to still show the condition. We decoded Ring live view in a spike, but it carries no absolute capture timestamp, so live frames never trigger an output: incidents run on recorded clip evidence, and the ledger names the source of every frame. The spoken line is assembled from a fixed template with two slots, filtered against a closed vocabulary, synthesized with Amazon Polly and played through the Pi speaker.
The ledger is SQLite and append-only in practice: the line is written before any action fires, never after. The morning report and the "I'm stepping out" command are exposed as Model Context Protocol tools over Streamable HTTP, so Alexa+ can read the night back and suppress a window by voice.
Challenges we ran into
The honest ones, all measured and logged with endpoints, request IDs and timestamps:
The other_motion webhook arrives about eleven seconds after the event, and recordings end ten to fourteen seconds after it, which caps how far an escalation ladder can get on clip evidence alone. That single measurement is why we tried live view; it decoded, but without a capture timestamp it could not be trusted to escalate. Asking for a frame at a timestamp returned 416 in cases the documentation does not cover, and a range query quietly returned the end of the window rather than the moment asked for. One authorization error we hit is not in the documentation at all. Bedrock returns its JSON wrapped in a code fence, which has to be stripped before parsing, and a parse failure now closes the incident at level 0 rather than guessing.
The one that changed the design: Ring's end-to-end encryption means a video request can succeed while returning nothing usable. So an encrypted camera is now explicitly "blind" in the ledger, with the request ID, rather than a night that silently looks quiet.
Accomplishments that we're proud of
The report cannot lie about an output. An action appears in the morning report only when a completed action on the frame that earned the level backs it. We found that gap by adversarial review and closed it, because one false "ran the sprinkler" would end the honesty argument the whole product rests on.
The replay harness takes a recorded night, with its original webhook payloads, frames and model answers, and runs it through the real pipeline on a virtual clock. Three runs have to produce identical ledger lines. That is our cold-start test, and it is also how we rehearse without waiting for a real 2 a.m.
And the headline metric is a negative. Three silent is the number we show.
What we learned
Judging restraint needs a record. Silence is invisible unless something writes it down, which is why the ledger came before the voice.
Also: a probabilistic component is a fine describer and a bad decider. Separating "what do you see" from "what should happen" made the whole thing testable, and made the escalation rules something we could argue about in plain language instead of in prompts.
What's next
It runs as a Ring private app, so it works in any Ring home. A second Ring account is admitted to the same private app; every household after the first is ledger-only by design, with no authority over actuators.
The same ladder answers other questions with the decision rules swapped: a caretaking rung ("she usually comes out by nine, she hasn't"), an accessibility rung that speaks instead of chiming. Native playback through a Ring device speaker rather than a separate speaker is the next integration we would want from the Ring platform.
Built With
- alexa
- amazon-bedrock
- amazon-polly
- claude
- ffmpeg
- home-assistant
- model-context-protocol
- node.js
- raspberry-pi
- ring-partner-api
- sqlite
- typescript
- vitest
- webrtc


Log in or sign up for Devpost to join the conversation.