On-device promotional notification filter for Indian Android. Nothing leaves your phone.
Same words, opposite meaning. One is an offer you lose nothing by never seeing; the other is a record of your money moving. Keyword filters cannot tell them apart.
notification ├─ on your allowlist? → KEEP (never classified) ├─ OTP / debit / delivery? → KEEP (rule, not a probability) └─ otherwise → model p ≥ 0.9724 → BLOCK
An OTP never reaches the model. The rule layer fires on 3.8% of traffic at 99.2% precision — a classifier gives you an average, and a one-time password needs a guarantee.
| Script | Test rows | KEEP-recall | Promo F1 |
|---|---|---|---|
| Latin / Hinglish | 2436 | 0.997 | 0.911 |
| Devanagari | 178 | 0.990 | 0.946 |
| Bengali | 260 | 0.995 | 0.864 |
| Telugu | 23 | 1.000 | 1.000 |
| Gurmukhi | 22 | 1.000 | 0.769 |
| Kannada | 20 | 0.909 | 0.947 |
Tamil, Malayalam, Gujarati, Odia, Assamese and Urdu are trained but have too few test rows to quote a number honestly.
The APK ships without the model. Cloudflare Pages caps files at 25 MiB, so the 32 MB model is gzipped to 20.9 MB and split into two parts, each SHA-256 verified on arrival and again after reassembly.
GET /models/manifest.json
GET /models/model.onnx.gz.000 10.5 MB
GET /models/model.onnx.gz.001 10.5 MB
→ concat → gunzip → verify sha256 → cache on device