A browser extension for Firefox and Chrome that displays the BPM of songs on Deezer.
- Floating badge — shows the BPM of the currently playing track in a fixed badge at the bottom-right of the page
- Playlist mode — shows the BPM next to each track in a playlist or album view, loaded lazily as you scroll
- BPM Selection & Filtering — select and filter tracks by BPM range using expressions like
>120or124 - Persistent preference — playlist mode and other settings are remembered across sessions
- Localized — UI available in English and French
Firefox
- Download the latest
.xpifile from the Releases page - Open Firefox and go to
about:addons - Click the gear icon → Install Add-on From File…
- Select the downloaded
.xpi
Chrome
- Download the latest
.zipfile from the Releases page - Unzip it
- Open Chrome and go to
chrome://extensions - Enable Developer mode (top-right toggle)
- Click Load unpacked and select the unzipped folder
- Clone the repository
git clone https://github.com/octogene/deezer-bpm.git
- Open Firefox and go to
about:debugging - Click This Firefox → Load Temporary Add-on…
- Select
deezer-bpm/manifest.json
Note: Temporary add-ons are removed when Firefox restarts. Use the signed
.xpifor a permanent installation.
- Navigate to deezer.com and play a track
- A small circular BPM badge appears at the bottom-right of the page
- To show BPM for every track in a playlist or album, click the ≡ button on the badge
- The button turns bold green when playlist mode is active
- BPM values appear next to the track duration column and load as you scroll
- To filter or select tracks by BPM, click the filter icon on the badge
- Enter an expression:
>120(greater than 120),<=90(less or equal to 90),120-130(range), or124(exact match) - Matching tracks are highlighted and automatically checked in the playlist
- Enter an expression:
BPM data is fetched from the public Deezer API (/track/{id}) — no API key required.
For playlist mode, the extension fetches the full track list from the API (/playlist/{id}/tracks or /album/{id}/tracks) and maps each visible row using Deezer's virtual list aria-rowindex attribute. Results are cached for the session so tracks are never fetched twice.
The extension is a plain WebExtension (Manifest V3) with no build step.
deezer-bpm/
├── manifest.json
├── content/ # content script modules
├── styles.css # badge and inline BPM tag styles
├── _locales/ # internationalization support
└── icons/ # extension icons
To work on it locally, load it as a temporary add-on (see From source above). After editing a file, click Reload in about:debugging.
We use ESLint to maintain code quality. To run the linter:
npm install
npm run lint:jsFor more details on how the extension works and a full FAQ, visit the official documentation at octogene.github.io/deezer-bpm.
The CI workflow builds and signs the extension automatically when a version tag is pushed:
git tag v1.0.0
git push origin v1.0.0This requires several repository secrets to be set (Settings → Secrets → Actions):
| Secret | Description |
|---|---|
AMO_API_KEY |
AMO JWT issuer key (Firefox) |
AMO_API_SECRET |
AMO JWT secret (Firefox) |
CHROME_EXTENSION_ID |
The ID of your Chrome extension |
CHROME_CLIENT_ID |
Google OAuth2 Client ID |
CHROME_CLIENT_SECRET |
Google OAuth2 Client Secret |
CHROME_REFRESH_TOKEN |
Google OAuth2 Refresh Token |
Generate Firefox secrets at addons.mozilla.org/developers/addon/api/key. For Chrome, follow the Google documentation to set up API access.
MIT
