Blocks promotional Android notifications and keeps the ones that matter. A 19 MB model runs entirely on your phone — no account, no server, no notification ever uploaded.
Get ₹200 cashback on your next orderAn offer. You lose nothing by never seeing it.
₹200 cashback credited to your walletA record of your money moving. Same words, opposite meaning.
A keyword filter cannot separate these. That pair, in twelve scripts, is most of what the model was trained on.
notification arrives ├─ on your allowlist? → KEEP never classified ├─ OTP / debit / delivery? → KEEP a 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 in two, each part 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