Now Playing Display

A macOS menu bar app that streams what you're playing (album art, track info, progress) to a USB-connected ESP32-C6 round display.

The device showing "Money" by Pink Floyd macOS 13+ Apple Silicon & Intel USB-C

Hardware

3D-printed case

STLs are published on Thingiverse. The case snaps around the round-display board and exposes the USB-C port.

Setup

1. Flash the firmware

Download firmware.bin

Pre-built firmware is a single merged image (flash to offset 0x0).

Easiest method: open the ESP web tool in Chrome (uses WebSerial), connect to the device, and flash firmware.bin at offset 0x0.

Or via the CLI. Install esptool:

pip install esptool   # or: brew install esptool

Plug in the XIAO ESP32-C6 over USB-C, then flash:

esptool.py --chip esp32c6 --port /dev/cu.usbmodem* write_flash 0x0 firmware.bin
Note: on Linux/Windows the port path is different (/dev/ttyUSB0, COM3, etc). If esptool can't enter download mode automatically, hold the BOOT button on the XIAO while plugging in (or pressing RESET).

Or build from source via ESP-IDF (idf.py build flash) using the firmware/ tree in the repo.

2. Install the Mac app

Download NowPlayingDisplay.dmg

Open the disk image, drag NowPlayingDisplay.app to /Applications, and launch it. It auto-detects the ESP32 over USB and reconnects on replug, no configuration.

To have it start automatically when you log in, click the menu bar icon and toggle Launch at login. macOS will list it under System Settings → General → Login Items, where it can be disabled at any time.

How it works

┌───────────┐ USB serial ┌────────────────┐ /usr/bin/python3 ┌──────────────────┐ │ ESP32-C6 │ ◄──────────── │ Menu bar app │ ◄──────────────── │ Apple Music │ │ + display │ ─────────────► │ (Mac side) │ ─────────────────► │ / Spotify, etc │ └───────────┘ touch cmds └────────────────┘ media controls └──────────────────┘

The Mac reads now-playing metadata via the bundled MediaRemoteAdapter.framework, loaded in-process by /usr/bin/python3 (a com.apple.*-signed binary, since macOS 15.4+ only authorizes the private MediaRemote framework for callers with an Apple bundle id, so the bundled py2app Python can't reach it directly). Artwork is converted to RGB565 and pushed to the ESP32 over USB; touches on the round display send prev/play-pause/next back to the Mac.

Source code

Firmware and Mac app source live at github.com/gxlabs/now-playing-device, released under the GNU GPL v3.

Buy me a coffee

If this project saved you some time or made your desk a little nicer, you can support further work here:

Buy Me a Coffee QR code

Scan the QR code, or visit:

buymeacoffee.com/gxlabs