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.
Visit NoRing
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.
- 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
- 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.



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.