notes from /dev/null

by Charles Choi 최민수


03 Aug 2026

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

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.

img

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.

img

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.

img

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   macos

Past Articles

22
JUL
2026

Malleable Computing, Emacs, and You

Some musings on malleable computing using as an example a GitHub issues browser in Emacs.

read more
9
JUL
2026

In Emacs, Everything Looks Like a Service

No, Emacs is not an operating system but this post scrutinizes why some might say that.

read more
24
JUN
2026

Scheduling Future Tasks in Emacs

If you miss using at, you can use Emacs run-at-time as a substitute, with caveats. Also described is a way to use run-at-time to post a macOS notification at a future date.

read more
4
JUN
2026

Revisiting Emacs Keyboard Macros with a Mouse

Yes, recording an Emacs keyboard macro with a mouse is a thing.

read more
1
JUN
2026

Opening macOS Finder Folders in Emacs with Scrim

Finder fun with the Scrim custom URL scheme and some musings on software orchestration.

read more
28
MAY
2026

Anju v1.5.0 Update

Anju v1.5.0 update out in the wild. Lots of goodies in it.

read more
18
MAY
2026

Using the Mouse for Emacs Rectangle Commands

Never look up Emacs rectangle commands in the manual again. Announcing support for rectangle commands in Anju v1.4.0 update.

read more
11
MAY
2026

Enhancing Elisp Development with Context Menus

Announcing support for Elisp development in the Anju v1.3.0 update.

read more
29
APR
2026

Bulk Search & Replace Commands for Files and Buffers in Emacs

An inventory of bulk commands to search and/or replace multiple files or buffers in Emacs.

read more

Page 1 / 19   >

 

AboutMastodonBlueskyGitHub

Feeds & Tags
Get Scrim for macOSGet Captee for macOS

Powered by Pelican