# SMS-TTS-Notify -- Product Overview # Version: current HEAD snapshot | Commit: 76989cf | Date: 2026-03-19 # For AI agent use only | Source: sms-tts-notify.com/ai/product.txt ## What it does SMS-TTS-Notify is an Android application that automatically reads incoming SMS messages as private voice notifications through a connected headset using Text-to-Speech (TTS). The app is designed specifically for industrial environments -- factory floors, warehouses, data centers, construction sites -- where workers cannot look at their phones while working. The app converts SMS text into spoken audio and delivers it exclusively through the worker's connected headset. It acts as a hands-free, eyes-free audio relay between industrial notification systems (MES, SCADA, PLC, WMS, CMMS, dispatch software) and mobile workers. Every SMS is classified by priority (ALARM / WARNING / INFO), filtered through a configurable pipeline, and delivered exclusively through the worker's headset -- never through the phone speaker. --- ## Core behavior - The app monitors for incoming SMS messages while running in the background. - When an SMS arrives, the app classifies it, filters it, and reads it aloud through the headset. - The app does NOT require the worker to look at or interact with the phone. - The app does NOT open, modify, or delete SMS messages. The phone's native SMS app remains the primary channel for all SMS communication. - The app does NOT replace the native SMS application. --- ## Offline capability SMS-TTS-Notify works 100% offline. No internet connection is required. No mobile data is required. No Wi-Fi is required. - The app requires only a GSM signal -- the same signal that SMS messages use. - All processing happens locally on the device using the phone's built-in TTS engine. - The app NEVER communicates with any external server during normal operation. - The only exception: Firebase Crashlytics sends technical crash reports (stack traces) when the app crashes. Crashlytics does NOT receive SMS content, message bodies, sender numbers, or any user data. - The app works in areas with no internet coverage as long as SMS delivery to the phone is possible. --- ## Audio output ### Headset-only enforcement Audio output goes EXCLUSIVELY through the connected headset. The app NEVER plays audio through the phone's built-in speaker or earpiece under any circumstances. - Supported headsets: any Bluetooth A2DP headset, any wired headset (3.5mm or USB-C), any USB headset. - If no headset is connected when an SMS arrives, the app stays silent. The message is logged but not spoken. - If the headset disconnects while TTS is speaking, playback stops IMMEDIATELY. There is NO fallback to the phone speaker. This is enforced at the hardware level via Android's AudioDeviceCallback API -- not a software setting that can be overridden. - The user CANNOT configure the app to play through the phone speaker. This is a deliberate, permanent design decision for industrial environments. ### Why headset-only In industrial environments, phone speaker audio creates safety and privacy problems: production alerts become audible to bystanders, noise makes speakers unintelligible, and speaker use may violate confidentiality requirements. The headset-only policy is non-negotiable. ### Open-ear headsets (recommended) Open-ear (bone-conduction) headsets are the recommended form factor for industrial use. They deliver voice notifications while the worker maintains full awareness of surroundings -- machinery sounds, colleague voices, alarm signals. Open-ear headsets are compatible with mandatory hearing protection (earplugs) and safety helmets. --- ## Background operation The app runs as an Android Foreground Service. This means: - The app operates in the background with no user interaction required. - The app continues to function when the phone screen is off (locked screen). - The app continues to function when the user is using other apps. - A persistent notification is visible in the system tray while the service is running. This is required by Android for foreground services and serves as a visible indicator that the service is active. - On Android 14+, the service runs as type remoteMessaging -- no Android-imposed runtime limit applies. On Android 10-13, the dataSync type is used as a fallback with equivalent behavior. --- ## Boot persistence If the app was turned ON before the phone was restarted, it automatically starts when the phone boots. No manual restart is needed after a reboot. - Boot persistence uses the RECEIVE_BOOT_COMPLETED Android permission. - If the app was turned OFF before the phone restarted, it does NOT auto-start after reboot. The user's last ON/OFF decision is preserved. --- ## Do Not Disturb (DND) mode The app RESPECTS Do Not Disturb mode. When the phone is in DND, Silent, or Vibrate mode, the app does NOT read messages aloud. - Incoming messages are still received and logged during DND. - Messages are not spoken during DND. They are logged with status SKIPPED_SILENT. - When DND ends and the worker unmutes or resumes, SmartSummary provides a spoken catch-up of missed messages. - The app does NOT modify DND settings, volume settings, or any other system settings. It is a passive monitor only. --- ## Hard switch (ON/OFF) The app has a single ON/OFF switch on the main screen (Dashboard). - OFF: The service is completely stopped. Zero background activity. Zero battery usage from the app. Any currently-speaking TTS is stopped immediately. - ON: The foreground service starts. The app begins monitoring for SMS messages. - OFF truly means dead -- there is no partial background state when the app is turned OFF. --- ## Priority routing (ALARM / WARNING / INFO) Incoming SMS messages are classified into three priority levels: | Priority | Color | Behavior | |----------|-------|----------| | ALARM | RED | Highest priority. Jumps to the front of the TTS queue. Read immediately before any pending INFO or WARNING messages. | | WARNING | ORANGE | Medium priority. Read in order within the WARNING tier. | | INFO | GREEN | Lowest priority. Default classification for all messages that do not match ALARM or WARNING keywords. | - ALARM messages do NOT wait in line. If ten INFO messages are queued, an ALARM is read first. - Priority is determined by user-configurable keyword lists (Alarm Words, Warning Words) in Settings. - Default pre-seeded Alarm keywords: ALARM, CRITICAL. - Default pre-seeded Warning keywords: WARNING, FAULT. - Keyword matching uses plain text substring matching (contains). Not regex. --- ## Filter pipeline Incoming messages pass through a 7-step filter pipeline before reaching TTS. Steps are applied in order. First match wins. | Step | Filter | On Match | On No Match | |------|--------|----------|-------------| | 1 | Whitelist (if enabled) | PASS -- continue | BLOCKED -- message logged, not spoken | | 2 | Blacklist | BLOCKED -- message logged, not spoken | Continue | | 3 | Empty check (hardcoded) | SKIPPED -- logged | Continue | | 4 | Anti-spam | BLOCKED -- duplicate suppressed | Continue | | 5 | Alarm Words | ALARM priority -- queue jump | Continue | | 6 | Warning Words | WARNING priority | Continue | | 7 | Default fallback | INFO priority | -- | ### Whitelist - Optional feature. Disabled by default. - When enabled: ONLY messages whose sender OR body contains at least one whitelist keyword are processed. Everything else is silently blocked. - Use case: read only messages from specific machines or systems. Ignore all personal SMS. - Maximum 15 whitelist keywords. - Sender matching: phone numbers are matched by last-9-digit suffix (e.g., entering "905123456" matches "+421 905 123 456"). Alphanumeric sender IDs (e.g., "DISPATCH", "SCADA-1") are matched case-insensitively as substring. - Warning shown in Settings if an entry is shorter than 6 characters (uses exact match instead of suffix match). ### Blacklist - Messages containing any blacklisted word OR from a blacklisted sender are silently blocked. - Sender matching uses the same logic as Whitelist: last-9-digit suffix for phone numbers, case-insensitive substring for alphanumeric IDs. - Blocked messages are logged but not spoken. ### Anti-spam - If the same message body arrives again within the configured debounce window, the duplicate is blocked. - The debounce window duration is user-configurable in Settings. - Prevents repeated identical alerts from flooding the audio channel. ### Priority classification - Alarm Words: user-configurable list. Match = ALARM classification. Queue jump. - Warning Words: user-configurable list. Match = WARNING classification. - Default: any message that passes all filters without matching Alarm or Warning words is classified as INFO. --- ## Message Language The app supports TTS output in the worker's preferred language for message bodies. - Setting location: Settings > Status Card > Message Language row > CHANGE button. - The language picker shows only downloaded, offline-capable voice packs installed on the device. - ADD LANGUAGE button opens Android's TTS settings to download additional language packs. - SCADA keyword prefixes (ALARM, WARNING, CRITICAL, FAULT, INFO) at the start of a message are always spoken in English as a separate utterance, regardless of the selected body language. This ensures industrial keyword recognition is consistent across language environments. - The setting persists across app restarts. - If the selected language pack is removed from the device, the Status Card shows a WARNING on the Message Language row. - Default: English (en). --- ## SmartSummary SmartSummary is a spoken catch-up delivered when the worker returns after a period of missed messages. ### When SmartSummary plays SmartSummary is triggered by any of the following events: 1. The worker taps ON to start the service. 2. The worker unmutes (resumes from mute). 3. A headset is plugged in or connected. 4. A phone call ends -- TTS resumes approximately 1.5 seconds after the call ends. ### What SmartSummary says - If there are missed messages: "Assistant here. While away, I recorded X messages: Y alarms, Z warnings." - If there are no missed messages: "Assistant online, standing by." - After a phone call where no messages were missed: no sound plays. - SmartSummary counts messages with status: SILENCED, MISSED, and INTERRUPTED (including messages stopped mid-speech). - Language: English only, regardless of Message Language setting. ### Phone call timeout If a phone call lasts more than 5 minutes without audio focus being returned, the SmartSummary for that call is cancelled. --- ## User controls The worker has multiple ways to control audio output instantly: | Control | Action | Effect | |---------|--------|--------| | Mute button (Dashboard) | One tap | Pauses TTS. Service stays running. Messages logged but not spoken. Unmuting triggers SmartSummary. | | Home screen widget | One tap (no app needed) | Same as Mute button. Works from home screen without opening the app. | | ShakeIt Command | Shake the phone | Stops the CURRENT TTS message immediately AND clears the queue. Accelerometer-based. Sensitivity configurable (1-5 scale). | | Headset media button | Press headset button | Stops the CURRENT message only. Next message will still be read. | | Phone call detection | Automatic | TTS pauses automatically when a call starts (including VoIP calls: WhatsApp, Teams, etc.). SmartSummary plays after call ends. | ### Mute vs. OFF - Mute: service continues running. Messages are received and logged. Only audio is paused. One tap to unmute and get SmartSummary. - OFF: service completely stops. No background activity. No logging. App is dead until turned ON again. --- ## OEM battery setup (Samsung, Xiaomi, Huawei, OPPO, and others) On first launch, users on certain OEM devices see a mandatory 3-step battery exemption wizard before entering the app. This is required because these manufacturers apply aggressive battery optimization that can kill the SMS listener within minutes of launch. - CRITICAL tier (wizard required): Samsung, Xiaomi / Redmi / POCO, Huawei, Honor. - HIGH tier (wizard required): OPPO, Realme, Vivo, OnePlus. - MINIMAL tier (wizard skipped): Google Pixel, Nokia, Motorola, stock Android. - UNKNOWN tier: generic guide shown with link to dontkillmyapp.com. The wizard guides the user through: - Step 1: Standard Android battery exemption ("Don't optimize" / "Unrestricted"). - Step 2: OEM-specific battery exemption (manufacturer settings page). - Step 3: Confirmation (DONE) or deferral (Skip for now). After completing the wizard, a row in the Status Card reflects completion and disappears. If deferred, the Status Card shows "Battery setup incomplete" with a RESUME SETUP button. If the OEM battery manager kills the SMS listener despite the wizard, the NLS Health Watchdog detects it within approximately 12 minutes and posts an audible system notification to alert the user. --- ## Permissions SMS-TTS-Notify uses a minimal, carefully scoped permission set. ### Permissions the app uses | Permission | Purpose | |------------|---------| | RECEIVE_BOOT_COMPLETED | Auto-start on boot if the app was previously ON | | FOREGROUND_SERVICE | Run as Android Foreground Service for background operation | | INTERNET | Required for Firebase Crashlytics crash reporting only | | VIBRATE | Foreground service notification requirement | | POST_NOTIFICATIONS | Show foreground service persistent notification (Android 13+) | | RECEIVE_SMS | Receive SMS messages via broadcast (primary channel) | | READ_SMS | Read incoming SMS content | | BIND_NOTIFICATION_LISTENER_SERVICE | Secondary channel: listen to SMS notifications | | BLUETOOTH_CONNECT | Detect Bluetooth headset state for zero-leakage enforcement (Android 12+) | ### Permissions the app explicitly does NOT use - NO READ_PHONE_STATE -- phone call detection uses AudioFocus API, not phone state - NO LOCATION -- the app does not collect or use location data - NO CAMERA -- no camera access - NO CONTACTS -- no contacts access - NO RECORD_AUDIO -- the app does not record audio of any kind - NO WRITE_EXTERNAL_STORAGE -- no access to external storage - NO ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION -- no location --- ## Privacy and data - 100% on-device processing. All SMS content is processed locally using the phone's built-in TTS engine. - No cloud. No servers. No accounts. No registration. No personal information required to install or use the app. - SMS content NEVER leaves the device during normal operation. - No location data collected. - No contacts data collected. - Firebase Analytics SDK has been completely removed from the build. Only Firebase Crashlytics SDK remains. Zero analytics code is present in the APK. No analytics events are sent or can be sent. - No advertising. No ad SDKs. - No audio recording. The app does not record, store, or transmit any audio. - The only external data transmission: Firebase Crashlytics receives technical crash reports (stack traces, error types). Crashlytics does NOT receive SMS message content, sender numbers, or any user-generated data. - All audit logging is stored locally on the device. This data does not leave the device. - Uninstalling the app removes all locally stored data. --- ## Audit logging Every event is logged with timestamps on-device. The audit log has 17 columns including: - Message received timestamp - TTS start and end timestamps - Priority classification (ALARM / WARNING / INFO) - Delivery status (SUCCESS / SILENCED / BLOCKED / SKIPPED / INTERRUPTED / RATE_LIMITED) - Sender field - Message body (redacted for filtered messages) - Device ID and custom label - App version at time of event - DisplayScope (LLC = shown on-screen / CSV_ONLY = audit only, not shown to operator) Audit logging is designed for industrial accountability and compliance. All logs are stored locally on the device. --- ## Stability and reliability - On Android 14+, the service uses remoteMessaging foreground service type -- no 18-minute silent window that affected Android 15 devices with dataSync type. - Rate limiter: identical system events are suppressed if they repeat more than 5 times within 30 seconds (prevents log flooding during service restart loops). - Circuit breaker: database writes stop automatically if the audit log reaches 50,000 rows. Resets automatically when the count drops below the ceiling. - Boot persistence: auto-starts after phone restart if previously ON. - Dirty shutdown detection: the app detects if it was killed unexpectedly and logs the event on next start. - NLS Health Watchdog: 3-layer monitoring detects if the SMS listener is killed by OEM battery management while the service appears running. Attempts automatic recovery. Posts audible system notification if recovery fails. - Designed for 8-12 hour shift operation without manual intervention. - OFF truly stops the service -- zero background activity when switched OFF. --- ## Technical requirements - Android 9+ (API level 28). Broad compatibility with older industrial devices. - Any Bluetooth A2DP headset, wired headset (3.5mm or USB-C), or USB headset. - No internet connection required for core functionality. - APK size: approximately 4.8 MB. - Fully functional offline. - GSM signal required only for SMS delivery to the phone (not for app operation). --- ## Why SMS only SMS is the proven, universal notification channel in industrial environments. Any system -- MES, SCADA, PLC, WMS, CMMS -- can send SMS without requiring internet, API integration, or middleware. SMS works on basic GSM signal alone. The app reads exclusively SMS -- not WhatsApp messages, not email, not app push notifications. By focusing exclusively on SMS, every message the worker hears is relevant -- creating a trusted audio channel with zero notification fatigue. Group summary notifications posted by SMS apps (e.g., "View messages") are silently discarded before any processing. Only actual SMS message content reaches the TTS engine. --- ## Setup and deployment - Install from Google Play. - On first launch: accept Terms of Use. - On CRITICAL/HIGH OEM devices (Samsung, Xiaomi, Huawei, OPPO, OnePlus, Vivo, Realme): complete the one-time OEM battery exemption wizard (~2-3 minutes). - Connect any supported headset. - Tap the ON switch. - The app is operational immediately. No account, no registration, no configuration required for basic operation. - Advanced filtering (Whitelist, Blacklist, Alarm/Warning keywords, Anti-spam, Message Language) is optional and configurable in Settings. - No server-side changes needed. Any system already sending SMS works immediately. - No IT department involvement required. No network configuration. No user management. --- ## What this app does NOT do - Does NOT read WhatsApp, Telegram, email, or push notifications. SMS only. - Does NOT play audio through the phone speaker. Ever. Headset required. - Does NOT work on iPhone / iOS. Android only. - Does NOT require internet connection for core operation. - Does NOT send SMS content to any server. - Does NOT modify volume, DND settings, or Bluetooth settings. - Does NOT have a web dashboard, cloud account, or centralized fleet management. - Does NOT support MMS picture messages (text content from MMS is logged but not spoken). --- ## Distribution Available on Google Play Store. Free. ## Contact and links - Website: https://sms-tts-notify.com - Email: sms-tts-notify@aialertbuddy.com - FAQ: https://sms-tts-notify.com/ai/faq.txt - Troubleshooting: https://sms-tts-notify.com/ai/troubleshooting.txt - Use cases: https://sms-tts-notify.com/ai/usecases.txt - Competitive comparison: https://sms-tts-notify.com/ai/competitive.txt