now-playing.el, an Emacs interface to the macOS Music app

kickingvegas1 pts0 comments

nfdn: Announcing now-playing.el, an Emacs interface for the macOS Music app

notes from /dev/null

by Charles Choi 최민수

Announcing now-playing.el, an Emacs interface for the macOS Music app

03 Aug 2026 Charles Choi

For me, listening to music whenever I’m working on a computer is a commonplace, daresay essential activity. Much of my work is done using Emacs, so the idea of having it control music playback to mitigate an app switch seemed reasonable. Such was the motivation for my latest project, now-playing.el, a Transient interface for the macOS Music (nee iTunes) app.

now-playing.el takes inspiration from the many mini-client interfaces provided by Apple to control the Music app. The idea was to have a compact and simple interface:

Show what is currently playing (song, artist, album)

Offer basic controls (play/pause, next/previous track, volume control)

Optionally log what was played.

now-playing.el takes advantage of AppleScript support in the Music app, providing the needed controllability and observability of it from Emacs. The sequence diagram below illustrates how these programs relate to each other by showing a request/response transaction between Emacs and the Music app using the osascript command line tool.

If Emacs is built with NextStep (NS) support, then Emacs can send a direct AppleScript message to the Music app via ns-do-applescript to avoid making a shell call to osascript.

State synchronization for now-playing.el is fairly simple, with client updates done in a pull fashion. More details about what now-playing.el can do can be found in the now-playing.el User Guide.

Closing Thoughts

It is not coincidental that writing this mini-client for the Music app works into my recent explorations and musings on malleable computing with Emacs. As of this writing, now-playing.el weighs in at 326 lines of code (cloc measured), taking full advantage of Elisp libraries to construct the following client subsystems:

UI: Transient for menu, cus-edit.el for customization UI

Client Edge: shell-command-to-string to osascript, ns-do-applescript

Local Database: Elisp variables

now-playing.el explores integration with AppleScript, itself a mechanism to allow for orchestration between Cocoa applications. Expect some future posts documenting my explorations in this area, particularly with the more contemporary Apple Shortcuts and Intents.

now-playing.el v1.0 is now available on MELPA.

emacs<br>macos

Malleable Computing, Emacs, and You &rarr;

About<br>• Mastodon<br>• Bluesky<br>• GitHub

Feeds & Tags •

Get Scrim for macOS • Get Captee for macOS

&copy; 2009-2026 Charles Y. Choi

Powered by Pelican

playing emacs music macos interface client

Related Articles