All work

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.

Role
Founder & Product Engineer
Platform
Android · Kotlin · Jetpack Compose · Telecom/Telephony · Room
Status
Shipped Android product / 30 languages
Period
Nov 2025 to present
Visit NoRing (opens in a new tab)
NoRing first-party artwork describing private, on-device call and SMS protection.
NoRing · current first-party product materialNoRing keeps its two protection systems explicit: calls and SMS are handled independently on the phone.

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

  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

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.

Private 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.