Pixel's ambient "Now Playing" song recognition, on your Wear OS watch. No backend, no analytics, no microphone access — songs your phone already recognized go straight to your wrist over Bluetooth or Wi-Fi.
- Wrist alerts — a quiet notification when a new song is heard nearby, with Subtle, Prominent, Heartbeat, or Mute vibration.
- Tile — the current (or last heard) song, with a one-tap Open on phone button.
- Watch face complications — the song title in Short Text and Long Text slots, pushed only when a song arrives (never polled).
- History — recently recognized songs on both the watch and the phone; tap to open, swipe to remove.
- Open on phone — sends a song to YouTube Music, Spotify, or Google Search on the phone.
Now Playing runs on the phone (Android System Intelligence) and posts its result as a local-only
notification, so it never reaches the watch on its own. The phone app reads that notification
with a NotificationListenerService and publishes the song as a Wearable Data Layer item. The
watch app picks it up, stores it, and updates the alert, tile, and complications.
Download both APKs from the latest release:
now-playing-companion-phone-*.apk— install on your phonenow-playing-companion-watch-*.apk— install on your watch
Then open the phone app and grant notification access. On Android 13+, a sideloaded app first needs Settings → Apps → Now Playing Companion → ⋮ → Allow restricted settings before notification access can be granted.
Requires:
- A Pixel phone running Android 8.0 (API 26) or newer, with Now Playing turned on (Settings → Sound & vibration → Now Playing)
- A Wear OS 3+ watch paired to that phone
Now Playing Companion records no audio and has no microphone access. It reads only Now Playing's notification on the phone, and the song title and artist travel directly between your phone and watch over Google Play services' Wearable Data Layer. Nothing is sent to any server.
- Android Studio (Narwhal or newer)
- JDK 17+ (bundled with Android Studio)
- A Pixel phone with Now Playing turned on, and a Wear OS 3+ watch paired to it
git clone https://github.com/wwwescape/now-playing-companion.git
cd now-playing-companion
./gradlew assembleDebugInstall mobile on the phone and wear on the watch. Both must share the same signing key
(debug builds do), or the Data Layer won't connect them.
./gradlew lint testDebugUnitTestBump appVersionCode and appVersionName in gradle.properties (shared by both apps), commit,
then tag v + appVersionName (the release workflow refuses a mismatched tag):
git tag v0.0.2
git push origin v0.0.2The tag push builds signed release APKs and AABs for the phone and watch apps and attaches them
to a new GitHub Release (see .github/workflows/release.yml). It needs the KEYSTORE_BASE64,
KEYSTORE_PASSWORD, KEY_ALIAS, and KEY_PASSWORD repository secrets, which are kept locally
in the gitignored keystore.properties. Both apps are signed with the same key, which the
Wearable Data Layer requires.
Regenerate the logo, launcher icons, and store art with python scripts/generate_icons.py
(needs pip install resvg-py).
mobile/ Phone app: Now Playing notification listener, Data Layer publisher, history UI
sync/ Notification parsing (NowPlayingParser) and watch sync
wear/ Watch app (Wear Compose Material 3)
sync/ Data Layer listener, "open on phone" via RemoteActivityHelper
tile/ Now Playing tile
complication/ Short/long text complication data source
alert/ Notification and haptic patterns
scripts/ generate_icons.py — builds the logo, launcher icons, and store art
design/ Play Store icon assets
assets/ README assets
GPL-3.0 — see LICENSE.
If you find Now Playing Companion useful, consider buying me a coffee: