croon
Synced lyrics for whatever is playing, in your terminal.
Detects the currently playing song system-wide on macOS, fetches time-synchronized lyrics from LRCLIB (free, no API key), and falls back to scraping plain lyrics from Genius when no synced version exists. Synced lines highlight and auto-scroll in time with playback.
Note: Genius itself only has plain-text lyrics (no timestamps), which is why LRCLIB is the primary source for true sync.
Install & run
uvx croon # run without installing
# or
pip install croon && croon
# or, from a checkout
uv run croon
Now-playing backends
Tried in order; the first one that works is remembered:
media-control— system-wide, works on macOS 15.4+ (brew install media-control)nowplaying-cli— system-wide, older macOS (brew install nowplaying-cli)- Spotify via AppleScript (no install needed)
- Apple Music via AppleScript (no install needed)
So with Spotify or Apple Music it works out of the box; install
media-control for other players (browser, VLC, etc.). The first
AppleScript call may trigger a macOS Automation permission prompt for your
terminal.
Keys
| Key | Action |
|---|---|
q |
Quit |
r |
Refetch lyrics |
s |
Edit/search for the current song on Genius |
+/- |
Nudge sync offset ±0.5 s |
f |
Toggle auto-follow (free scrolling) |
h |
Toggle footer |
l |
Toggle lyrics-only mode |
o |
Open the song's Genius page in a browser |
If player metadata is missing or incorrect, press s, edit the pre-filled
artist/title query, and press Enter. Press Escape to cancel the search.
Behavior notes
- Synced (LRCLIB): current line is highlighted and centered.
- Plain (LRCLIB/Genius): position is estimated from track progress, so scrolling is approximate.
- Header shows position, lyrics source, and detection backend; a non-zero
sync offset appears top-right (e.g.
delay +1.5s).
Metadata
Release files for croon 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| croon-0.1.1.tar.gz | 10.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| croon-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.4 kB
Release files / croon-0.1.1.tar.gz
| Download URL | croon-0.1.1.tar.gz |
|---|---|
| Size | 10.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c383a445b4296de4502f286a2fe61d2d6cc75475523d171d40a3f50c978421b1
|
|
BLAKE2b-256 checksum How to use checksums |
96a63d3a70ddaf7f3b671b4e70943bdc1812cf2607715002666967e8a5f54aaa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / croon-0.1.1-py3-none-any.whl
| Download URL | croon-0.1.1-py3-none-any.whl |
|---|---|
| Size | 11.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7a1315bffcdc2d875051d1a594fd283a54954c6e12d78c360d3591e0b70d26b9
|
|
BLAKE2b-256 checksum How to use checksums |
aac01610d59b0e4981c042d7c195b884cfc4ae173a35d880695baa225bc0825f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|