NoRing
Private call and message protection, launched on Google Play in under a month.
I built private, explainable call and message protection and launched it on Google Play in under a month. I owned the Android app, two on-device protection engines, process recovery, localization in 30 languages, and 10+ production releases in the first three months. NoRing has reached 200+ users without advertising.
Visit NoRing (opens in a new tab)
Project evidence
- 200+ users
- reached without advertising
- ~100 ms
- warm on-device call decisionsMeasured on the warm device path; the fail-open budget separately bounds slow or incomplete work.
- 10+ releases
- first three months of productionFirst Google Play release reached in under a month.
- 30 languages
- localized Android productTen on-device SMS categories alongside a separate call-screening engine.
01 / Reliability where it matters
Make the fast decision useful and the slow path safe.
I built the call-screening path for fast local decisions. Android allows five seconds for a response, so I set a separate 4.5-second fail-open budget for work that cannot finish safely in time.
I moved provider IPC and non-critical operations off the decision path, normalized exact numbers to E.164, and made uncertainty resolve safely. I designed around the platform deadline from the beginning.
02 / Explainable behavior
Give user choices and known relationships clear precedence.
I designed an explicit order for user rules, contacts, outgoing-call history, and learned exact-number or pattern behavior. I added a five-minute repeat-caller safeguard to account for urgent retries, with each decision explained in the local history.
I used roughly 180 days of local call history to bootstrap behavior. That made protection useful without an account or shared reputation network, while keeping the user's rules and relationships ahead of learned behavior.
Published product material
NoRing, in product.




System model
A bounded call-screening decision path
User intent and known relationships take precedence. Learned local behavior is considered only after explicit rules, and fail-safe handling protects the five-second system deadline.
Ordered precedence
- 01Incoming call
Android screening request
- 02Explicit user rules
Highest-priority allow or quiet choices
- 03Known relationship
Contacts · outgoing-call history
- 04Local learned behavior
Exact number and number-pattern behavior
- 05Repeat-caller safeguard
Five-minute exception
- 06Fail-safe decision
Return within Android's five-second window
Connections
- Incoming callExplicit user rules
- Explicit user rulesKnown relationshipno explicit match
- Known relationshipLocal learned behaviorstill unresolved
- Local learned behaviorRepeat-caller safeguard
- Repeat-caller safeguardFail-safe decision
03 / Native product state
Keep protection and the interface coherent across process recovery.
I built the Compose app around reactive MVVM and repository-driven state, using StateFlow, SavedStateHandle, lifecycle-aware coroutines, Room, and DataStore. WorkManager handles imports, retries, and post-call learning so recovery work survives beyond an individual screen or process.
I coordinated app state with Android's system providers and roles. SMS Protection uses the default SMS role and supports SMS/MMS and multi-SIM workflows while keeping message content on device; RCS classification remains outside its supported scope.
04 / On-device classification
Make message filtering reviewable and controlled by the user.
I built a separate SMS protection engine with ten semantic categories, using content, sender type, contacts, and conversation history. Explicit sender and conversation rules run before automatic filtering, so the user's choices take precedence.
I designed the ordering to keep OTPs, transactions, and other important messages visible, with promotions and suspicious messages separated into a reviewable Quieted view. Classification is deterministic and runs entirely on the device.
05 / Delivery
Turn a focused product into a maintained Android release.
I reached the first Google Play release in under a month, localized the product in 30 languages, and continued with 10+ production releases in the first three months.
I owned the full route to production: product behavior, native implementation, permissions and roles, local data, recovery, testing, and release. The two protection engines share a product experience while remaining separate systems with different Android constraints.
Discuss the work
Bring me the next product problem.
I bring product judgment, hands-on leadership, and the engineering depth to take an important problem from the first decision through release. Let’s talk about what you want to build or improve.
The production repository is private. I'm happy to walk through relevant source code, architecture, testing strategy, trade-offs, and implementation decisions during a technical interview.