Lyrics that keep up with the music.
A menu-bar companion for macOS that floats a small, time-synced lyrics overlay over whatever you're doing — and follows you across every desktop and every fullscreen window. It follows Spotify and your browser, and it can caption what you're watching.
- Lyrics that arrive on cue. Every line is timed to the second. The current line is highlighted the moment it's sung and the next waits dimmed below — never a wall of static text.
- Follows you everywhere. Stays above every desktop Space and every fullscreen app or game, so you never alt-tab back to Spotify to see what's playing.
- Resizes like it means it. Drag it down to a slim now-playing band or open it up to a full lyrics panel. The layout reflows as you go, and a taller card shows more lines at a larger size rather than more empty space.
- Full transport control. Play, pause, skip, scrub, shuffle, repeat, volume and share — Lyrify drives Spotify, it doesn't just watch it.
- Feels native. Real window behaviour: drag from anywhere, resize from any edge or corner, hover-revealed controls, and a red close dot that does what a red close dot does. No dock icon, no clutter.
- Remembers itself. Position, size, whether it's expanded, and whether the artwork tints the panel all survive a restart.
- Follows your browser too. A music video playing in any browser gets the same synced lyrics, with nothing to install and nothing to allow.
- Live Captions. Optional, off by default: turn it on and a separate window shows what the thing you're playing is saying, transcribed on your Mac.
| macOS | 14 Sonoma or later — 26 or later for Live Captions |
| Architecture | Apple Silicon & Intel |
| Spotify | The desktop client, for Spotify lyrics |
| Browser | Any — no extension, no setting to change |
| Network | Lyrics are fetched from LRCLIB |
| Permission | Why | |
|---|---|---|
| Spotify lyrics | Automation → Spotify | Reading what's playing over Apple Events |
| Browser lyrics | None | macOS already publishes what's playing; Lyrify only reads it |
| Live Captions | System Audio Recording | Hearing the app that's playing, to transcribe it |
Lyrify reads playback state from the Spotify desktop app over Apple Events. It does not use the Spotify Web API, so there is no account to connect and no token to manage. The only thing that leaves your machine is an anonymous lyrics lookup by track title, artist, album and duration — for browser videos, without even the album.
It is off until you turn it on. Nothing is captured, nothing is transcribed, and macOS never asks you for anything until you switch it on from the menu bar. Lyrify explains what it's about to ask for before the system dialog appears, and you can decline and stay where you were.
Switched on, Lyrify listens to the one application currently playing — the same one macOS shows in Control Center — and not to the rest of your machine. It does not hear your calls, your meetings, or another app playing alongside. That is a deliberate choice: an earlier version listened to everything and promptly stitched an unrelated conversation into a caption of a video, which was both wrong and more than it had any business hearing.
What protects you, concretely:
- Off by default, and switched off it captures nothing at all.
- Transcribed on your Mac. Apple's on-device speech model. No audio and no text is sent anywhere, by Lyrify or by anything it uses.
- Nothing is written to disk. Captions live in the window while it's open and are forgotten when you turn it off.
- macOS shows an indicator in the menu bar the whole time it is listening.
- Revocable at any moment in System Settings → Privacy & Security → System Audio Recording.
The honest limit of that: while it's on, Lyrify hears whatever the playing application plays. If that application is a browser and you switch to a private video, it hears that too — it follows what's playing, not what you meant. Turning Live Captions off is the way to stop it, and it takes one click.
-
Download the latest
Lyrify-x.y.z-macOS.zipfrom Releases. -
Unzip it and move Lyrify.app to
/Applications. -
Clear the quarantine flag:
xattr -cr /Applications/Lyrify.app
This step is not optional, and it's worth knowing why. Lyrify is ad-hoc signed and never notarized — there's no paid Apple Developer account behind it. macOS therefore refuses to open it and reports, misleadingly, that the app is damaged. It isn't; it simply carries no Apple-issued signature. The command above removes the quarantine attribute that triggers that check.
-
Open Lyrify. It settles into the menu bar with no dock icon.
-
Grant Automation permission. The first time it reads Spotify, macOS asks whether Lyrify may control it. Say yes — without it Lyrify can neither see what's playing nor drive playback. If you dismiss the prompt by accident, re-enable it under System Settings → Privacy & Security → Automation → Lyrify → Spotify.
The menu bar shows Lyrify's mark and nothing else — the overlay is where the track is named. Its menu says whether synced lyrics were found for what's playing, and carries Show Overlay (put the overlay away without quitting), Minimize to Disc, and Quit Lyrify (⌘Q).
The overlay has three forms, and you move between them by dragging its edges:
| Form | What it is |
|---|---|
| Disc | A small circle, spinning while a track plays. Click to expand; Minimize to Disc in the menu bar is the way back. |
| Portrait | The tall shape: artwork on a panel tinted from the cover, progress, then title and artist. Transport sits over the artwork and appears on hover. |
| Band | Once short enough: a single row — artwork, title, and transport. Controls shed from the outside in as it narrows. |
Point at the overlay and its furniture fades in: the close dot, drag dots, and settings. Drag from anywhere on the card to move it; grab any edge or corner to resize. The speech-bubble button swaps the artwork for lyrics, and the sliders button opens settings.
Settings holds two switches. Background color controls whether the whole card — panel, chrome bar and all — takes its colour from the album art. Lyrics only holds the card on the lyrics and takes away the title, artist and button beneath them, giving that strip to the words instead; the card keeps its size, so the lyrics simply get a line more room. It applies at every size, and a short wide card in this mode is nothing but lyrics until you point at it.
The close dot quits Lyrify, the way a red dot does everywhere else on the system. To put the overlay away and keep it running, use Show Overlay in the menu bar.
git clone https://github.com/hemantwasthere/lyrify.git
cd lyrify
swift build # compile
swift test # 109 tests across 14 suites
bash Scripts/build-app.sh # assemble .build/Lyrify.appScripts/build-app.sh takes debug (default) or release. The bundle is not
optional: the Automation prompt needs a bundle identifier and
NSAppleEventsUsageDescription to attach to, and LSUIElement is what keeps
Lyrify out of the Dock. The script ad-hoc signs the result, because macOS keys
the granted Automation permission to a signature — an unsigned rebuild would
re-prompt on every launch.
Note:
build-app.shproduces a host-architecture bundle, which is right for development but not for distribution. A release needs a hand-rolled universal build.
Sources/
LyrifyCore/ Pure logic — parsing, timing, selection. No AppKit. Fully tested.
LyrifyApp/ The AppKit application: overlay, menu bar, Spotify bridge.
Tests/ LyrifyCoreTests
Resources/ Info.plist, icons, and the brand source drawings
Scripts/ build-app.sh, render-brand.mjs
site/ The landing page — Next.js + Tailwind
The split matters. LyrifyCore holds everything with a decision in it —
timestamp parsing, which line is current, how a panel's height maps to a line
count — and has no AppKit dependency, so it's testable without a running app.
LyrifyApp is views and event handling, and its layout is verified by hand;
several files say so in their own doc comments.
cd site
pnpm install
pnpm devEvery icon and raster is generated from one drawing. Edit
Resources/Brand/app-icon.svg, then:
node Scripts/render-brand.mjsThat regenerates the web icon set, the site's favicons and touch icon, the
social card, and both .icns archives. Nothing under Resources/Brand/web/ or
site/public/ should ever be edited by hand — re-running the script is
deterministic, so a hand edit will silently disappear on the next run.
Lyrify keeps its own clock. Spotify is polled over AppleScript for a playback anchor — track, position, playing state — and a local clock advances from that anchor between polls, so lyrics scroll smoothly instead of stepping once per poll. Spotify's own distributed notifications re-anchor it whenever the user changes something.
Lyrics come from LRCLIB, matched on title, artist, album and duration. The match fails closed: if the returned lyrics can't be confidently tied to the playing track, Lyrify shows nothing rather than confidently scrolling the wrong song.
Synced lyrics are provided by LRCLIB, a free and open lyrics database. Lyrify would not exist without it.
Lyrify is an independent project. It is not affiliated with, endorsed by, or sponsored by Spotify AB. Spotify is a trademark of Spotify AB. Lyrify controls the Spotify desktop client through macOS Automation, the same mechanism any scriptable Mac app exposes.