Find phone numbers, UPI IDs, Aadhaar, PAN, card and bank numbers, emails, names and addresses in a message, and hide them before you save, show or send it. English, Hinglish, Hindi and other Indian languages, in a 8 MB library.
Free up to 10k monthly active devices · No API key · On Maven Central · Android, iOS, desktop, web
This is the actual Hideout library, compiled to WebAssembly and running in your browser. Type a message with made-up personal details and watch them get caught. Your text never leaves this page.
Found
Hidden
No server, no API key, no per-request bill. The text you are protecting is never sent anywhere to be checked.
Indian phone formats, Aadhaar (also masked), PAN, UPI IDs, IFSC, voter ID, driving licence and vehicle numbers, addresses with PIN codes and Indian names, in English, Hinglish, Hindi and other Indian languages.
Each item comes with its type, exact character offsets and a confidence score. Hide everything, only some types, or replace with your own style like 98•••••210.
Pure Kotlin inference. There is no ONNX Runtime, TFLite, ML Kit or native code, and it runs on Android (minSdk 21), iOS, macOS, JVM desktop, JavaScript and WebAssembly, from Kotlin or Java.
Prices, times, order IDs, UPI transaction refs, PNRs and cities stay visible, so hidden messages still make sense.
Real output from the sample app on an Android emulator. These are not mockups.
"Call me on [PHONE], my UPI is [UPI]"
"Mera naam [NAME] hai, aadhar [AADHAAR]"
"मेरा नंबर [PHONE] है"
Order IDs and prices stay as they are.
The Kotlin Multiplatform sample app, built from the published artifacts, gives the same result on Android, iOS, desktop and the web.

Call me on [PHONE], my UPI is [UPI]

Call me on [PHONE], my UPI is [UPI]

Call me on [PHONE], my UPI is [UPI]

Call me on [PHONE], my UPI is [UPI]
One line in your Gradle file, from Maven Central. Works in commonMain for Android, iOS, macOS, JVM desktop, JavaScript and WebAssembly. No API key, no account.
// build.gradle.kts: commonMain, or any platform source set
dependencies {
implementation("io.github.rajumark:hideout:2.0.0")
}
// Gradle picks the right artifact per platform:
// hideout-android · hideout-jvm · hideout-iosarm64 · hideout-iossimulatorarm64
// hideout-macosarm64 · hideout-js · hideout-wasm-js
Add Hideout from rajumark to this Kotlin Multiplatform or Android project.
What it does: on-device personal info detection. It finds phone numbers, UPI IDs, Aadhaar, PAN, card and bank numbers, emails, names, addresses and more in text and hides them. English, Hinglish, Hindi and other Indian languages. ~8 MB, no dependencies, no network.
Install (Maven Central, no extra repository):
build.gradle.kts (commonMain or any source set): implementation("io.github.rajumark:hideout:2.0.0")
Platforms: Android, iOS, macOS, JVM desktop, JavaScript, WebAssembly
Usage:
val hideout = Hideout() // off the main thread, keep one instance
val safe = hideout.hide(message) // "Call me on [PHONE], my UPI is [UPI]"
val items = hideout.find(message) // type, start, end, text, score for each item
Repo: https://github.com/rajumark/hideout#readme
Add the dependency, then follow the README for the exact API and current version.
Load once and reuse the instance. find() and hide() are thread-safe.
val hideout = Hideout()
hideout.hide("Account no 50100234567812, IFSC HDFC0001234")
// "Account no [BANK_ACCOUNT], IFSC [IFSC]"
hideout.find("Call Rahul on 98765 43210")
// [Pii(NAME, 5, 10, "Rahul", 0.998), Pii(PHONE, 14, 25, "98765 43210", 1.0)]
hideout.hide("OTP is 482913", replacement = { "*".repeat(it.text.length) })
// "OTP is ******"
hideout.close()
try (Hideout hideout = new Hideout()) {
String safe = hideout.hide(
"Call me on 98765 43210, my UPI is raju@okaxis");
}
Anywhere people type things they shouldn't share.
Stop users sharing phone numbers, handles or UPI IDs in the first messages, or warn them before they do.
"text me on 98765 43210" → text me on [PHONE]Mask Aadhaar, PAN, card and account numbers before a message is saved, logged or sent to an analytics or AI service.
"PAN BKLPS4821K, card 4532…" → PAN [PAN], card [CARD]Strip personal details on the device, then send only the safe text to an LLM, a translator or a search index.
hide() on device → send the restBlur OTPs, passwords and addresses in text you are about to share or show on screen.
"OTP is 482913" → OTP is ******Real problems Hideout solves today. Pick one and ship it.
Dating apps · Stop users sharing phone numbers or Instagram handles in the first messages.
Marketplace chat · Keep deals on your platform by blocking phone numbers and UPI IDs in chat.
Safe LLM prompts · Strip personal details on the device, then send only safe text to an AI model.
Support chat logs · Mask Aadhaar, PAN and card numbers before a message is saved or logged.
Crash & bug reports · Scrub personal info from logs and bug reports before they are uploaded.
Safe screenshots · Blur OTPs, card numbers and addresses before a user shares a screenshot.
OTP leak warning · Warn "Never share your OTP" before a user sends one in chat.
Clipboard guard · Alert users when they copy an Aadhaar or card number.
Screen-share mode · Hide personal details on screen while presenting or streaming.
Bank SMS reader · Mask account and card numbers when showing transaction SMS.
Private notes · Hide Aadhaar, PAN and passwords in notes until the user taps to reveal.
Kids safety · Stop kids sharing their phone number or home address with strangers.
Game chat · Block phone numbers and social handles in chat with minors.
Delivery apps · Hide customer phone and address once the order is delivered.
Health apps · Mask names and IDs in patient notes before they sync to the cloud.
Feedback forms · Remove personal info from free-text feedback before storing it.
Anonymous HR feedback · Remove names and contacts so employee feedback stays anonymous.
Smart form autofill · Pull the phone, email and address out of a pasted message to fill a form.
Privacy-safe search · Index chats and notes for search without storing personal data.
Clean analytics · Send text events to analytics with every personal detail already masked.
Hand-written chat messages in 14 languages, written after the model was trained and never used to build or tune it, plus held-out test sets. "Hidden" = the whole item is covered; "left alone" = messages with no personal info where nothing was hidden.
| Hideout | Microsoft Presidio (Indian recognizers on) | GLiNER multi PII | |
|---|---|---|---|
| Fresh hand-written messages: PII hidden | 96% | 64% | 42% |
| Fresh hand-written messages: no-PII left alone | 95% | 40% | 90% |
| Fresh hand-written messages: exactly right | 90% | 37% | 47% |
| Indian chat (3,000 messages): PII hidden | 99% | 66% | 62% |
| Multilingual PII benchmark (8 languages): PII hidden | 98% | 58% | 40% |
| English documents benchmark: PII hidden | 98% | 71% | 76% |
| Size | 8 MB | 445 MB | 1.1 GB |
| Latency, one message, 1 CPU thread (laptop) | ~0.3 ms | ~10 ms | ~66 ms |
Presidio hides many ordinary numbers and cities and reads Indian phone numbers as dates; GLiNER is careful but misses most Indian formats. Hideout still misses some things: a name right before a relation word ("Hemant bhai"), a bare number after "at" taken as an address, a Wi-Fi network name taken as a password.
| Member | Description |
|---|---|
Hideout() | Loads the bundled model. Implements AutoCloseable. |
hide(text, types, threshold, replacement) | The text with each found item replaced, by default with [TYPE]. |
find(text, types, threshold) | The found items, Pii(type, start, end, text, score), in text order. |
contains(text, types, threshold) | true if the text has personal info of those types. |
PiiType | NAME PHONE EMAIL UPI AADHAAR PAN CARD BANK_ACCOUNT IFSC ADDRESS PASSPORT VOTER_ID DRIVING_LICENSE VEHICLE GOV_ID DOB SECRET USERNAME IP |
No API key, no sign-up, no license file. Add Hideout to your project and ship. It stays free until your product passes 10,000 monthly active devices, and there's never a limit on how often each device runs it.
For indie developers, startups and growing apps, up to 10,000 monthly active devices.
For products above 10,000 monthly active devices on any platform.
A small, fast on-device model trained for your language, domain or task.
A monthly active device is a phone, tablet or other device that runs Hideout at least once in a calendar month.
The 10,000 limit applies separately to each product, each platform (Android, iOS, web…) and each Hoverfly model. Crossed it? You have 30 days to get a commercial license.
Questions about licensing? Email raju348636@gmail.com or call / WhatsApp +91 63533 21951. Full terms: Hoverfly Community License.
A Kotlin Multiplatform library (Android, iOS, macOS, JVM desktop, JavaScript, WebAssembly) that finds personal information in text (phone numbers, UPI IDs, Aadhaar, PAN, card and bank numbers, emails, names, addresses, passwords and OTPs and more) and hides it.
English, Hinglish and romanised Tamil / Telugu, Hindi, Marathi, Bengali, Tamil, Telugu, Kannada, Malayalam, Gujarati, Punjabi and Urdu, plus Spanish, French, German, Italian, Dutch and Portuguese. Numbers, emails and IDs are found in any language. Chinese, Japanese and Thai are not supported.
Mostly not: prices, times, order IDs, UPI transaction references, PNRs, room numbers and cities stay visible. On fresh test messages with no personal info, 95% were left untouched. Raise threshold to hide less, lower it to hide more.
It reads context, so it knows "my OTP is 482913" from "I paid 482913", finds names, and handles numbers typed with spaces, dashes or +91. If you also have strict formats of your own, you can run your rules next to it.
Any length. Long text is cut into overlapping windows, so every word is judged with context on both sides.
It is the same size and speed class as Comma: a few milliseconds per chat message on a laptop JVM, and on an Android emulator on the same day it ran as fast as Comma. Load it once, off the main thread, and reuse it.
Yes. Inference runs entirely on the device in plain Kotlin. It makes no server calls, needs no network permission and sends no telemetry.
Units, token ids, every label and the hidden text match the reference implementation on all 197 test vectors, both on the JVM and on an Android device.
Nothing for products with up to 10,000 monthly active devices per platform, including commercial apps. There is no API key or account, and no limit on how often it runs. Above that, a commercial license is needed; see Pricing.
Yes. Hoverfly trains custom on-device models for your language, domain or task and ships them as a small library like this one. Email raju348636@gmail.com or call / WhatsApp +91 63533 21951.
Built by a developer, for developers.
Every model here started as a problem I hit in my own apps. I made them small, private and free to start, so you can spend your time on the part your users will love.
Eight small on-device models, one job each. Same install, same free tier, and the same promise: nothing leaves the device.