Inspiration

Every notification app asks what to silence. None of them can say which apps were worth the interruption, because nobody measures the answer.

What it does

Doorman reads notification metadata on the device and reports signal rate for each app: the share of its notifications you actually open.

The free half is the diagnosis. A weekly interruption count, a per-app bill sorted worst offender first, and an arrival chart showing which hours you are interrupted in.

The paid half, the Doorman, holds the apps you name and delivers them together as one digest at an interval you pick.

Verification codes, calls, alarms, messages, events, reminders and your dialer are never held, whatever you switch on, and neither is anything Android won't let Doorman read.

How we built it

Expo SDK 57 and React Native 0.86, with a local Expo module wrapping Android's NotificationListenerService. The native side owns a SQLite database; aggregation happens in TypeScript. Subscriptions through RevenueCat, opt-in push through OneSignal. No backend, no account, no server. Nothing leaves the phone.

The app ships without QUERY_ALL_PACKAGES and without any AccessibilityService. App labels are resolved only for packages that actually posted a notification.

Challenges we ran into

The denominator. A signal rate built only on user verdicts scored the apps people liked and left the spammers undefined, because the noisiest apps get silence rather than dismissals. Measured over 24 hours on the test phone, every commerce app on it produced zero verdicts.

So an ignored notification counts, a retracted one does not, and a notification younger than 12 hours is undecided and excluded from both sides. Doorman's own interceptions report with REASON_LISTENER_CANCEL and are excluded outright, or the metric would silently corrupt itself while still looking plausible.

Accomplishments that we're proud of

The app is live on Google Play, eleven days before the hackathon's own deadline. The paid tier is a real Play subscription with a 7-day trial, priced in 174 countries. And Doorman scores its own notifications by the same rules as every other app: there is no own-package exemption anywhere in the metric.

What we learned

The honest version of a metric is usually the harder one to compute, and almost every shortcut in this domain corrupts the number while leaving it plausible.

What's next for Doorman

Verifying the USD prices and the trial on a paywall outside India, and a longer window than seven days for people who want a monthly bill.

OneSignal Keep Them Coming Back

OneSignal App ID: e3a2033f-af02-49d8-812b-d8eac7957556

Campaign Push opt-in confirmation was sent on Sep 12, 2026: 1 sent, 1 delivered. Its body says that Doorman's own push counts in your signal rate like every other app, and that claim was then verified on the device.

Push is opt-in. Since 1.0.3, configurePush does not start the OneSignal SDK unless Doorman's own flag, false by default, is on or an unsubscribe is still owed, and the SDK's self-starting receivers ship disabled. An install nobody opted in on registers no device and tells OneSignal nothing. When push is on, setConsentRequired(true) and consent both come before initialize. In-app messages are paused.

Three things are never a push. The digest is built and posted on the device, so no server can know what you were sent. Scheduled re-engagement is not sent at all. And the paid tier is never sold by interruption.

BuildInPublic

45 numbered posts on X from Aug 16 to Sep 30, 2026, plus three Sunday summaries on LinkedIn, every one of them during the build.

What it changed: the signal-rate denominator was rewritten because of it. Posting the metric in public meant having to defend it in public, and the version that counted only dismissals and taps could not be defended once someone asked what happens to the apps you never answer. The daily deadline is also what kept the ship date honest, and the app was on Play on Sep 7.

HAMM

A 7-day free trial on both plans, then USD 4.99 monthly or USD 29.99 yearly, live in 174 countries, with India held at its own prices of ₹290 and ₹1,900 rather than converted. The yearly is half the monthly run rate in both currencies, so the discount reads the same in every market.

The paywall states the trial terms on the screen that sells the subscription. The free half stays free: signal rates, the bill and the arrival chart are never gated, switching an app off is never gated, and Restore is reachable without buying anything.

Results: one purchase completed end to end through Play licence testing on Sep 16, revenue zero. The pricing and the trial are real and live.

Design Award

Look at the bill. One card per app, the bar split into opened, dismissed and ignored, worst offender first, with the signal rate as the headline number.

Then look at Not counted, which shows the rows excluded from the rate instead of hiding them: notifications still in your shade and too recent to call, and the ones the app took back before you answered.

The app is one screen deep everywhere, has no onboarding carousel, and states the permission it needs in the words of what it does with it.

Peace Prize

Attention is taken without a receipt. Doorman issues the receipt, then gives people a way to take the interruption back without uninstalling anything and without cutting themselves off from the people trying to reach them: codes, calls, alarms and messages are never held.

It also refuses the tools that would have made it grow faster. No re-engagement push, no selling the paid tier by interruption, no analytics SDK, no advertising ID, and no backend that could know what you were sent.

Grand Prize

Published Sep 7, 2026. Since then: a production update on Sep 15, subscriptions taken from India only to 174 countries on Sep 18, a 7-day trial added on both plans, 1.0.1 live on Sep 20, 1.0.2 live on Sep 24, 1.0.3 live on Sep 28, 1.0.4 live on Sep 30, and 45 build-in-public posts on X by Sep 30. Revenue so far is zero.

A note on the video

The walkthrough is recorded on an emulator running a demo data set used for store captures, so the app names are generic words and the numbers on screen are not measurements. The paywall near the end is a live screen from a phone.

Built With

Share this project:

Updates

posted an update —

1.0.4 is live on Google Play.

1.0.4, Sep 30

  • A notification Doorman is holding now always has a delivery scheduled behind it, even after you switch the digest off.
  • The code check reads every line of a list and every message in a conversation, and a notification whose content Android won't let Doorman read is never held.

Get it on Google Play

posted an update —

1.0.3 is live on Google Play.

1.0.3, Sep 28

  • With push switched off, Doorman no longer starts the OneSignal SDK at all, so a phone that never switched push on tells OneSignal nothing.
  • While batching is on, notifications Doorman lets through, such as verification codes, now always stay in the notification shade. Android clears a whole bundle when its summary notification goes, so Doorman never holds a summary. Each notification in the bundle is still judged on its own. The on-device test now forms a bundle while batching is on and checks that everything Doorman let through is still there.

1.0.2, Sep 24

  • If Android is blocking Doorman's digest, held notifications now stay held instead of being marked delivered.
  • The digest marks as delivered only what it actually showed you.
  • Switching on push asks for notification permission once, not twice.

1.0.1, Sep 20

  • The paywall says up front that the first seven days are free.
  • The app is no longer locked to portrait, which Play flagged for tablets and foldables.
  • Code shrinking is on, and the install is about 11 MB smaller.

Get it on Google Play

Submission history