Radio Panel
Interactive vinyl-style radio panel for Grafana. The panel supports weekday-based station scheduling, optional timed override, and now playing metadata per station.
Screenshots

Features
- Clickable vinyl disk UI that plays a configured radio stream.
- Day-by-day station setup or one shared station for all days.
- Optional station presets with per-day preset selection.
- Timed override for selected weekdays starting at a specific hour.
- Now playing presets for NPO Sterren NL, Arrow Classic Rock, and custom JSON APIs.
- Optional continuous playback mode for dashboard playlist transitions.
- Styling controls for panel, disk, and label borders.
- Grafana variable support in station name, stream URL, and logo URL.
Station presets
You can optionally use presets as a faster way to configure day schedules.
- Enable
Use station presets for daysin panel options. - Configure preset slots in the
Presetscategory. - Select a preset per day in the
Stationscategory. - Choose
No presetfor a day to use that day's custom station fields.
This is additive and non-breaking: existing day-by-day station setup continues to work.
Now Playing and CORS
This panel runs in the browser as a Grafana panel plugin and cannot use Grafana's server-side data source proxy for arbitrary HTTP requests. Some external now-playing APIs block browser-origin requests due to CORS policy.
The Arrow Classic Rock preset uses r.jina.ai as a default CORS-friendly wrapper so metadata can be fetched in browser context.
You can set one global CORS proxy for all stations with the panel option Now playing CORS proxy URL.
- Leave empty to use the preset default behavior.
- Use a URL prefix (for example
https://r.jina.ai/) to prepend the API URL. - Or use
{{url}}placeholder when your proxy expects a query parameter (for examplehttps://my-proxy.example/fetch?url={{url}}).
When a now-playing request is blocked by CORS (or another network-level browser restriction), the panel stops polling that endpoint for the active station and falls back to the normal station/status text. When a configured API responds successfully but has no current track, the panel shows a dedicated placeholder such as No track available instead of the old station status text.
Add your own now-playing API
Yes. You can configure your own endpoint without code changes:
- Set the station
now playing presettoCustom JSON API. - Fill in
now playing API URLwith your endpoint. - Optionally set
Now playing CORS proxy URLwhen the endpoint blocks browser CORS. - If the API is valid but no track is currently returned, the panel shows the
No track available textoption from the Display settings.
The custom parser tries common keys such as artist, title, song, track, image, and coverUrl, as well as common nested structures like tracks[0], currentTrack, latestTrack, and data.items.
Example: custom now-playing API
https://example.com/api/nowplaying?station=main
Example payload shape:
{
"station": "main",
"tracks": [
{
"artist": "Mau P",
"title": "Neck",
"albumArt": "https://cdn.example.com/covers/abc123.jpg"
}
]
}
The parser also supports other common shapes such as currentTrack, latestTrack, data.items, artist + title at the root, and coverUrl / image / artwork values.
Requirements
- Grafana
>=12.3.0
Support
Plugin Insights
Quality scores for version 1.3.0
- Status: PassedSecurity
All checks passed
- Status: PassedMaintenance
All checks passed
- Status: PassedDocumentation
All checks passed
- Version
- 1.3.0
- Dependencies
- Grafana >=12.3.0
- Developer
- teuwsenservices
- Last Updated
- August 14, 2026