LyricGlow

August 10, 2026 · View on GitHub

LyricGlow — real-time synced lyrics app for macOS

LyricGlow

Real-Time Synced Lyrics for Spotify & Apple Music — in Your macOS Menu Bar

Karaoke-style word-by-word lyrics in a floating Liquid Glass window and live in the menu bar, with built-in translation into 43 languages. Free, open source, no account needed.

CI Latest version Total downloads MIT license macOS 11+ — Apple Silicon and Intel


LyricGlow demo — synced lyrics with word-by-word karaoke highlighting and live Persian translation
Word-by-word glow · live Persian translation
LyricGlow promo — Despacito with Spanish lyrics translated live into English
Despacito — Spanish lyrics · live English translation

🎬 Full promo videos: Spanish → English (Despacito) · English → Persian (Beat It)


brew install --cask ateymoori/tap/lyricglow

Install

Homebrew (recommended — signed & notarized, zero warnings):

brew install --cask ateymoori/tap/lyricglow

One-line installer (no Homebrew needed):

curl -fsSL https://raw.githubusercontent.com/ateymoori/lyricglow/main/scripts/install.sh | bash

Runs on: macOS 11.0+ · Apple Silicon (M1–M4) and Intel · needs the Spotify or Apple Music desktop app · internet for lyrics (cached content works offline)

Manual installation & first-run permission
  1. Download from Releases: LyricGlow-arm64.dmg (Apple Silicon) or LyricGlow-x64.dmg (Intel)
  2. Open the DMG → drag to Applications
  3. Open it — since v0.7.0 the app is code-signed and notarized (Developer ID: Royan AB), so macOS launches it without warnings

Old unsigned builds (v0.6.1 and earlier) need one command if macOS refuses to open them:

xattr -cr /Applications/LyricGlow.app

Automation permission: LyricGlow reads the current track with AppleScript, so macOS asks for Automation access on first run. If you dismissed the prompt, the app shows a one-time explainer with an Open Settings button, or grant it manually in System Settings → Privacy & Security → Automation → LyricGlow → enable Spotify / Music. The app detects the grant and resumes automatically — no restart needed.

The app runs as a menu bar agent (LSUIElement) — no Dock icon, no application menu.


Why LyricGlow?

  • Translation is built in. Every lyric line can show a live translation into any of 43 languages — including full RTL rendering for Persian, Arabic and Hebrew. Most lyrics apps charge a subscription for this.
  • Lyrics live in your menu bar. The current line ticks by next to the clock, so the window can stay hidden while you work.
  • Private by design. No account, no analytics, no tracking. Lyrics, artwork and translations are fetched from open sources and cached on your disk.
  • Light on the battery. Polling is adaptive, UI updates are event-scheduled, and rendering stops completely when nothing is playing.
  • Works with both Spotify and Apple Music — detection is local, via AppleScript.

Features

Lyrics

  • Word-by-word glow synced to playback
  • 3-line view (previous / current / next)
  • Full lyrics modal with auto-scroll
  • Click any line to jump there
  • Live lyric line in the menu bar
  • Floating Lyrics: just the line, on your desktop
  • Instrumental / not-found states
  • RTL support (Arabic, Persian, Hebrew)

Playback & Metadata

  • Spotify and Apple Music detection
  • Play/pause, next, previous, seek
  • Album art on a vinyl-disc display
  • Artist bio, country, genre, links
  • Artist image carousel + full-size viewer
  • Spotify top tracks & albums (after login)

App

  • Translation into 43 languages
  • Per-section show/hide controls
  • Cache browser (list, delete, clear)
  • Log stats, open folder, clear
  • Launch at login, update checker
  • Liquid Glass UI, follows system theme

Data sources: synced lyrics from LRCLIB, artist metadata from TheAudioDB, top tracks/albums from the Spotify Web API (optional login), translations from Google Translate's web endpoint with Lingva Translate as automatic fallback. Everything is cached on disk for 7 days by default.


Screenshots

LyricGlow full mode — synced lyrics with artist bio, top tracks and albums
All sections visible
LyricGlow compact mode — floating lyrics widget for Spotify on macOS
Compact — metadata hidden
Lyrics-only mode with karaoke word-by-word highlighting
Lyrics only
RTL lyrics support — Persian, Arabic and Hebrew translation
RTL support

Layouts are built from the Display settings tab — each section can be toggled independently.



Live synced lyrics in the macOS menu bar next to the clock
Live lyrics in the menu bar — works with the window hidden

How to Use

  1. Launch LyricGlow from Applications — it lives in the menu bar
  2. Play music in Spotify or Apple Music
  3. Watch lyrics sync word-by-word in the window and next to the tray icon
  4. Customize via the gear icon, or the menu bar icon → Settings
Window controls & shortcuts
ActionResult
Cmd+L (global)Toggle the floating window on/off
Click menu bar iconShow / focus the window (also re-enables it after ×)
Drag the window backgroundMove the window (frameless, resizable, always-on-top)
Click / drag the progress barSeek to that position
Click the line above / belowJump to that lyric
Click album art / vinylOpen the track in Spotify (Spotify playback only)
Document button (next to ▶)Open the full lyrics modal (Esc closes it)
Click any line in the full lyricsJump to that point in the song
× buttonHide the window and turn off Show Window
Floating Lyrics (menu bar or Settings)Turn the window into a bare lyric line on the desktop

The full lyrics view follows the current line on its own. Scrolling it yourself takes over, and a Resume auto-scroll pill appears to hand control back. Clicking a line also resumes following.

Floating Lyrics

LyricGlow Floating Lyrics — click-through lyric line with live Persian translation floating over the desktop
Only the words — click-through, above every app, translation included

Like a desktop lyric overlay: only the current line, large and centred, with the word-by-word glow and the translation underneath. No window, no controls, no background — clicks pass straight through to whatever is behind, and the line floats above full-screen apps on every space.

To move it, choose Move Floating Lyrics in the menu bar: the bar becomes draggable and outlines itself. Drag it where you want, then choose Lock Floating Lyrics to make it click-through again and remember the spot. Floating and normal layouts each remember their own position and size.

While no line is playing (instrumental passages, or a track with no lyrics) the overlay draws nothing at all rather than parking a status message on your desktop. Opening Settings returns the window to the normal layout, since the settings panel does not fit in the slim bar.

Menu bar menu: Show Window · Show Tray Lyrics · Floating Lyrics · Move/Lock Floating Lyrics · Settings · Check for Updates · Quit

Settings & where your data lives
TabContents
GeneralLaunch at login, menu bar lyrics, Floating Lyrics, translation on/off + target language, Spotify login/logout
DisplayShow/hide each UI section, reset to defaults
CacheTotal size, per-entry list with delete, clear all
LogsLog file count/size, open the logs folder, clear logs
DataPath
Settings~/Library/Application Support/LyricGlow/config.json
Cache (lyrics, metadata, images, translations)~/Library/Application Support/LyricGlow/.cache
Logs~/Library/Logs/LyricGlow/main.log

Spotify tokens are encrypted with the macOS Keychain-backed safeStorage API before being stored.


Troubleshooting

SymptomFix
"Permission Required" in the windowGrant Automation access (see Install)
Window never appearsMenu bar icon → Show Window, or press Cmd+L
No lyrics for a trackLRCLIB has no synced lyrics for it; only synced ([mm:ss.xx]) lyrics are shown
Spotify login does nothingSPOTIFY_CLIENT_ID is missing from .env (source builds only)
Top tracks / albums stay empty after loginSpotify requires the app owner to hold Premium; the log shows one warning and the app pauses Spotify requests for 30 min. Artist data still loads from TheAudioDB
Stale artwork or metadataSettings → Cache → delete the entry or Clear All
App won't open after downloadOnly old unsigned builds (v0.6.1 and earlier): xattr -cr /Applications/LyricGlow.app. v0.7.0+ is notarized and opens directly

Development

Prerequisites: macOS, Node.js 22 (the version used in CI), npm.

git clone https://github.com/ateymoori/lyricglow.git && cd lyricglow
npm install
cp .env.example .env      # optional: needed only for Spotify login
npm start                 # build and launch the app

CI runs npm ci, npm run typecheck and npm run build on macos-latest for every push and PR.

Environment variables

.env is optional and read from the project root at runtime. Only two keys are used:

KeyPurpose
SPOTIFY_CLIENT_IDEnables "Login with Spotify" (top tracks & albums). Create an app at the Spotify dashboard and add musicdisplay://callback as a redirect URI. Note: Spotify's current policy requires the app owner's account to hold an active Premium subscription before the Web API answers, and apps in development mode only accept users added in the dashboard.
CACHE_DURATION_HOURSCache lifetime in hours (default 168 = 7 days).

.env is bundled into the packaged app, so build your DMG after creating it if you need Spotify login in a self-built release.

One extra launch-time variable: LYRICGLOW_CAPTURE=1 starts the window on the normal layer instead of always-on-top, so screen recorders and Zoom/Meet window pickers can see it — macOS hides overlay windows from window capture. Used for demo recordings and screen sharing.

Scripts & releasing
CommandWhat it does
npm run develectron-vite dev mode (rebuilds main/preload on change)
npm run buildBuild main, preload and renderer into dist/
npm startbuild + launch Electron
npm run typechecktsc --noEmit for the node and web tsconfigs
npm run lint / npm run formatBiome check / format ./src
npm run qualityknip (dead code) + jscpd (duplication) + Biome
npm run dist:macSigned DMGs for arm64 and x64 in release/
npm run releaseFull release pipeline: version bump, signed DMGs, notarization + stapling, git tag, GitHub release, Homebrew cask update

Releasing (maintainers): add a ## [x.y.z] section to CHANGELOG.md, then run npm run release (or -- minor / -- major). The script checks the tree is clean and in sync, bumps the version, builds both DMGs signed with the Royan AB Developer ID, notarizes and staples them with Apple, then tags, publishes the GitHub release, and updates the Homebrew cask. One-time setup: the Developer ID certificate in the Keychain, a notarytool profile named lyricglow-notary, and an authenticated gh CLI.

Project structure & architecture
src/
├── main/                    # Electron main process
│   ├── index.ts             # Lifecycle, window, tray, AppleScript polling, IPC handlers
│   ├── auth/                # Spotify PKCE OAuth (token storage + refresh)
│   ├── managers/            # Lyrics, TheAudioDB, Spotify metadata, translation,
│   │                        # unified cache, image cache, update check
│   └── translation/         # Provider interface + Google Web / Lingva chain
├── preload/index.ts         # contextBridge API exposed as window.musicAPI
├── renderer/index.ts        # UI logic: sync manager, displays, metadata, settings
└── shared/utils/            # Logger, SecureFetch (verified HTTPS), LrcParser

resources/                   # index.html + styles.css loaded by the renderer
build/                       # App icon, tray icons, DMG background, entitlements
scripts/                     # install.sh (end users), release.sh (maintainers)

How it fits together: the main process runs a cached AppleScript through osascript on an adaptive interval (1.8 s while playing, 3 s paused, 5 s idle, with an immediate poll after any transport action), broadcasts track changes over IPC, and fetches lyrics/metadata in parallel. The renderer interpolates position between polls for smooth progress and word glow, and stops rendering while paused; the menu bar line is scheduled to update exactly when the next lyric line is due, so it stays correct even when the window is hidden — at near-zero idle cost.


Contributing

PRs welcome! Priority areas:

  • Windows/Linux support (music detection is macOS/AppleScript-only today)
  • Additional lyrics sources
  • Automated tests
  • UI translations

Please run npm run typecheck and npm run lint before opening a PR.


Credits

ServicePurpose
LRCLIBSynchronized lyrics
TheAudioDBArtist metadata, biography, images
Spotify APITop tracks & albums, artist details
Google Translate / LingvaLyrics translation (43 languages, with fallback)
VazirmatnFont for Persian/Arabic lyrics


MIT License © AmirHossein Teymoori

If LyricGlow makes your music better, a ⭐ helps others find it.

Report Bug · Request Feature · Changelog · Releases