All work

NoRing

Private call and message protection built for Android's hard edges.

A Google Play Android product for call and messaging protection, localized across 30 languages. The engineering centers on a deterministic, on-device decision path that respects Android's five-second call-screening window, keeps private content on the device, and remains predictable across system roles, retries, and partial failure.

Role
Founder & Product Engineer
Platform
Android · Kotlin · Jetpack Compose · Telecom/Telephony · Room
Status
Google Play · 30 languages
Period
Nov 2025-Present
Visit NoRing
NoRing protection overview showing call and SMS protection status.
The protection overview keeps call and SMS state visible in one place.

Project evidence

5 seconds
Android call-screening window
10
on-device SMS categories
30
supported languages
5 minutes
repeat-caller safeguard

The platform constraint

A decision has to be correct before Android stops waiting.

Android gives a call-screening service five seconds. The critical path therefore cannot depend on remote work, slow provider access, or loosely ordered heuristics.

I kept provider IPC and non-critical operations out of that path and designed fail-safe behavior for the moments when the system could not know enough in time.

Explainable behavior

Explicit precedence beats a pile of competing rules.

The decision engine evaluates user rules, contacts, outgoing-call history, and learned exact-number or pattern behavior in an explicit order. A five-minute repeat-caller safeguard adds another deliberate exception for urgent retries.

The result is deterministic behavior that can be explained to the user and tested as a sequence of decisions, rather than an opaque score.

System map

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.

  1. 01Incoming call

    Android screening request

  2. 02Explicit user rules

    Highest-priority allow or quiet choices

  3. 03Known relationship

    Contacts · outgoing-call history

  4. 04Local learned behavior

    Exact number and number-pattern behavior

  5. 05Repeat-caller safeguard

    Five-minute exception

  6. 06Fail-safe decision

    Return within Android's five-second window

  • Incoming call connects to Explicit user rules.
  • Explicit user rules connects to Known relationship: no explicit match.
  • Known relationship connects to Local learned behavior: still unresolved.
  • Local learned behavior connects to Repeat-caller safeguard.
  • Repeat-caller safeguard connects to Fail-safe decision.

First-party product material

NoRing, in product.

NoRing call history showing the reason behind each local decision.
Protected call history explains whether a user rule or local pattern made the decision.
NoRing messages interface with inbox and quieted views.
The messaging experience separates visible and quieted conversations while retaining familiar inbox behavior.
NoRing privacy screen stating that calls, messages, and phone numbers remain on the phone.
The privacy surface makes the on-device boundary explicit.

Native product state

The UI, local database, and Android providers all change on different clocks.

I built the Compose application around reactive MVVM and repository-driven state. StateFlow, SavedStateHandle, and lifecycle-aware coroutines keep UI, Room, and system-provider state consistent across pagination, process recreation, retries, partial failures, and changes to the default-SMS role.

The same product supports full SMS/MMS and multi-SIM workflows without moving message content off-device.

On-device classification

Important messages stay visible; unwanted messages stay quiet.

The SMS protection engine classifies messages across ten semantic categories using content, sender type, contacts, and conversation history. Explicit sender and conversation rules run before automatic filtering.

That ordering keeps OTPs, transactions, and other important messages visible while separating promotions and suspicious messages. Classification is deterministic and remains on the device.

Private production code

About the source code.

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.