Overview
In India, "UPI soundboxes" sit on every shop counter announcing incoming payments so the shopkeeper never has to stop and check their phone. Pakistan has no equivalent except one wallet-locked hardware device. AwaazPay is my answer: an app that turns the shopkeeper's own Android phone into a payment soundbox — every Easypaisa, JazzCash, or bank payment is announced out loud in Urdu or English the moment it arrives. No hardware, no merchant account.
Currently in active development; the code is open on GitHub.
How it works
- Notification-based detection — a Kotlin
NotificationListenerServicereads the wallet apps' own payment notifications. This path is Play Store–safe (no SMS permission) and inherently spoof-proof: it trusts the wallet's package name, which Android won't let another app forge. - SMS fallback for bank alerts — a separate sideload build adds an SMS receiver for bank credit alerts, with a strict anti-scam sender policy.
- Everything survives the app being killed — detection, parsing, deduplication, and TTS all live in the native Kotlin service, not JavaScript. Payments captured while the app is dead queue up and drain into history on next launch.
- Urdu-first announcements — amounts are spoken in idiomatic Urdu (including the "بارہ سو" twelve-hundred style), with English fallback on devices without an
ur-PKvoice.
The interesting engineering
- Anti-scam by design. A fake "you received Rs 5,000" SMS from a random number is the obvious attack. The sender policy only accepts alphanumeric sender IDs and official short codes — personal mobile numbers are rejected unconditionally, enforced both in the UI and again at the native storage layer so it can't be widened by mistake.
- Parser templates are data, not code. The regexes that extract amounts and senders from notification text are JSON templates, designed to be served by a backend later — so when a wallet app rewords its notifications, no app release is needed.
- Built for hostile devices. Budget Android phones aggressively kill background services; onboarding requests battery exemptions and the error states deep-link users to the OEM-specific fix.
Stack
Expo (React Native) with a custom local Expo module in Kotlin — notification listener, payment parser, TTS announcer, and offline queue — wired through a config plugin. Two build flavors: a Play-safe store build and a full sideload build.
My role
Solo: product research (the niche was verified open in Pakistan as of mid-2026), UX design, the React Native app, and all the native Android work.