Android App

Phone notifications, straight to your desktop.

A lightweight Android app that listens for Google Messages notifications and relays them as JSON webhooks over Tailscale. No Termux. No root. Just install and go.

Architecture

softwaresoftware-relay implements Android's NotificationListenerService to watch for incoming Google Messages notifications. When one arrives, it extracts the sender and message body and POSTs JSON to your desktop over Tailscale.

Google Messages
SMS received
-->
softwaresoftware-relay
NotificationListener
-->
Tailscale
100.x.x.x
-->
Desktop Webhook
:8789

Webhook payload

{
  "source": "notification",
  "app": "com.google.android.apps.messaging",
  "sender": "Alice",
  "body": "hey, are you around?",
  "self": false,
  "timestamp": "2026-04-01T18:30:00Z"
}

Self-text detection flags messages from your own name/number as "self": true, enabling automated workflows triggered by texting yourself.

Setup

Install the APK

Download the APK and sideload it onto your Pixel. You may need to enable "Install unknown apps" for your browser or file manager.

Grant notification access

Open the app and tap "Open Notification Access". Find softwaresoftware-relay in the list and toggle it on. Android will warn you -- this is required for the notification listener to work.

Configure the webhook URL

The default webhook points to http://100.99.44.89:8789 over Tailscale. Change it if your desktop has a different Tailscale IP or you're running the webhook on a different port.

Set your name (optional)

Enter your name or contact name for self-text detection. When the sender matches, the payload includes "self": true.

Test it

Tap the "Test Webhook" button to send a test payload. If your desktop webhook is running, you should see the JSON arrive.

Details

Targets Android 13+ (API 33). Built for Pixel 7 Pro. Kotlin, no external dependencies beyond AndroidX core. Notifications prefixed with [TaskPilot] are automatically ignored to prevent feedback loops with autonomous agents.

The app uses HttpURLConnection for webhook delivery -- no OkHttp, no Retrofit, no bloat. Connection timeouts are set to 5 seconds. Failures are logged silently; the app never crashes on network errors.