Inspiration

We're software engineers who also host on Airbnb. We build and maintain our own smart-home systems, from cameras and networking to property automation. That hands-on experience has taught us the difference between what a device promises and what it actually delivers.

A fellow host managing four short-term rental units raised a question we'd been asking ourselves: How many people are actually coming and going, and does that match the reservation?

With additional guest fees of $25–35 per person per night, undisclosed visitors can mean significant lost revenue over a long weekend. Undeclared pets create another concern: unexpected cleaning, allergens, potential damage, and fees that may never be collected.

The cameras that could help answer these questions were already installed. We wanted to make their recordings useful without requiring hosts to review hours of video.

Initially, we set out to build a people counter. Then we examined five weeks of our own Ring footage and discovered a more fundamental problem: Ring cameras record when triggered, not continuously.

Our busiest camera captured only 11.8 hours of footage across 32 days.

A system reporting zero arrivals during an unrecorded period isn't demonstrating that nobody arrived. It's demonstrating that it has no evidence.

That discovery changed our approach. We stopped trying to produce a number at any cost and started building a system that could explain what it observed, what it inferred, and what it simply couldn't know.

That's Doorcount: an evidence-backed activity monitoring system built around the Ring cameras hosts already own.


What it does

Doorcount connects to a host's Ring account and transforms event-triggered recordings into a searchable activity record. It helps hosts understand people, visits, and animals around their properties while keeping the original footage attached to every finding.

1. Who appeared, and what can the cameras confirm?

Doorcount combines person detection, tracking, entrance-boundary crossings, and multi-camera presence analysis.

Counting line crossings alone isn't enough. Someone can remain clearly visible for several minutes without crossing a configured boundary.

Every camera contributes its own evidence, including periods when nothing was detected. We distinguish three states:

  • seen — A person was detected in available footage.
  • silent — Footage exists, but no person was detected during that interval.
  • no-opinion — No footage is available, so the camera cannot establish what happened.

That final distinction is essential. Missing footage is not evidence of an empty property.

Doorcount also separates tracking IDs from unique people, because one person can generate multiple tracks as the detector loses and reacquires them.

2. What kind of visit was it?

A courier stopping briefly at the doorstep is different from someone entering the property and staying.

Doorcount analyzes the timing, duration, and observed movement patterns of visits, using multiple camera perspectives when available.

On October 18, two cameras corroborated a 13-second doorstep interaction, matching independently verified footage from 14:05:15 to 14:05:28.

The event was an Amazon delivery. Doorcount recognized the short doorstep-visit pattern without identifying faces or reading uniform logos.

3. Were pets or other animals detected?

Undisclosed pets can have financial and operational consequences for short-term rental hosts. Depending on the property, pet fees can range from $25 to $100 per stay, and unexpected animals can require additional cleaning.

Doorcount looks for cats and dogs in recorded footage and makes animal detections available for review.

Across five weeks, our detector flagged animals in 252 clips. But an animal appearing near a property doesn't necessarily mean a guest brought an undeclared pet.

Of those clips, 246 also contained people, including dog walkers passing on the sidewalk. The remaining six showed animals without people, and all six involved wildlife.

This is exactly why Doorcount treats a pet detection as evidence to investigate, not automatic proof of a policy violation.

4. Does activity warrant a closer look?

Doorcount evaluates booking-related rules for potential over-occupancy, late-night arrivals, and undeclared pets.

Findings are accompanied by confidence indicators and recording-coverage context, helping hosts distinguish observations from uncertain inferences.

The undeclared-pet rule is deliberately disabled as an actionable alert until detection reliability improves. External alert delivery is also still being completed.

5. Can a human verify and correct the result?

Doorcount includes a labeling interface that presents recordings alongside the detector's predictions.

Hosts can inspect what actually happened and correct classifications, building the ground truth needed to evaluate and improve the system.

We don't hide uncertain detections to make the results look better. We make them reviewable.

Running continuously since September 17, Doorcount has processed:

  • 7,419 Ring events
  • 3,981 analyzed clips
  • 1,869 detected line crossings
  • 26.2 hours of decoded footage
  • 5 cameras across 2 properties

How we built it

Ring Partner API

Doorcount uses Ring OAuth for account linking, HMAC-verified webhooks for incoming events, and signed media downloads.

When Ring delivers a webhook, we retrieve the associated recording within the approximately 7.5-minute authorized media-access window. Once downloaded, the clip enters our processing pipeline.

Computer vision and tracking

We use YOLO11m at imgsz 1280 for object detection and ByteTrack for tracking.

Hosts configure entrance boundaries directly on real frames from their cameras. Our geometry engine then evaluates line crossings against those boundaries.

We complement crossing detection with presence analysis to capture activity that never crosses a configured line.

Multi-camera evidence

Rather than assuming every camera represents an independent person, Doorcount combines observations across cameras and distinguishes corroborating footage from missing recordings.

This lets us identify when multiple cameras support an observation without multiplying a single visitor into several people.

Data storage

A SQLite ledger stores clips, events, configurations, and observations using internally assigned identifiers.

We deliberately avoid using Ring location or camera names as permanent identifiers because users can rename them at any time.

AWS infrastructure

Our public endpoint runs on an AWS EC2 t4g.nano instance with an Elastic IP. Caddy handles HTTPS using Let's Encrypt, while a systemd-managed reverse SSH tunnel forwards traffic to the processing host.

This replaced a temporary tunnel whose changing hostname caused a 24-hour outage.

Testing

Our redacted submission snapshot contains 759 passing automated tests, including checks that redaction preserved internal references and system behavior.


Challenges we ran into

The documented webhook payload didn't match what actually arrived.

We initially implemented our parser against the documentation. It silently failed to recognize real events.

A webhook that fails during parsing can look exactly like one that never arrived.

After spending most of a day investigating, we began capturing raw webhook bodies and comparing them with the documented structures. That exposed the mismatch and let us correct the parser.

MEDIA_NOT_FOUND didn't explain why media was unavailable.

We encountered the same response in situations involving missing recordings and missing Ring Protect subscription coverage.

We couldn't reliably distinguish those causes through the API information available to us.

When a subscription lapsed, three cameras also disappeared from /v1/devices without an explanation that our application could act on.

We lost 24 hours of footage permanently.

Our initial tunnel stopped forwarding traffic, and we didn't detect the outage quickly enough.

Because the authorized recording-retrieval window had expired, we couldn't recover the missed clips for retrospective processing.

That failure motivated our move to a stable AWS-hosted webhook endpoint.

Video resolution varied dramatically.

Over one month, the same camera produced clips at 2688×1520, 1920×1080, 1280×720, and 640×360.

At lower resolutions, small visual details become unreliable. Our original idea of identifying delivery companies using uniform logos proved impractical.

We switched to analyzing visit behavior and timing instead.

The timestamps didn't agree.

An apparent 30% shortfall in delivery-event matching turned out to be a timestamp interpretation problem.

Ring's recording timestamps and webhook detection timestamps differed by a median of 8.4 seconds in our observations.

We were comparing the same events using different clocks.


Accomplishments that we're proud of

We discovered why an apparently confident pet detector wasn't ready for real guests.

Our animal detector identified 252 clips containing potential animals.

In 246 of them, a person was also present, often someone walking a dog past the property.

The other six showed wildlife without people, all recorded between 3 a.m. and 7 a.m.

One of our clearest examples was a rabbit sitting on the garden steps. The detector classified it as COCO class 15, cat, with 0.751 confidence.

The model had no rabbit category to choose from.

We also found two false dog detections involving someone handling a wheelie bin at night. The combined shapes of the person and bin resembled a four-legged animal.

Those detection boxes measured 560×547 and 555×701 pixels. By comparison, the 95th-percentile animal detection box in our data measured only 148×148 pixels.

We now flag unusually large animal detections for review instead of silently suppressing them.

The important outcome isn't that we found a rabbit. It's that we prevented that rabbit from becoming an accusation against a guest.

Our undisclosed_pet rule remains disabled for actionable alerts. Incorrectly charging a guest because wildlife crossed the garden would damage the trust we're trying to build.

We expose errors instead of hiding them.

Filtering out difficult cases can make a dashboard appear more accurate without making the underlying system more reliable.

Doorcount retains questionable detections and gives users the evidence needed to investigate them.

Presence analysis recovered visits missed by line crossings.

We independently reviewed footage from three cameras and established that a cleaner appeared at the property six times in one day.

Line-crossing detection found three of those six visits on one camera and five on another.

Presence analysis recovered all six.

It's a small validation example, not a general accuracy benchmark, but it demonstrated why presence and crossing detection should complement each other.


What we learned

Coverage is as important as the detector.

We spent weeks improving computer vision before realizing that recording availability was often the bigger constraint.

No model can detect activity in footage that was never recorded.

That insight changed how we present every result: camera coverage and uncertainty must be visible alongside the detection.

Track IDs are not people.

One person walking toward and away from a property generated three tracking IDs — 13, 35, and 37 — within a single clip.

At one point, our interface displayed "12 people" for footage containing only two.

The interface now correctly reports "12 tracks."

A visit isn't always a single activity.

Our original labeling approach attached a category to an entire visit. Labeling an arrival as the owner unintentionally changed other arrivals during the same period.

At a lived-in property, one long activity window might contain household members, cleaners, couriers, and visitors.

We learned to separate individual observations from broader visit windows.

Security tests must distinguish denial from absence.

Our first tenant-isolation test passed even when the authorization gate was missing, simply because the requested file didn't exist.

It took three attempts to make the test reliably distinguish an unauthorized request from a missing resource.

A test that passes regardless of whether a security control exists doesn't establish that the control works.


What's next for Doorcount

Deliver actionable notifications.

Our detection and rule-evaluation pipeline is implemented and tested, but external notifications haven't yet reached an end user.

Integrating Amazon SES is the next step.

Earn a defensible accuracy number.

We deliberately publish no overall precision or recall claim yet.

Our labeling tool is ready, but the labels/ dataset is still empty. The existing corpus provides material for evaluation, including 252 clips with animal detections, 1,681 clips with person detections, and several identified false-positive patterns.

We want measured performance before making commercial accuracy promises.

Make pet alerts dependable.

Before activating the undeclared-pet alert, we need to distinguish pets from wildlife, passing dog walkers, and false detections.

More importantly, an animal detection must not be mistaken for proof that an animal entered the rental or belonged to a guest.

Resolve detector licensing for commercial deployment.

We plan to replace or appropriately license the current detector before offering Doorcount as a paid product.

Explore property caretaking.

The same activity timeline may support property-monitoring and caretaking applications.

However, detecting prolonged inactivity requires sufficient recording coverage. We won't treat a lack of camera events as proof that nobody was present.

Scale recording storage.

Our footage corpus already occupies 62 GB and grows by approximately 3.7 GB per day.

Moving recordings to Amazon S3 is our next storage priority.

Our goal is simple: Turn the Ring cameras hosts already own into useful operational intelligence — with the evidence behind every conclusion and the honesty to say when the evidence isn't enough.

Built With

Share this project:

Updates

Submission history