BEETBRAINZ(1)
π BEETBRAINZ π
okay bestie, sit down, hydrate, because we're about to talk about beetbrainz β a lightweight webhook listener for ListenBrainz scrobbling, and honestly? she's iconic. it's a page in the User Commands manual and she is serving.
β¨ SYNOPSIS β¨
beetbrainz
that's it. that's the whole vibe. no flags, no drama, just run her. π
πΈ DESCRIPTION πΈ
Beetbrainz is a Go-based webhook listener that bridges media server playback events with scrobbling to ListenBrainz. like a lil matchmaker for your music and your stats. no cap.
She processes playback events from:
- Emby
- Jellyfin
- Plex (standalone or with Tautulli)
- Local MPRIS-enabled players or MPD servers (via Beetpost)
When a playback event shows up, Beetbrainz can cross-reference the played track with a local Beets database to gather enriched metadata. This may include album, year, track number, and MusicBrainz identifiers when available. it's giving thorough. π
If Beets integration is unavailable, Beetbrainz will submit basic metadata directly from the webhook payload. she's flexible like that fr fr.
π«Ά REQUIREMENTS π«Ά
For Beetbrainz to function correctly, she requires:
- Beets with the web plugin installed, enabled, and running.
- One supported media server (Emby, Jellyfin, Plex, etc.).
that's the whole shopping list bestie, don't overthink it π
π INSTALLATION π
This section focuses on systemd user installations. yes, user installations. keep that in mind.
Fedora
Beetbrainz is available in the official Fedora repositories. slay β¨
Install with:
sudo dnf5 install golang-codeberg-gbcox-beetbrainz
This will also install Beets if necessary. two birds, one command, we love efficiency π
After installation, configure the service before starting it. like, actually configure it first. don't rawdog the start.
π¦ BEETS SETUP π¦
For metadata enrichment to work properly:
- Running: Start the Beets web plugin (e.g.,
beet web). - Accessible: Default address is
127.0.0.1:8337. - Correct user: The Beets web process must run as the user who owns
~/.config/beets/config.yamlandlibrary.db.
that last one is the one people mess up, bestie. same user. same vibes. periodt.
π RELIABILITY AND SPOOLING π
Beetbrainz is designed as a durable background service. she does not simply evaporate when things go sideways.
If ListenBrainz is temporarily unavailable, scrobbles are written to a local spool directory instead of being discarded. no silent loss, no ghosting your own listening history π
Spool characteristics:
- Append-only JSON Lines format
- One file per day (e.g.
scrobbles-YYYY-MM-DD.jsonl) - Safe across restarts
- No silent data loss during outages
The spool directory is controlled by:
BEETBRAINZ_SPOOL_DIRβ Default:~/.local/state/beetbrainz/spool
π REPLAY π
Queued scrobbles can be replayed manually using:
beetbrainz-replay
Replay behavior:
- Processes spool files in chronological order
- Preserves original
listened_attimestamps - Deletes spool files only after successful submission
- Safe to run multiple times
If ListenBrainz remains unavailable during replay, files are left intact. she's not gonna nuke your backlog out of spite, she's a professional π«Ά
Automatic Replay
A user-level replay service and timer are provided:
beetbrainz-replay.servicebeetbrainz-replay.timer
Enable automatic replay:
systemctl --user enable --now beetbrainz-replay.timer
The timer runs periodically (typically hourly) and automatically drains backlog when ListenBrainz becomes reachable. set it and forget it energy β¨
If user lingering is enabled:
loginctl enable-linger <username>
the replay timer will continue running even when logged out. logged out but still scrobbling? that's main character behavior π
π CONFIGURATION π
Beetbrainz is configured via environment variables, typically set using:
systemctl --user edit beetbrainz.service
Common variables:
USER_TOKENSβ Format:<username>:<token>. Required for authentication to ListenBrainz.BEETS_IPβ Default:127.0.0.1BEETS_PORTβ Default:8337BEETBRAINZ_IPβ Default:0.0.0.0BEETBRAINZ_PORTβ Default:5000BEETBRAINZ_PLAYINFOβ When set totrue, playback information is written back into the Beets library.
no token, no scrobbles bestie. USER_TOKENS is the whole personality of this setup π
β SERVICE MANAGEMENT β
After configuration:
systemctl --user enable beetbrainz.service
systemctl --user start beetbrainz.service
Check status with:
systemctl --user status beetbrainz.service
look at her go. so productive. so stable. we're obsessed π₯Ήπ
π SEE ALSO π
beetbrainz-replay(1), beets(1), systemd(1), systemctl(1)
go read those too, iykyk π
π AUTHORS π
gbcox
that's the whole page bestie, you ate that πβ¨
and for the cute sign-off: this lil masterpiece is part of the Beetbrainz Documentation, dated March 3, 2026. screenshot it, frame it, put it on the fridge. ππ¦πΈ
π¦ where this page comes from
- fedora 44: golang-codeberg-gbcox-beetbrainz 1.13.1-2.20260825gitea5fc82.fc44 Β· GPL-3.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms