Marquee
The itch
Checking what's playing, or skipping a track, usually means alt-tabbing over to Apple Music or Spotify, waiting for the window to come forward, finding the transport controls, then switching back to whatever you were actually doing. Marquee removes that whole detour. The current track and its controls live in the menu bar itself: a scrolling title and playback buttons, always visible, one click away.
What it does
Marquee is a macOS menu bar app for Apple Music and Spotify. It shows what's currently playing, scrolls the title if it's too long to fit, and gives play, pause, and skip controls, all without opening a popover or either music app. Clicking the title brings the source app to the front, for when you do want to jump in.
How it works
Marquee talks to Apple Music and Spotify through ScriptingBridge, driven with key-value coding. It's Apple's old but still-functioning bridge for scripting other apps' internal object graphs, and it runs on a background serial queue so a slow Apple Event round-trip never freezes the UI. Track changes arrive two ways: instantly through Distributed Notifications when the source app posts one, and as a low-frequency poll running underneath as a safety net for whatever notifications miss.
The menu bar view itself is hand-built AppKit, not a system control. MarqueeLabel runs a two-copy ticker so long track titles scroll seamlessly, and the panel resizes itself to the title's width instead of truncating it. The scroll timer only runs while a track is actually playing, the menu bar item is on-screen, and the display is awake, so a paused track or a sleeping Mac doesn't leave a timer spinning for nothing.
What got hard along the way
Two bugs ended up shaping how the app is built.
The first came from ScriptingBridge itself. When Apple Music or Spotify is running but stopped, with nothing loaded, currentTrack doesn't come back as nil. It comes back as a real, empty track object whose name and artist read as blank. The obvious fix, falling back to "Unknown Track" and "Unknown Artist" whenever those fields were blank, backfired: it made a stopped app look like it was playing something. The real fix keys off isPlaying() instead of a blank title alone, because a genuinely playing track (a live radio stream, say) can also have a blank title and still needs to show its controls.
The second came from something as basic as clicking the track title. The first attempt overrode mouseDown to catch the click, but mouseDown fires on press rather than on a completed click, so a control-click, which is also what opens the right-click context menu, would fire the click-to-open at the same moment. Switching to NSClickGestureRecognizer fixed it: it only fires on a real click and explicitly ignores control-click, so the two gestures stop fighting each other.
Shipping it
Marquee ships ad-hoc signed rather than notarized, a deliberate call to skip the cost and process of a Developer ID certificate. The tradeoff shows up on first launch: macOS blocks the app until you manually clear its quarantine attribute, a step spelled out in the README.
Distribution runs through a personal Homebrew tap, a separate repo from Marquee itself, rather than the Mac App Store:
Pushing to the Marquee repo alone does nothing for anyone who already has the app installed. It's the tap update, the last step, that actually reaches users.
Where it stands
Marquee's first commit landed 2026-07-13, and it's now at v1.0.1, tagged and released, with the most recent push on 2026-08-19. It's a small, personal-use tool rather than something built for an audience: the GitHub repo sits at 0 stars, which fits a project installed by one person through a private Homebrew tap rather than promoted anywhere.