Skip to content

Latest commit

Β 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Rota icon

Rota

A floating AppleΒ Music widget for macOS β€” artwork-first, with synced lyrics.
rota Β· Latin for "wheel"

macOS 14+ Swift 5.9 Zero dependencies MIT

🌐 aalemoro.github.io/Rota


Rota player Β Β  Rota lyrics mode

Large widget at rest Β  Medium widget Β  Small widget

Three native sizes. At rest, every one of them is pure album art β€” controls fade in on hover.

Rota puts a small, beautiful now-playing widget on your desktop. The album cover fills the whole card, melting into frosted glass behind the controls β€” and one click flips it into a karaoke-style synced lyrics view. It floats above your windows (or below, your call), follows you across Spaces, and stays out of the Dock.

✨ Features

  • 🎨 Artwork-first design β€” the cover is the interface, with a progressive blur and scrim exactly like Apple Music's MiniPlayer. At rest it shows only the album art; every control fades in on hover.
  • 🧩 Gallery widget included β€” a real WidgetKit widget (Rota β†’ Now Playing) you add from right-click on the desktop β†’ Edit Widgets, in three sizes with working transport buttons.
  • πŸŽ› Full transport β€” play/pause, next/previous, a draggable seek bar with elapsed/remaining time, shuffle and repeat (off β†’ all β†’ one).
  • 🎀 Synced lyrics β€” line-by-line highlighting that scrolls with the song, via the free LRCLIB database. Click any line to jump there. Falls back to plain lyrics when no synced version exists.
  • ⭐ Favourite the current song without touching the Music app.
  • πŸ”Š Volume control tucked into the hover toolbar.
  • πŸ–₯ A true desktop widget β€” it sits just above your wallpaper, under your windows, exactly like macOS's own widgets. Hit πŸ“Œ to float it above everything instead. Visible on every Space either way.
  • 🧊 Static, like a real widget β€” its position is locked by default so a stray drag never moves it. Relocate with ⌘-drag, the menu, or rota://move.
  • ⌨️ Keyboard shortcuts β€” click the widget, then: space play/pause Β· ←/β†’ previous/next Β· ↑/↓ volume Β· L lyrics Β· F favourite Β· esc close lyrics / hide.
  • πŸ“ Three official widget sizes β€” small, medium and large (the same footprints as macOS's own widgets), switched from the right-click menu. Drag the widget and it snaps into the native widget grid.
  • πŸ–Ό Covers always load β€” local artwork first; if a streaming track exposes none, Rota resolves it from Apple's catalogue automatically.
  • πŸ‘» Alive even when Music is closed β€” the widget keeps showing the last album cover; hover reveals a Resume button that reopens Music and picks up where you left off, in one click.
  • πŸ«₯ Chrome-free, like a real widget β€” no Dock icon, no menu bar item, no window buttons. Everything lives in the right-click menu; launch Rota again (Spotlight) to bring the widget back after hiding it.
  • πŸͺΆ Native and tiny β€” pure Swift + SwiftUI, zero third-party dependencies, no Electron, ~2 MB on disk.

πŸ“¦ Install

Rota controls the Music app, so it works with your Apple Music subscription and with a local library. Nothing to sign into.

Option 1 β€” Download the app (easiest)

  1. Grab Rota-x.y.z-macOS.zip from the latest release.

  2. Unzip it and drag Rota.app into Applications.

  3. First launch: right-click β†’ Open (the build is ad-hoc signed, so macOS asks once). Alternatively, clear the quarantine flag yourself:

    # Tells Gatekeeper you trust the app you just downloaded
    xattr -dr com.apple.quarantine /Applications/Rota.app
  4. Click Allow when macOS asks if Rota may control Music. Done. πŸŽ‰

Option 2 β€” Homebrew

# --no-quarantine spares the right-click β†’ Open dance (the build is ad-hoc signed)
brew install --cask aalemoro/tap/rota --no-quarantine

Option 3 β€” One command

Builds from source and installs into Applications automatically:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/aalemoro/Rota/main/scripts/install.sh)"

Option 4 β€” Build from source

Requires Apple's Command Line Tools (xcode-select --install). No Xcode project, no signing setup β€” it's a plain Swift package:

# 1. Get the code
git clone https://github.com/aalemoro/Rota.git
cd Rota

# 2. Compile and assemble Rota.app into ./build
make app

# 3. Copy it into /Applications (falls back to ~/Applications)
make install

# β€” or just build & launch it in place:
make run

Other useful targets:

make zip     # package build/Rota-x.y.z-macOS.zip for distribution
make clean   # remove all build products

πŸ•Ή Using Rota

You want to… Do this
Change size Right-click β†’ Widget Size β†’ Small / Medium / Large
Move the widget Drag it β€” it snaps into the native widget grid (lock it from the menu; ⌘-drag still works when locked)
See the controls Hover the widget β€” at rest it's pure album art
Lyrics mode Hover β†’ πŸ’¬ button, or press L, or right-click β†’ Show Lyrics
Jump inside a song Drag the seek bar, or click a lyrics line
Bring it above your windows Hover β†’ πŸ“Œ pin (click again to send it back to the desktop)
Hide / bring back Right-click β†’ Hide Rota (or esc) Β· open Rota from Spotlight to bring it back
Start at login Right-click β†’ Start at Login (on by default after first launch)

⚑ Scripting (rota:// URLs)

Rota answers to URL commands, so you can wire it into Raycast, Shortcuts, aliases β€” anything that can open a URL:

open "rota://playpause"   # toggle playback        rota://next Β· rota://previous
open "rota://lyrics"      # open lyrics mode       rota://player closes it
open "rota://toggle"      # show / hide the widget rota://favorite ⭐ the song
open "rota://dump"        # write player state to /tmp/rota_state.json (JSON)
open "rota://snapshot"    # save a PNG of the widget to /tmp/rota_snapshot.png
open "rota://move?corner=topleft&margin=40"   # park it in a corner
open "rota://move?x=60&y=80"                  # or at exact coordinates

πŸ”’ Privacy & permissions

  • Rota needs one permission: Automation β†’ Music (macOS asks on first launch). That's how it reads what's playing and presses play for you.
  • Lyrics lookups send only title, artist, album and duration to LRCLIB over HTTPS β€” no account, no keys, no tracking. Results are cached locally in ~/Library/Caches/Rota.
  • When a streaming track has no local artwork, Rota asks Apple's public iTunes Search API for the cover (artist + album only, HTTPS).
  • Nothing else ever leaves your Mac. No analytics, no other network calls.

If you denied the permission by accident: System Settings β†’ Privacy & Security β†’ Automation β†’ Rota β†’ enable Music β€” or run:

# Resets the Automation permission so macOS asks again
tccutil reset AppleEvents io.github.aalemoro.rota

πŸ›  How it works

  • UI β€” SwiftUI inside a borderless, non-activating NSPanel (that's why clicking the widget never steals focus from the app you're working in).
  • Playback bridge β€” a compiled NSAppleScript bridge to the Music app: one round-trip per second returns the full player state, and distributed notifications (com.apple.Music.playerInfo) make track changes feel instant. The same battle-tested approach used by long-standing third-party mini players β€” no MusicKit authorization flows, no private APIs.
  • Lyrics β€” [mm:ss.xx]-timestamped LRC parsing with a small scorer that matches the right edit of a song by duration, plus an on-disk cache.
Sources/Rota
β”œβ”€β”€ main.swift              app entry
β”œβ”€β”€ AppDelegate.swift       floating panel, menu bar, shortcuts
β”œβ”€β”€ Player
β”‚   β”œβ”€β”€ MusicBridge.swift   Apple Events bridge (state, commands, artwork)
β”‚   └── PlayerStore.swift   observable state, polling, optimistic actions
β”œβ”€β”€ Lyrics
β”‚   └── Lyrics.swift        LRCLIB client, LRC parser, disk cache
└── Views
    β”œβ”€β”€ RootView.swift      shell, background, hover chrome, empty states
    β”œβ”€β”€ PlayerView.swift    title row, seek bar, transport controls
    └── LyricsView.swift    synced karaoke view / plain fallback

🩹 Troubleshooting

Symptom Fix
"Music isn't running" card Click Open Music β€” Rota never launches Music behind your back
Controls do nothing Grant the Automation permission (see above)
No lyrics for a song LRCLIB simply may not have them β€” the words view falls back or tells you
"Rota can't be opened" on first launch Right-click β†’ Open, or the xattr command in the install section
Widget vanished Open Rota from Spotlight / Launchpad β€” the widget pops right back

πŸ—Ί Roadmap

  • πŸ“± iOS companion widget (WidgetKit + App Intents)
  • 🟒 Spotify as a second, auto-detected source
  • πŸ–Ό Notarized DMG releases
  • πŸͺ Mac App Store build (sandbox + scripting-targets entitlement)

πŸ“„ License

MIT Β© 2026 Alessandro Gaudio. Album artwork belongs to its copyright holders. Lyrics data courtesy of LRCLIB.

About

🎑 A floating Apple Music widget for macOS β€” artwork-first, synced lyrics, native desktop-widget behaviour. Free & open source.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages