CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.11.0] - 2026-11-07
### Highlights
- **An equalizer for each speaker:** ten bands set by dragging the curve, your own presets or a headphone profile from AutoEq, so the speaker without bass gets some while the others stay as they are. Behind the new button in the player
- **Room lights that play along:** Philips Hue lights flash on the beat and take their colours from the music, whether Beacon casts it or a computer plays it. Pair the bridge with the lightbulb button in the player
- **More from Deezer, no setup needed:** see which songs of an album your library is missing, fill a playlist from the charts or an artist's top tracks, and hear 30 seconds of anything before you get it
### Added
- Philips Hue lights can play along with the music, whether Beacon casts it or a computer or tablet plays it: a lightbulb button in the player pairs the bridge and sets the room, style, colours and brightness, with a live preview that plays along with the song playing (or a 120 BPM example when nothing plays)
- An equalizer with ten bands, set by dragging points on its curve, with a few presets and presets of your own, or a headphone profile from AutoEq or REW played exactly as measured, behind a button in the player: it sets whatever is playing, this device or the speaker you cast to, each speaker separately, so a speaker without bass can get some without the others getting it too. A speaker's curve follows your account to every device you cast from, and with gapless or crossfade on a change reaches the speaker without a break
- An album page can show the songs of the album your library is missing: a "Missing songs" button compares it with its largest edition on Deezer, deluxe tracks included, and lists the missing ones dimmed at their place in the track list, each with a menu to play its 30-second preview or copy "Artist - Title". While they are shown, the album's Preview takes them in too
- The playlist builder can fill a playlist from Deezer with no key or setup: its current charts, overall or by genre, an artist's top tracks, a mix around an artist, or any public Deezer playlist, found by name, picked from the popular ones or pasted as a link
- Every track in the playlist builder's result can be heard as a 30-second Deezer preview, whichever service the list came from, including the ones your library does not have. It plays like an album's preview: the queue waits paused, and it works while casting too
- Each artist in "New artists to explore" on Home can be heard before you get their music: a button on the photo plays 30 seconds of each of their six top tracks on Deezer, one after another, like an album's preview. A song Deezer lists in several versions (radio edit, extended mix) plays only once
- The playing song's menu in the player bar can copy "Artist - Title", for a web search; it is there for a Deezer preview too
- The release notes thank the people who reported, asked for or contributed something to that version, with their GitHub picture and a link to their profile
### Changed
- With a ListenBrainz name set, the shuffle buttons on Home's two Discover shelves are there too: they swap your personal recommendations for suggestions around other artists you play often, and the next start brings the personal ones back
- The Playlists page has one playlist builder button instead of one per service: Deezer, Last.fm or ListenBrainz is picked inside it, and it opens on the one used last
- On the phone, party mode and Settings sit in a menu at the right of the top bar, with the equalizer while casting
- When the player bar is too narrow for the volume slider, turning the mouse wheel shows the new level on the volume button for a moment
- Electron, the build tools and the backend's libraries are updated to their latest versions
- The "What's new" dialog opens once per version for each account, so a browser that clears its storage on exit no longer shows it at every login, and other browsers using the same Beacon server skip it too (contributed by [@b-r-y](https://github.com/b-r-y), [#80](https://github.com/mihaitom/beacon/issues/80))
- Running the backend from source keeps its pairings, API keys and settings in your user data folder (`~/.local/share/beacon-connect` on Linux) instead of the `connect` folder
- The playhead on the waveform glides along while a song plays instead of moving in small jumps, most noticeable on 30-second previews
### Fixed
- While casting with Autoplay on, a song picked with "Play next" right after Autoplay filled up the queue no longer disappears from the queue again a moment later
- Beatmix now also mixes songs with a bassline on the offbeat, which it used to take for a wavering tempo and leave out
- With a ListenBrainz name set, "New artists to explore" on Home fills up again instead of showing only one or two artists, and no longer suggests artists you already have under a slightly different spelling
- When the phone or browser pauses the music on its own, for example because a Bluetooth speaker or headphones disconnected, Beacon now shows it as paused, and play starts it again right away instead of needing pause first
- The songs in a smart playlist's preview and the library matches in the playlist builder have a right-click menu like songs everywhere else
- With a light theme, the artist photo on an artist page is as large as with a dark one, and on artist and album pages it fades straight into the page instead of through a dark stripe
## [1.10.0] - 2026-10-25
### Added
- Songs and albums can be rated with stars from their right-click menu everywhere, the playing song in the player bar too. The album and artist lists show the stars, set them directly and sort by them (requested by [@mjj042](https://github.com/mjj042), [#55](https://github.com/mihaitom/beacon/issues/55))
- With Navidrome, Beacon keeps the queue on the server, so another app or Beacon on another device can carry on with it at the same song and position. A queue another app or device saved there since is offered once instead of overwritten, so two devices on one account can play different things side by side, and the queue's toolbar loads it or saves your own over it
- AirPlay speakers have a volume control while Beacon casts to them, like Sonos, Chromecast and DLNA
- Casting to a Sonos with repeat switched on in the Sonos app says so and can switch it off, since it made every song start over for a moment at its end
- A Chromecast knows how long the song is, so Google Home and a TV show a progress bar for it
- The help has a networking guide: which connections casting needs, Docker, a server in more than one network, speakers in another VLAN and Wi-Fi settings that get in the way, with a checklist for a speaker that stops or starts a song over
- With the log level at Debug, Now Playing shows how the cast stream reaches each speaker: what was sent, whether the speaker is still reading, how much it has buffered and the last error it reported ([#56](https://github.com/mihaitom/beacon/issues/56))
### Changed
- Songs, Albums, Artists and a genre's page are built for finding things in your library: each sorts by every field it shows, either way round, with headings in the list and an index bar that follow the order (letters, decades, stars, and ranges for BPM, length, number of songs or albums, plays and dates). A filter menu narrows the list by its fields, several values at once, and the album and artist lists label their columns in the list view. Which columns the album and artist lists show can be picked from their heading, like on the song table, with genre, type and date added new for albums and genre, years active, length, plays, last played and date added for artists, each of which artists can also be sorted and filtered by, and every row has the heart and a "..." menu button as song rows do. Songs and a genre's page can show their songs as a grid of covers too. An error now stays in sight above the search while you scroll
- Home is tidier and quicker: recently played albums are two rows of small tiles, the most played songs a chart counted across your whole library, and the Frequently played shelf is gone. Coming back shows the page straight away while it refreshes, and Discover keeps its picks until you shuffle them
- Now Playing on a phone held sideways is made for a car mount: only previous, play/pause and next, larger and further apart, plus the progress bar. Shuffle, repeat, Autoplay, casting, volume and the heart are left out there and stay in the upright view
- A song by several artists links to each of them on their own, with a middle dot instead of "feat.", "&" or "×", and its menu offers every one of their pages. Names like "Years & Years" stay whole as long as the artist is in your library
- A DJ mix out of a song that fades out happens before the fade, so the previous song no longer drifts away before the next one has taken over
- Without an artist background, Now Playing takes its colour from the cover, and clicking the artwork switches between large and small
- The help has a search across all its pages, a table of contents beside the page and a back button, and is sorted into frequently asked questions, guides and background. "What Beacon can do" is the first entry of the FAQ instead of a dialog and button of its own in Settings
- The search is calmer: one row of controls, exact spelling as an "Aa" button inside every search field, and Beacon's loading animation in the middle of the page while results come in
- The bundled ffmpeg, Electron and the backend's libraries are updated with their latest security fixes, among them one for Ogg radio streams
### Fixed
- Casting works from a computer or server connected to more than one network: each speaker gets Beacon's address in its own network, where songs used to break off or start over after about half a minute (reported by [@mjj042](https://github.com/mjj042), [#56](https://github.com/mihaitom/beacon/issues/56))
- Casting moves on to the next song when a song's audio is shorter than its listed length, as with some VBR MP3s, instead of stopping until pause and play are pressed ([#56](https://github.com/mihaitom/beacon/issues/56))
- On an iPhone or iPad playing at a reduced quality from outside the home network, a long song no longer gets the phone locked out by a reverse proxy running CrowdSec, which mistook loading the song for a crawler
- The backend's logs no longer contain the media server login, so a log can be shared without giving away access to the server
- Signing in says why it failed: a busy or unreachable server, a login page in front of it or a certificate problem no longer reads as a wrong password
- Resuming a paused DLNA renderer could leave it paused while Beacon showed it playing
- A Sonos or DLNA speaker with a space in its name keeps Beacon up to date, so its volume follows a change made on the speaker or in the Sonos app ([#56](https://github.com/mihaitom/beacon/issues/56))
- Song lists sorted by last played or date added put songs without a date at the end, newest first as well, instead of at the top
- Adding a song to a playlist, or making a new one from it, keeps a long song list where it was scrolled to instead of jumping back to the top
- Lyrics are found automatically for more songs, especially ones with a featured artist, where the list of matches already had the right one
- A favorite or star rating set in one place shows everywhere else straight away instead of after up to an hour
- The song library is kept for the next start after signing in or a rescan, instead of being loaded in full every time, and a new, renamed or deleted playlist shows in the overview straight away
- Smaller display fixes: the waveform no longer shifts every second on long songs, a phone held sideways no longer leaves a gap beside the small cover in Now Playing, the "Albums" heading on an artist page is readable on a light theme, and artists and albums without artwork no longer show an empty "Details" heading in their menu
## [1.9.0] - 2026-10-18
### Highlights
- **Themes:** besides Beacon there is the dark Graphite and the light Paper and Glacier, or a theme of your own from a background and an accent colour. Pick one under Settings → Appearance
- **Favorites on the phone and in the Remote Control:** a tab of its own with your favorite songs, albums and artists, and on Plex too
- **A fresher look:** Beacon's own typeface, a search in the middle of the top bar, and a new Genres page whose biggest genres stand as crates of records to flip through
### Added
- Themes: besides Beacon there is the dark Graphite and the light Paper and Glacier, or a theme of your own from a background and an accent colour, chosen per device under Settings → Appearance. Artwork headers and Now Playing stay dark on the light themes, and the Remote Control on the phone takes on the theme of the app it controls. Now Playing can also be kept from tinting the app and its visualizer in the colour of the artist background, so they stay in the theme's accent (requested by [@mjj042](https://github.com/mjj042), [#55](https://github.com/mihaitom/beacon/issues/55))
- The phone and the Remote Control have a Favorites tab with your favorite songs, albums and artists. It takes the place of the Now Playing tab, which the player bar above the tabs already opens, and the Queue tab moves to the front. Songs are marked as favorites with the heart next to the title on Now Playing or from a song's actions, and on the phone albums from their page
- Favorites work with Plex too: a favorite there is a five-star rating, the same thing Plexamp's like sets, so the heart and the fifth star always agree
- The Genres page is new: the biggest genres stand as crates of their records, flipped through one record at a time while pointed at, and below them every genre is listed like a book's index with its number of songs, the big ones set stronger, with the jump bar beside it
- On the phone and in the Remote Control, the library has an Artists tab, and every artist has a page with their most played songs, their albums and the artist radio. Artist names on Now Playing and in a song's actions lead there, on the phone also on an album
- Right-click a song in the queue to play it now or next, move it to the end or remove it. The menu also has what song lists offer: Song Radio, add to playlist, go to album or artist, artwork and info. On the phone and in the Remote Control, holding a song and letting go opens the same actions as a sheet. While a transition is already prepared, "next" means right after the song it leads into, and clicking the artist of a song in the queue opens the artist's page
- The album list can be sorted by artist, year or date added as well as by name; sorted by year, the bar on the right jumps between decades. Albums and Artists can also be shown as a list instead of a grid, with year, number of songs and length, or number of albums and songs, on each line
- With DJ mixes on, the queue can be sorted by tempo, so more songs follow one with a similar BPM and get mixed instead of crossfaded. Offered when most songs in the queue have a BPM tag and shuffle is off
- Desktop app: the window opens where and as large as it was last time, starting Beacon a second time brings the open window to the front instead of opening another, and the window title shows what is playing
- On Windows, the taskbar preview has previous, play/pause and next buttons, and the taskbar icon shows how far into the song playback is
- The Remote Control speaks your phone's language: German, English, Spanish, French or Italian, as the app does
- The release notes show what is being worked on for the next version, whenever there is something, and list releases newer than the one you are running as versions of their own
- The player bar's buttons explain themselves on hover, with their keyboard shortcut
### Changed
- A fresher look: Beacon brings its own typeface instead of using whatever the system has, buttons are no longer written in capitals, the play button is a little smaller, and the statistics page keeps amber for the listening figures
- The search sits in the middle of the top bar, ready to type into, and Ctrl+K (Cmd+K on a Mac) jumps to it. The Beacon logo moved to the top of the sidebar, and the button that shows its labels to the bottom
- On the phone and in the Remote Control, the player bar above the tabs is always there. With nothing playing it shows the queue's first song, which play starts, or "Nothing playing" when the queue is empty, and a tap always opens Now Playing with its controls and speaker picker
- With transitions on, Sonos and AirPlay speakers now get lossless audio instead of AAC or MP3
- The DJ mix length is chosen in bars (4, 8 or 16) instead of seconds, so it lasts the same musical phrase at every tempo. A length set before is carried over
- DJ mixes follow where the beat actually plays: out of a song that ends on a long ambient tail (no drums, just a pad or a fade-out) the mix starts while the beat is still playing and drops the tail, and into a song with a long intro the bass swaps right where its beat sets in. Before, such songs often got no DJ mix at all and the next song was faded in over the almost silent end
- DJ mixes sound cleaner on pop, rock and hip hop: once the next song's bass has come in, the previous song fades out within two bars instead of singing on under the new one, and songs whose tempos lie further apart get a crossfade instead of being audibly slowed down or sped up. While a mix brings the previous song to the next one's tempo, voices and chords stay clean instead of sounding distorted or as if heard through a fan
- Where the next song has synced lyrics, a DJ mix or crossfade ends right as its singing starts, and around the change both songs' voices are turned down a little so they do not pile up
- Now Playing shows the familiar arrows before the next song again and names the transition in words instead: crossfade, or DJ mix with its tempo. Hovering "Crossfade" tells why it could not be a DJ mix, and with the artwork hidden both songs stay in the corner until the previous one has faded out
- Clicking a song in a playlist plays the whole playlist from there instead of only that song, as it already did on the phone
- Song Radio started from the song that is playing keeps it playing and only replaces what comes after it, instead of starting the song over
- Songs in the queue can be grabbed anywhere to drag them, without a handle, and dragging near the top or bottom of the queue scrolls it quickly. On the phone and in the Remote Control, hold a song until it lights up and then move it; there a long queue now also scrolls during a drag, which it did not at all before
- On the Playlists page and at the top of the smart playlist editor, a playlist's artwork stands as a small stack of its albums and is flipped through while pointed at, as on the Genres page
- Smaller touches: the header of the overview pages is lower in an ordinary window and taller in a very wide one, where the artist banner shows in full; the Home page's header shows the artist's banner or the blurred cover instead of the background photo; empty pages say what to do next instead of showing a blue notice; long album titles get a smaller type instead of being cut off; a new page fades in briefly unless the system asks for reduced motion; and the release notes say that they are only available in English
### Fixed
- With transitions on, the app no longer starts playing by itself about a minute after it was paused: after a cast ended, after pressing pause, or after reopening it with a song waiting. It now stays paused until play is pressed
- Playback on a network that cuts long connections (such as a company proxy) picks up where it was instead of stopping or jumping back to an earlier song, and pressing play after a lost connection starts it again instead of needing a reload
- When another app or a second Beacon puts something on a speaker Beacon is casting to, Beacon's position, lyrics and track end no longer jump back to the start along with it
- A speaker that drops out and only comes back after Beacon has reported the interruption, or that asks for a song again once it has ended, stays quiet instead of playing on by itself. Playback continues from the interruption notice or with play
- With an S1 and an S2 Sonos system on the same network, the device list shows the speakers of both instead of switching between one and the other (reported by [@ampcat3](https://github.com/ampcat3), [#54](https://github.com/mihaitom/beacon/issues/54))
- iPad in landscape: the volume slider no longer jumps back after letting go, and where the iPad's own volume buttons are the only way to change the level, the slider is left out as it already was in portrait (reported by [@ampcat3](https://github.com/ampcat3), [#53](https://github.com/mihaitom/beacon/issues/53))
- With transitions on, removing, moving or shuffling songs in the queue no longer ends the mix after the current song with a gap, playback after a seek while paused or after reopening the app starts where it stood instead of seconds later, and Stop and logging out also end the mix on the server instead of leaving it running unheard
- More transition fixes: while casting, the seek bar switches to the next song together with its position; a seek no longer scrobbles the song a second time; turning shuffle off just before a transition keeps the right song as current; and picking another song no longer briefly blocks editing the queue
- Transitions in Safari recover by themselves when the server's encoding fails, instead of stalling silently, and a long listening session in Safari no longer fills up the server's disk
- A DJ mix into a song whose beat starts at its very first moment no longer plays the two songs a fraction of a beat apart for the whole mix
- Party guests see a song change in the host's mix on time even when the stream briefly runs ahead, and a mix stream no longer stutters at its very start
- Dragging a song through a long queue stays smooth instead of making the app sluggish
- Now Playing on a phone held sideways with the artwork hidden: long titles, artists and albums stay on one line each instead of squeezing into a narrow column, and the controls sit at the bottom of the screen
- The German interface speaks of "Titel" and "Künstler" throughout, where it mixed them with "Songs" and "Artists", and the last English labels (Plays, Disc, Track, Favorites) are translated
- Smaller fixes: counts on the overview pages use the chosen language's thousands separator (12.496 in German, 12,496 in English), long artist names on the artist tiles end in "…" instead of being cut off mid-letter, and on the statistics page a long duration stays on one line, the library's tiles stay in one row and a share below one percent reads "< 1 %" instead of "0 %"
## [1.8.0] - 2026-10-13
### Highlights
- **Crossfade the way a DJ mixes:** where the beat allows it, Beacon matches the next song's tempo, lines up the beats and brings its bass in on the downbeat. Switch it on under Settings, Playback, Transitions and give it a try
### Added
- Gapless playback in the app and on speakers, under Settings, Playback, Transitions. Once the transition is prepared, the next song stays in its place in the queue
- Crossfade the way a DJ mixes: where the beat allows it, Beacon matches the tempo and brings the next song in on the beat, otherwise it is an ordinary crossfade with a length of its own. Songs that follow each other on an album still play gaplessly, and party guests listening online hear the same transitions
- Now Playing announces the next song before the transition starts, with its own symbol for a crossfade and a DJ mix
- Preview on album and playlist pages and in the list of playlists: about two minutes from six songs across it, different ones each time, while the queue stays as it was. "Play from here" plays it from the song you are hearing. Works on speakers too
- Smart playlists on Navidrome can be created and edited in Beacon, with a live preview of their songs and ideas to start from (desktop layout only)
- Smart playlists from Navidrome and Plex are labelled as such, and Beacon no longer offers to reorder, remove or add songs in them
- lrc.red as a new lyrics source, which finds a song by its ISRC where the tags carry one. If you picked your lyrics sources yourself, switch it on in Settings
### Changed
- The waveform seek bar is drawn as evenly spaced, rounded bars, in the app, the Remote Control and for party guests
- The mouse wheel sets the volume anywhere on the player bar, for party guests too
### Removed
- The Shuffle button on album pages and in the list of playlists. Turn on shuffle in the player bar and press Play instead
- SimpMusic as a lyrics source, since it now blocks every app but its own
### Fixed
- With Jellyfin and Plex, your own playlists appear under "My playlists" and can be edited there (renaming on Jellyfin needs 10.9 or newer)
- A lyrics source that was briefly unreachable no longer leaves a song without lyrics until Beacon is restarted
- On a tablet held sideways, Now Playing no longer cuts off the cover and the album name, and the artist name is no longer nearly as large as the title
- Turning a tablet sideways with the queue open shows the queue again, instead of only lighting up its button (reported by [@ampcat3](https://github.com/ampcat3), [#47](https://github.com/mihaitom/beacon/issues/47))
- "Add to playlist" no longer lists playlists the server will not let you change, such as other users' shared ones
- The list of other lyrics matches only offers matches with actual lyrics, from the sources switched on in Settings
## [1.7.1] - 2026-10-10
### Changed
- In the mobile layout, the library scrolls through the whole catalogue without a "Load more" button
- A new version is announced by a small dot on the settings button instead of a notice in the corner. The dot goes away once Settings has been opened, where the update is described as before
### Fixed
- In the mobile layout, a long queue, playlist or station list froze while its covers loaded: it would not scroll and taps did nothing, sometimes for over a minute (reported by [@ampcat3](https://github.com/ampcat3), [#47](https://github.com/mihaitom/beacon/issues/47))
- Turning a tablet between upright and sideways (or resizing a browser window across the mobile layout's width) kept the page from the other layout, which on Now Playing showed two player bars. The page now switches along with the layout
- On a touchscreen, the queue that slides out briefly when something is added closed again while it was being scrolled. Touching it now keeps it open, as pointing at it with the mouse already did (reported by [@ampcat3](https://github.com/ampcat3), [#47](https://github.com/mihaitom/beacon/issues/47))
## [1.7.0] - 2026-10-10
### Added
- Now Playing on a phone held sideways: the cover fills the left half, with the title centred over the controls beside it and the app bar and tabs out of the way. The lyrics turn over in place of the cover, so the controls stay usable. With the artist background instead of the cover, the photo gets the whole screen, the title sits in its bottom-left corner beside a small cover and the lyrics take the full height. The bottom of the photo is darkened under the text, more so for a light photo, and the accent colour lightens where it would blend into the picture. Party guests get the same layout
### Changed
- With the artist background showing, Now Playing's title no longer sits on a glass card: it stands over the darkened bottom of the photo, on the desktop in the corner beside a small cover (with what comes next beside it near the end of a track), on a phone centred. The lyrics no longer sit on a panel either, but on soft shade that fades out towards its edges. More of the picture stays visible, and the accent colour lightens where it would blend into the photo
### Fixed
- Lyrics from some sources ran off the side of the screen instead of wrapping onto a second line
- Party guests on a screen between 840 and 960 pixels wide (a small tablet, a phone on its side) got the desktop layout instead of the phone one
- On Apple Silicon Macs, the downloaded app was reported as damaged and could not be opened. It now opens after confirming it once under System Settings > Privacy & Security (reported by [@ampcat3](https://github.com/ampcat3), [#46](https://github.com/mihaitom/beacon/issues/46))
- On an iPhone or iPad, dragging the lock-screen scrubber while a song played at a reduced quality (a converted stream) jumped the shown position back to the beginning. It now follows the real position, as it already did for untouched files
- On an iPhone or iPad, the lock screen offered buttons to skip 10 seconds instead of previous and next track. It now shows previous and next
- On an iPhone or iPad, the song Beacon reopens with could not be scrubbed until something had played
### Known Issues
- On an iPhone or iPad with Beacon added to the home screen, pressing play on the lock screen after pausing there stays silent until Beacon is opened again. This is a limitation of Safari for home-screen apps; in a Safari tab it works
## [1.6.0] - 2026-10-07
### Highlights
- **Party mode (experimental):** guests scan a QR code or open a link and get their own Beacon page - what is playing, the lyrics, what comes next - where they search your library, wish for songs and vote to skip, while the controls stay yours
- **Online party (experimental):** for a group that meets online, in a voice chat for example: everyone hears your music in their own browser from the same link, with everything party mode has
Both are brand new and still finding their feet. If something at your party does not work the way you expected, or you are missing something, please [open an issue](https://github.com/mihaitom/beacon/issues) - every report helps shape them.
### Added
- Party mode (experimental): guests join with a QR code or a link and get a page in Beacon's look - Now Playing with the artist background, synced lyrics and the large cover, each switchable, and what is coming up beside it, or the mobile layout on a phone. They search the library, wish for songs (taking turns between guests), withdraw their own wishes and vote to skip; you set how many open wishes a guest may have and how many votes a skip needs. While you cast, the party keeps going even with your screen locked or, in the web build, the tab closed. Everything guests use lives under its own `/party/` path, so a reverse proxy can open just that; see docs/party-mode.md
- Online party (experimental): with it switched on in the party dialog, guests hear your music in their own browser, at the quality you pick, with a player bar of their own (play, where the song is, their own volume) and the lyrics and visualizer following what they hear. A "Test setup" button checks whether guests from outside can reach the party. Web build only, since Beacon has to be reachable from outside; see docs/party-mode.md
- Help inside the app: the FAQ, topic by topic, and the guides to party mode, home automation and format conversion open right where the question comes up, for example from the party dialog or next to the home automation key; Settings > About also lists everything Beacon can do (both in English)
- A running party is visible in Home Assistant: how many guests have joined and how many listen along online, read-only
### Changed
- The Playlists page is now a list: each playlist shows artwork from its own albums (cycling through them on hover), its main artists, genres and when it was last edited, with Play and Shuffle buttons on the right
- The Radio page is now a list in the same style: each station shows its country, format and genre tags from Radio Browser, and the last title you heard on it (or what is playing right now)
- Copying the home automation key or the Remote Control address now confirms with a checkmark, as the app's other copy buttons do
### Fixed
- Remote Control on the phone no longer receives the media server's credentials along with cover art
## [1.5.1] - 2026-09-28
### Fixed
- On Windows and macOS, casting from a media server reached over https, playing a radio station over https and drawing the seek-bar waveform failed with a certificate error; a Sonos showed this as the track restarting every few seconds (reported by [@coltonfretz](https://github.com/coltonfretz), [#37](https://github.com/mihaitom/beacon/issues/37))
- When a track cannot be loaded from the media server while casting, the app now says so and stops, instead of leaving the speaker silent while the position kept jumping back to the start
- A wrong Home Assistant key is now always reported as such; before, the answer depended on whether the phone remote happened to be switched on
- Remote Control on the phone no longer loses all covers and station logos after the desktop app has been reloaded
- Home Assistant shows the logo of a playing radio station even while the phone remote is switched off
## [1.5.0] - 2026-09-27
### Added
- Home Assistant and other automation tools can control the desktop app with a key that survives restarts, and find it on the local network on their own; see docs/home-automation.md (suggested by [@coltonfretz](https://github.com/coltonfretz), [#36](https://github.com/mihaitom/beacon/issues/36))
- A Home Assistant integration with a dashboard in the sidebar: player, speakers, library, queue and autoplay, following whichever computer runs Beacon; see home-assistant/ (inspired by [@coltonfretz](https://github.com/coltonfretz), [#36](https://github.com/mihaitom/beacon/issues/36))
- The desktop app can run on a fixed port, set under Settings > Advanced or with `BEACON_PORT` (suggested by [@coltonfretz](https://github.com/coltonfretz), [#36](https://github.com/mihaitom/beacon/issues/36))
### Changed
- Artist and album pages have a button to switch between up to ten Fanart.tv backgrounds of the artist, mostly the best liked plus a few of the newest
- On artist and album pages the Fanart.tv photo sits on the right, uncropped, and carries on behind the header in its own background colour, while the header stays readable on a darkened area
- An artist keeps the same background across the artist page, album pages and Now Playing for the whole session
- The album page has a new header with a large cover, running time, Play and Shuffle, and the artist photo beside them, and it stays in view while the track list scrolls
- The album page shows more about the album: release type, record label, edition and reissue year, all its genres, and the opening of its Wikipedia article
- The library pages and every genre page show changing Fanart.tv banners of your artists across their header, and clicking one opens that artist
- The Favorites page header shows how many artists, albums and songs you have marked
- The Home page's top card shows the Fanart.tv banner or photo of the artist you are listening to
- The Statistics page shows more: storage used, how much of the library you have ever played, songs heard in the last 30 days, your ratings, a Hi-Res/lossless/lossy breakdown and the artists with the most songs
- Who may cast can now be decided on a Plex server too, by its owner; accounts already signed in join the list at their next sign-in
- In a window narrower than 1200px, a tablet in landscape for instance, the queue slides in over the page instead of squeezing it, and a tap beside it closes it
- Remote Control's play and pause commands now do exactly that instead of toggling, so automations can send them safely
- Small layout tweaks: larger library page titles without the placeholder icon, a lower library page header on tablet-sized windows, backgrounds that fade between pages instead of blinking, and Statistics lists that wrap two at a time on narrower windows
### Fixed
- When Beacon was installed where it cannot write next to itself (for all users on Windows, or as the AppImage or .deb package on Linux), it opened a new Jellyfin session for every track played, which filled the Jellyfin dashboard with phantom Beacon players; Plex was affected the same way (reported by [@coltonfretz](https://github.com/coltonfretz), [#35](https://github.com/mihaitom/beacon/issues/35))
- Radio played through Beacon now reconnects on its own when the connection silently dies, after a network or VPN change for instance, instead of going quiet
- After more than a month away, nearly all downloaded Fanart.tv images were deleted as soon as an artist was opened; the latest artists' images are now always kept
- Most played artists on the Statistics page could show a song's full credit, featured artists included, instead of the artist's name
- For artists with ten or more likes on an image, the wrong Fanart.tv images were taken as the most liked, so their best backgrounds were never shown
- On a tablet in landscape, a speaker's volume slider now follows the finger, and controls that used to appear only under a mouse are visible
- On an artist page in a narrow window, the rating stars no longer run into the artist's name
- On a tablet, artist and album pages and track lists with many columns could make the page wider than the screen, which cut it off or zoomed it out once the pictures loaded; track list columns that do not fit now step aside until there is room again
- Jellyfin now shows Beacon's real version instead of 1.0.0 (reported by [@coltonfretz](https://github.com/coltonfretz), [#35](https://github.com/mihaitom/beacon/issues/35))
## [1.4.0] - 2026-09-22
### Highlights
- Artist and album pages, and Now Playing, are dressed with Fanart.tv images
- Playlists can fill themselves from Last.fm or ListenBrainz, drawing on charts, similar tracks and your own top plays; Last.fm is the recommended builder
- Home's Discover shelves can come from your own listening history, not just your library
- A server administrator can now decide who may cast, with a whitelist or blacklist
- A new Rediscover shelf on Home brings back songs you played a lot but have not heard in months
### Added
- Playlists can be filled from Last.fm - a country's or genre's charts, an artist's top tracks, tracks similar to one of your own, or your own most played - each looked up in your library and shown before anything is saved, with the option to send the result to the queue instead. Needs a Last.fm key under Settings' Advanced tab
- Playlists can also be filled from ListenBrainz with no key or setup: a genre's top recordings, its charts, an artist's top recordings, your own most listened, or recommendations from your listening history
- Home's two Discover shelves can come from your own listening history instead of from your library's artists, using a public ListenBrainz name; without one they keep using the library-based suggestions
- The lyrics source under the lyrics is now a link to that sheet on lrclib.net, NetEase or SimpMusic
- A new "Rediscover" shelf on Home brings back songs you played a lot but haven't heard in at least three months, with a button to shuffle in a different set
- An artist's page now shows the opening paragraph of their Wikipedia article under the name, with a link to the full article; a longer paragraph collapses behind "Show more"
- A track the playlist builder could not find in your library can be copied with one click as "Artist - Title"
- Fanart.tv images now dress the artist surfaces: a background photo on the artist and album pages and behind Now Playing, plus the artist's clear logo in place of the plain name. Beacon ships its own project key so this works with no setup, a switch under Library turns it off, and the images are cached on the server
- The installation-wide keys in Settings now sit together in one "API keys" section
- Where several people share one Beacon, a server administrator can now control who may cast, with a whitelist or blacklist and a separate switch for accounts not on the list
### Changed
- Settings is grouped into tabs - Account, Playback, Library, Casting and Advanced - instead of one long scroll, with Casting and Advanced only where they apply
- The search in the top bar now runs over the library Beacon already holds instead of asking the music server, so it forgives accents, punctuation and word order; a switch beside it turns that off for an exact search
- Searching a radio station's played titles forgives accents, punctuation and word order too
- The library filter fields forgive punctuation and apostrophes the same way
- Clicking a title in a radio station's played list now opens the search on that song's artist and title
- Now Playing's visualizer bars take their colour from the artist background where Fanart.tv has one, and carry a soft shadow to stay legible over a bright photo
- Picking a lyrics match, or letting the automatic lookup run, no longer asks the lyrics service a second time for a sheet its search had already handed over
- The A-Z jump bar now highlights the letter you are in as you scroll, and the Albums and Artists grids draw a lettered divider before each section
### Fixed
- An artist lookup that failed during a brief MusicBrainz outage could be remembered as "not found" for good, leaving that artist without a photo, links or Wikipedia paragraph on their page and out of Discover; those misses are retried now
- An artist whose name is only part of another artist's name could be looked up as that other artist, handing back the wrong Wikipedia paragraph, links and artist image; it now prefers an exact name match
- Lyrics matches from NetEase and SimpMusic now show whether a sheet is timed once one has been opened, instead of staying marked unknown
- The A-Z jump bar in the Albums and Artists views sent some letters to the wrong place when the server files an artist or album under a sorting name rather than the name shown; it now follows the server's own filing
- A radio station's title history now appears as soon as the station is opened, instead of waiting for its first "now playing" title to arrive
## [1.3.2] - 2026-09-19
### Changed
- On the phone and in the phone remote, the cast button moved into the row of playback buttons, to the right of repeat, and Autoplay sits at its left end, next to shuffle. Play stays in the middle of the screen, and the volume slider has a row of its own
- The device list in the phone remote now matches the one in the app: "Stop all" and "Done" sit in the title row next to the rescan button, and the stream lines use the app's own wording
- Now Playing in the phone remote matches the app too: the seek bar sits below the playback buttons with elapsed and total time either side of it, and it draws the track's waveform instead of a plain slider
### Fixed
- Artwork a music server could not hand over, because its disk was full for instance, was taken as "this album has no cover" and stayed blank for the rest of the session, even after the server was well again. Those covers are retried now
- Tracks without cover art in the phone remote's playlists and queue left an empty grey square instead of the placeholder every other list shows
- The tab bar on the phone lit up whichever tab was last tapped rather than the page actually open, so opening an album from Now Playing left Now Playing lit, and reaching Now Playing from the mini player left the previous tab lit
- The tab bar on the phone sat right on the bottom edge of the screen when installed as an app, where a tap on the lower half of a tab could trigger the phone's own swipe-up gesture instead. It keeps a margin there now
- Four icons in the phone remote were invisible: the Autoplay switch, the rescan button in the device list, the "This device" row and the placeholder for an album without cover art. Each button was there and did its job, it just had nothing to look at
- Switching Autoplay on while the last song of the queue is playing now tops the queue up right away, instead of waiting for a next song change that on the last song never comes
## [1.3.1] - 2026-09-17
### Added
- Two more columns for track lists: the ReplayGain adjustment of each track and of its album. Offered on Navidrome and Jellyfin, which report it; Plex does not
### Changed
- On a Jellyfin server the sample rate, file size and path columns are now available too, and the format column shows each track's bitrate next to its format. Track lists from Jellyfin take a little longer to load for it
- How far a track has loaded now shows as a thin strip along the bottom edge of the seek bar. It used to be a slightly lighter shade among the waveform bars themselves, which was hard to make out against the rest of the bar
- Ending a cast no longer starts the music up over local speakers. Whatever was playing stays on the player bar, paused, and pressing play carries it on there. No device makes a sound it was not asked for now, on either end of a cast
### Fixed
- Running Beacon behind a reverse proxy no longer fills that proxy's log with a warning for every single request Beacon answers
- Releasing a paused speaker after two hours now actually stops it. Beacon only forgot about it, so the speaker was left sitting on the paused stream with nothing able to end it any more
- A cast that ended without the speaker letting go left the track's conversion running on the server, holding a connection to the music server open for as long as Beacon ran. One of those built up for every cast that ended that way; they now stop with the cast
- A device added to a cast that was already running kept the stream shape of whichever device started it, so a speaker with tighter limits could be handed audio it cannot decode and stayed silent. The stream is now recalculated for the device that joins, and only interrupts the others when that device really does need something narrower
- Surround tracks, a 5.1 FLAC for instance, stayed completely silent when cast. They are now folded down to stereo for the speaker, which is what every cast target can actually play, and the stream info names the source's channel count so the downmix has a visible reason. Folding the channels together costs real volume, so a surround track plays noticeably quieter than a stereo one: roughly 8 dB for a five-channel track, and about 10 dB for a 7.1 one. That is the standard behaviour of ffmpeg, the audio engine Beacon uses, rather than a level Beacon sets. Adding five channels together would otherwise overshoot what the audio can hold and distort, so the fold makes room for that first
- The same tracks were silent in this app's own player when the audio quality was set to Opus, and on AAC they played but spread the chosen bitrate across five channels instead of two. Every quality setting now produces a stereo stream, so it sounds as good as the bitrate allows. Playing at "Original" keeps every channel, as it always did
- Adding a radio station from Discover did nothing at all for accounts without administrator rights on Navidrome, which only lets administrators manage stations. Those accounts no longer see the add and edit controls, and a save the server refuses now says so instead of staying silent. Searching, listening and voting in Discover keep working for every account
- The German interface said "Queue" and "Settings" in several places and now says "Warteschlange" and "Einstellungen" throughout
- A tab label too long for its share of the phone's tab bar is now shortened with an ellipsis instead of being cut off mid-word at both ends
- On an iPhone, a song played at a reduced quality setting (AAC, for instance) kept jumping back to where it had started, roughly every 45 seconds. It now plays through at every quality setting, and shows its total time on the lock screen and how far ahead it has loaded on the seek bar, as it does at "Original"
- On a Jellyfin server, the audio quality setting for this device had no effect on MP3, AAC and other compressed tracks, which always played unconverted. They are now converted whenever they exceed the chosen quality
- Starting a cast from one device now silences another device in the same session that was playing over its own speakers, and that device follows the cast from then on. It used to carry on playing underneath the cast with nothing able to stop it, since pause addressed the speaker instead and a station ran on indefinitely
## [1.3.0] - 2026-09-13
### Added
- Support for Jellyfin 12: signing in, browsing, playback and casting all work against it. Servers on Jellyfin 10.9 and newer keep working too
- The columns of every track list can now be chosen: right-click the column headings (or use the button at their right edge) to switch columns on and off. The choice applies to every track list and follows the account to your other devices
- Nine more columns to choose from, alongside cover, album, genre, year, plays, format and the star rating: track and disc number, BPM, sample rate, file size, comment, path, when a track was added and when it was last played. Each can be sorted by, and a column your server has no data for is not offered at all rather than standing empty
- Shift-click selects a whole range of tracks at once, Ctrl/Cmd+A extends a selection to the entire list, and the checkbox in the column headings selects the whole list or clears the selection again
- Tracks can be taken out of a playlist again, one or a whole selection at a time, from the track menu on the desktop and the action sheet on the phone. A notice above the list offers to undo it, and stays there until you put it away or leave the page
- An album page for the phone: tapping an album in the library, or the album name on Now Playing, opens it with the tracks in their own order and a button to play the lot
- Creating a playlist, or adding tracks to one, now says so from wherever you did it: the queue, a track's menu, an album tile or the phone's action sheet. On the playlist's own page nothing is announced, because the change is already on screen there
### Changed
- Tapping an album in the phone's library opens it now instead of starting it straight away. The play button on the row still does that
- The artist name on the phone's Now Playing screen is no longer a link. It opened the desktop artist page, which has no phone layout of its own
- Figures in a track list now line up under each other instead of shifting about from row to row
### Fixed
- A library with more than 500 albums stopped at the first 500 in the Albums view, with the rest missing from browsing, searching and the A-Z index. The whole catalog loads again (reported by [@flugster](https://github.com/flugster), [#24](https://github.com/mihaitom/beacon/issues/24))
- The playlists page could go on showing an out-of-date list, sometimes for an hour and on a Jellyfin server for a whole day: a playlist created from the queue was missing, a deleted one came back, and anything changed on another device took just as long to turn up. The list is kept current now
- The volume slider on a phone often ignored the finger while casting to a speaker: it moved a few percent and stopped, or did not move at all, and roughly every second attempt failed to land on the level that was set. Tapping a spot always worked, dragging frequently did not. A drag now follows the finger and sets the level on the speaker once, when you let go, instead of sending every moment of it
- Autoplay no longer falls silent at the end of the queue when the server has nothing similar to offer for the last track. It looks to the songs just before it, and failing that carries on with more from the same artist or something else from your library
- Stopping a station at the speaker itself now ends it in Beacon as well. It went on being fetched and re-encoded for as long as Beacon ran, with nothing playing it any more, and the app kept showing it as playing. It no longer picks itself up on the device you were casting from either; pressing play is what carries it on there
- A speaker paused and then left alone is no longer held forever. Beacon kept the connection to it for as long as it was running, so the speaker stayed unavailable to anyone else; it is now released after two hours without any activity
- A speaker could refuse a station after a pause, or once a second speaker joined, when the cast quality was set to AAC: it was announced as MP3 and then sent AAC
- Casting to a Sonos soundbar such as the Beam failed while its TV was on, reported as the speaker refusing the stream, and afterwards playback could not be stopped either. Casting now switches the soundbar over from the TV, and stopping always ends playback in Beacon
- A speaker that cannot be paused, resumed or added to a running cast now gets a proper message in the device list, naming it and what went wrong. Pausing and resuming used to fail without a word, and adding a speaker showed the raw error code. A Sonos speaker that cannot be found on the network is reported as unreachable rather than as a failure
- An AirPlay speaker that refuses to start, cannot be reached or has to be paired first now says so, instead of the app showing the music as playing over silence. A speaker dropping out part-way through a track is offered to resume whatever the cause, where before only one kind of drop was noticed
- A Chromecast that refuses to play a track or station now says so, instead of the app showing it as playing over silence. Pausing or stopping one that has nothing loaded is no longer reported as an error
- Casting to a DLNA renderer no longer risks the next track, a pause or a stop being skipped without a word while the app shows otherwise. A renderer that refuses a stream or cannot be reached now says so
- A station that allows only one listener at a time no longer fails. Starting a station, on this device or on a speaker, now opens one connection to it instead of two, which also gets it going a little sooner
- The sliders in the phone's Remote Control often did not notice a drag starting: the finger had to land within a few pixels of the thin line itself, and anywhere else did nothing at all. The whole height of the control now takes the touch, so seek, volume and the per-speaker volume all pick a drag up where it starts
- Moving a song to a new position in the queue on the phone no longer starts playing that song. The same fix in 1.1.0 only ever took hold with a mouse, never by touch
- The format column stayed empty for every track on a Jellyfin server
- Album and playlist tracks from a Jellyfin server showed no genre
- Sending a station to a speaker while a track was playing no longer makes the player bar flicker: the station showed, the track came back, and the station returned a few seconds later. The elapsed time no longer starts at wherever the track had got to either
- A station no longer skips a moment when the phone has had it in the background for a few seconds. The connection Beacon holds keeps the audio that was missed, and it is played rather than thrown away
- A dropped station is no longer reconnected twice over, which could be heard as a second stumble right after the first
- A track list kept room at its right edge for a star rating on Jellyfin and for a favorite heart on Plex, neither of which those servers have. That space now goes to the track and album names
- A playlist with no tracks in it now says so, instead of showing a bare row of column headings with nothing under it
- The buffering bar on a station sent to a speaker clears a little sooner, closer to when the speaker actually starts playing
- Choosing a different set of lyrics for a track no longer leaves the list of matches sitting open and claiming there are none to be had. It closes once you have picked, and the matches found for the playing song are kept, so opening the list again to try the next one comes up at once instead of searching all over again
## [1.2.1] - 2026-09-08
### Changed
- The desktop app now brings its own ffmpeg. Installing it separately is no longer necessary on Windows, macOS or Linux, and Beacon no longer depends on whichever version happened to be on the system. An `FFMPEG_PATH` in the environment still wins, for anyone who prefers their own
- An Opus track is now sent to a Chromecast untouched instead of being converted to MP3, which made the stream bigger and the sound worse. Other speakers still get MP3 for it: they accept an Opus stream and then play silence rather than refusing it
- An artist tile now shows a record and a note icon with its two counts, instead of spelling out the album count alone. The track figure counts every track the artist is on, compilations and guest appearances included, which is what makes an artist with no album of their own readable at all where the tile used to say only "0 albums"
### Fixed
- Playing or casting with ReplayGain enabled failed outright in the Docker image, with nothing but an ffmpeg error in the log. Desktop installs were never affected
- Tracks in a number of formats did not play at all in the Docker image: WavPack, DSD, Musepack, TTA, Shorten, WMA Pro, WMA Lossless, MP2, and AIFF at 32 bit or in floating point. All of them now play and cast
- A 24-bit AIFF, or a WAV at 32 bit or in floating point, was converted to MP3 on the way to a speaker instead of being sent losslessly
- An ALAC library played nothing at all in Chrome and Firefox on the default quality setting. Those tracks are now converted on the way to the player, losslessly, so nothing is given up for it
- An artist heard only on compilations, or only as a guest on someone else's record, had a completely empty page and played nothing when picked. Their tracks are listed and played now, and a guest appearance turns up on the artist's own page instead of only on the album it came from
- Typing in the search of a station's title history works properly now. A space was deleted again a moment after it was typed, so more than one word was impossible, and typing quickly lost letters every time the results updated
- A station that stops arriving for a moment no longer keeps the buffering bar up once it is audibly playing again
- A station now picks itself back up after the computer has been asleep or the app was left alone for a while, instead of being reported as lost or sitting silent until you press play
- Network speakers now show up in the device list more reliably: the search is repeated a few times, so a single lost answer no longer hides a speaker that is right there
- A network speaker that takes a few seconds to accept a track is no longer given up on halfway, and one that stops answering no longer holds up the playback position
- Network speakers that judge a stream by its web address rather than by what the server tells them are now given the format there as well, so a speaker that refused to play anything at all may now work
## [1.2.0] - 2026-09-07
### Highlights
- A station's played titles are now a searchable timeline that outlives restarts, up to a thousand per station, so "what was that song last night" has an answer
- AAC and Opus join MP3 as playback qualities, on this device and for casting. Opus at 96 kbps holds up where the others need 192, which is half the bandwidth for the same quality
- Internet radio on this device now goes through Beacon's own backend, so a tunnel or a cell handover no longer skips ahead, and a station that goes quiet comes back on its own
### Added
- Internet radio played on this device now goes through Beacon's own backend too, which keeps hold of the station on your behalf: a tunnel or a cell handover while listening away from home no longer skips ahead, because the seconds you missed catch up once you are back
- A station that goes quiet is now noticed within seconds instead of minutes and brought back automatically, with a Reconnect button in the player bar if it stays away
- A station's title history can now be searched, from the magnifier at the top of the list. It looks through the station's whole stored history, not only the part already scrolled to, and that history outlives restarts: up to a thousand titles per station, which is a good month of a couple of hours a day on the same one
- You can now vote for a station in "Discover stations" by clicking its vote count. Radio Browser counts one vote per station a day, shared by everyone on the same Beacon server, and says so instead of quietly dropping yours when today's is spent
- Each audio-quality setting now has an info button with a few recommendations behind it
- Now Playing has its own entry at the top of the sidebar, rather than being reachable only through the player bar
### Changed
- AAC and Opus are now available as playback qualities, not just MP3, on this device and for casting alike. Both fit more music into the same bandwidth, Opus most of all: at 96 kbps it holds up where the others need 192. Each is only offered where it can actually be played, and a speaker that does not take the one you picked is sent AAC instead, at the bitrate you chose
- Seeking inside a converted track is now done by Beacon rather than by the browser: dragging the scrub bar asks the server for the music from exactly that second. That is what makes formats other than MP3 usable on this device at all
- The queue drawer is now part of the window rather than something floating over it: the page beside it makes room for it, it stays where you left it across pages and restarts, and it is wider, so a title and the artist under it are cut short less often
- A station's title history is now a timeline: one card per title with the time beside it, the track playing right now marked on the line, anything that does not read as a song shown as plain text, and a gap where the station was off. A title that has just started slides in at the top
- A station's title history now loads as you scroll instead of arriving at once, and is no longer re-fetched in full every few seconds, which saves a good deal of mobile data
- The Playback setting "Send radio straight to the device" is now "Play radio straight from the station" and decides it for this device's own player as well as for casting
- Autoplay is greyed out while a station is playing, on the desktop, the phone and the phone remote alike: it tops the queue up as it runs out, which a live stream never does
- The Remote Control button in the player bar now shows how many phones are connected and reopens the pairing code, switching Remote Control off moved into that window, and the window closes itself once a phone connects
- The cast sheet on the phone and the phone remote's own now show what is playing and how it is being sent, and say when the backend cannot be reached, the way the desktop one always has. The remote's sheet also gained a button to search for devices again
- The country filter in "Discover stations" now lists the countries you picked before at the top, so the ones you listen to are not buried in a list of some 250
- The full-size artwork view now dims the rest of the window much further
- The grid button above a row of albums or cards is greyed out when the row already shows everything it has
### Removed
- The panels that slid out over whichever page you were browsing, for lyrics and for a station's played titles, are gone along with the lyrics button in the player bar. Both are shown on Now Playing now, where the button for them sits in that screen's own toolbar
### Fixed
- The app on the phone could start playing a station again on its own: installed as an app, the phone discards it in the background and restores it later, which looked from the inside exactly like the reload that picking playback back up was meant for. Only a reload within moments of playback does that now
- Now Playing no longer scrolls in a phone browser: the page is sized to what is actually visible, so the artwork stays put instead of sliding out of view above the browser's own toolbar
- A brief hiccup between Beacon and your media server no longer cuts a track short. It is picked back up where it left off, on this device and while casting alike
- A connection lost after pausing and resuming is now reconnected like any other. Pausing used to stand down the automatic reconnect for good, so a song or a station that dropped after it simply stopped
- Casting an ALAC or APE track and resuming it from the middle produced no sound at all
- Casting with the quality set to AAC played nothing at all on an AirPlay device, which cannot decode it, and failed outright in the Docker version, whose media tool was built without an AAC encoder. Both now send a format the other end really plays
- A recording in a format the browser cannot open is now converted for it on this device too: an Ogg Vorbis track stayed silent in Safari, and an ALAC or APE one everywhere. On Original it is rewrapped as FLAC, so every bit is kept and only the wrapper changes
- Both audio-quality settings now apply to internet radio as well: a station above the limit you picked is brought down to it, one already below is passed through untouched, and the stream panel says which happened. A station that already sends AAC now reaches the speaker exactly as it left the station. Stations sent straight to the device stay untouched, since there is nothing in between to convert them
- Switching to a speaker while a song is already playing now applies the cast audio quality to that song too, instead of only from the next track on
- Autoplay asked the music server for suggestions every couple of seconds while casting once a library had suggested everything it has, and topped the queue up with as few as three tracks instead of ten, because songs already in the queue were dropped from the batch rather than made up for
- A speaker that had already started playing could be shown as still buffering for the best part of a minute, with the visualizer frozen with it, if it stopped reporting its position after a pause
- Where a station marks an ad by putting the advertiser's web address in place of the artist, it is now kept out of the title history and off the lock screen
- Stations that send iHeartRadio-style metadata now show the artist and track like every other station, instead of a line of internal identifiers
- A station's played titles could appear under the next station's name after a quick switch, and took up to eight seconds to show up at all
- Station logos are now also looked for in the site's app manifest, where the large version tends to live, and a station added from "Discover stations" with no homepage of its own shows its logo in the radio list too
- The elapsed time beside "Live" no longer freezes at the length of whatever track played before the station started, and counts hours once a station has been on for one instead of running up as "76:47"
- While casting a station, the artist and track under its name no longer disappear until the next song starts, and switching stations no longer flickers back to the previous one first
- Switching from a station to music from your library while casting left the station name, its logo and the "Live" readout sitting in the player bar with the song already playing underneath
- A very long radio title no longer pushes the artwork out of view on Now Playing; it is shortened with an ellipsis, and the full title stays in the title list
- A station's title history now uses the whole screen instead of only the square the artwork sits in, on the phone and in a narrow window alike
- Now Playing remembers whether the lyrics, or a station's title list, were open, instead of coming back to the plain artwork
- On Now Playing, artwork and lyrics no longer jump into place when the window is resized past the point where they stop fitting side by side, and never end up stacked on the way
- The visualizer no longer flickers while the window is being resized
- Rows in the queue now slide into place as soon as they move, instead of sitting out of position for a moment first
- A library scan now keeps running in view after you leave Settings, and its results show up without a restart
- The "Rescan library" button no longer changes size while it runs, shows how far the scan has got, and the line above it names the server the scan will actually run on rather than always Navidrome
## [1.1.0] - 2026-09-05
### Added
- Added a "Discover stations" search to the Radio page, backed by the free Radio Browser directory. Search by name, filter by country (remembered for next time) and sort by most-played or most-voted, then either try a station straight away or add it to your list with one click, instead of typing in a stream URL by hand. Each result shows the station's logo, where it is, what it broadcasts, how popular it is and whether it was reachable at its last check. Beacon reports a listen back to the directory each time you play a station you found there, which is what that popularity ordering is built on
- Right-clicking in the library now offers what that thing can do, not just what fits on the tile: an album can be played, queued or added to a playlist and links through to its artist, an artist offers Artist Radio and their catalogue, a playlist can be renamed or deleted from the overview, and a track gained "Go to album" and "Go to artist"
- Cover art and artist photos can now be looked at full size, filling the window. Click the artwork at the top of any album, artist, genre or playlist page, or right-click a tile or a track and pick "Show image". It is fetched at a higher resolution than the browsing views need. Opening one shows the copy you were already looking at while the full-size version downloads, rather than a placeholder over a picture that was on screen a moment ago.
- Right-clicking a track now offers Info, which opens everything your media server holds about it: the tags, the audio itself (format, bitrate, sample rate, bit depth, channels, file size, path), what the library knows (plays, last played, added, rating, ReplayGain) and its MusicBrainz and ISRC identifiers. Only the fields your own server actually reports are listed. Navidrome answers with the most; the Jellyfin and Plex bridges now pass through everything those two expose for a single track
- The desktop window gained back and forward arrows beside the Beacon name. Until now a page opened from somewhere else was a dead end: open an album from an artist page and the only way back was to search for them again. Alt with the arrow keys does the same, as do a mouse's own back and forward buttons
- Radio stations that broadcast a "now playing" tag show the current artist and track under the station name, in the player bar, on Now Playing, on the phone and the phone remote, and on the lock screen. Not every station sends one, in which case only the station name shows
- While an internet radio station is playing, the lyrics panel shows what the station has played instead, with the time each title came in. Every station keeps its own list, and it survives a restart, since the Beacon server keeps it rather than the app. Clicking a title searches your own library for that track. Things that are not songs (a programme name, a news item) are kept as plain lines rather than guessed at
- Casting an internet radio station now routes through Beacon's own backend by default, so a station is fetched once no matter how many devices are casting it. A new "Send radio straight to the device" setting under Playback (off by default) opts back into the previous behavior
- Local playback now buffers further ahead and rides out a brief loss of connection, such as a dead spot on a mobile network, instead of stopping outright. It quietly retries the same track from where it left off, and the seek bar shows how far ahead it is buffered as a lighter band beyond the played position
- Added account settings that follow the person rather than the device: the language, the personalized-recommendations toggle, the lyrics providers above and whether cast radio goes straight to the device. In the Docker/web version they live with your account on the Beacon server, so every device signed in there picks a change up at its next login; the desktop app keeps them per account on that machine. Settings that are genuinely about one device (audio quality, the saved queue, cached artwork) stay put
- Added a setting for which lyrics providers Beacon may ask. Lyrics stored with the song file itself are always tried first and never leave your server; the three internet providers (lrclib.net, NetEase, SimpMusic) are on by default and can be switched off individually or all at once, if you would rather a song's title, artist, album and duration never be sent anywhere
- Settings has a new Privacy entry listing every outside service Beacon contacts, what each one is asked for and what is sent with the request, split by whether the connection comes from your device or from your Beacon server. Services a setting can switch off say which setting that is
- The phone remote gained the mini player strip above the tab bar that the mobile web view already had: what is playing, with previous, play/pause and next, and a tap anywhere on it opens Now Playing. The mobile web view's own strip gained the previous button
- The Jellyfin Quick Connect code can now be copied with a button beside it, rather than read off the screen and typed out
- With the log level set to Debug or Trace, the fullscreen visualizer now shows what it is working from while casting: the moment it is drawing and the moment playback is actually at, with the difference highlighted once it grows large enough to hear. Invisible at the normal log level
### Changed
- Starting an internet radio station no longer throws the queue away. Whatever was lined up stays where it was and is still in the queue view, and clicking a song in it picks the queue back up at that song
- Playing a track from the search results now plays just that track, instead of putting every other match in the queue behind it. A search is a list of things that contain the same word, not a running order. The same goes for tapping a song in the library on the phone and for Home's most-played list, which is a chart; the play button beside its heading still starts the whole list
- Searching now returns a page's worth of results rather than 25 of each kind. A common first name matches far more than that in any real library, and nothing said the list had been shortened. Songs get the most room, since that is the list you scan
- Search results now show matching artists and albums as scrolling rows with arrows, the same shape Home and your favourites use, instead of a list and a grid that both grew downwards and pushed the matching songs off the screen
- The Songs tab on the phone is now Library, with a Songs/Albums switch above the search box: the same list and search, pointed at whichever you pick. Both the mobile web view and the phone remote get this, and an old "Songs" bookmark still lands in the right place
- Queue, Library, Playlists and Radio on the phone now read as one app. They had drifted into three artwork sizes, three title treatments and four different row heights; artwork, row height, the two lines of text and the line between entries are the same across all four now
- Settings has been reorganised visually: each section is a panel of its own, every setting inside one is separated by a thin line, and explanatory text is consistently quieter than the setting it belongs to. Nothing moved between sections and no setting changed what it does
- Settings that stay on a device are now kept separately per account, so two accounts sharing one computer no longer see each other's audio quality, saved queue or cached library. Whatever is set today carries over to the account that logs in first
- Beacon's copy of your library is no longer kept in a place with a roughly 5 MB ceiling. A large library ran past it and the whole copy was silently dropped, so Beacon re-fetched the entire catalog on every start. That hit Jellyfin hardest, where a full scan takes minutes
- Cover art, artist photos and station logos are now fetched in combined batches, one request per screen instead of one per image, so a large view fills in far fewer round trips
- Lyrics are now remembered by the Beacon server as well as by each device, so a song someone has already looked up costs nothing the second time: on another device, after a reload, or after a restart. That also means far less of your listening leaves your server
- The album grid fills in noticeably faster on a large library: Beacon asks for several pages of albums at once instead of waiting for each before asking for the next
- On Jellyfin, a library Beacon already has is trusted for a day rather than an hour before refreshing in the background. Nothing changes for Navidrome and other Subsonic servers, where that refresh is cheap, and the manual rescan still updates everything immediately
- Beacon now stops its background checks (each speaker's volume, the device list, a station's "now playing" tag) while the window is hidden, and pauses them entirely for a while when a security proxy in front of a self-hosted Beacon starts refusing requests
- While playing an internet radio station, the seek bar is replaced by a small "on air" indicator and how long you have been listening, instead of a progress bar with no position or length to show. It pulses only while sound is actually coming out
- While an internet radio station is playing, the controls that only make sense for a queue (shuffle, repeat, previous, next) are greyed out instead of looking pressable and doing nothing
- The sidebar is now opened and closed with a button at its top, instead of unfolding whenever the mouse passed over it. However you leave it is remembered per device
- The track and artist in the player bar now use the full width available rather than a fixed narrow column, so longer titles are cut off later. It shows most on internet radio, where the station sends both as a single line
- The speaker picker on the phone now reads as one list of places the sound can go, with the current one ticked, instead of two differently coloured rows on top of a list that did the same thing
- Chromecast and DLNA speakers now report their own volume changes instead of being asked every few seconds, the way Sonos already did. Turning the dial on the speaker or in another app shows up in Beacon straight away
- While casting to an AirPlay device, the song position now follows how much of the song has actually been handed over instead of assuming a fixed delay for every track. It stays an approximation, since AirPlay speakers never report where they are, unlike Sonos, Chromecast and DLNA
- The cast panel's "Rescan" button now shows a spinner and stays unavailable until the search has finished, in place of a separate progress bar. The phone's device sheet gained the same button, and the first search after signing in says it is searching rather than "No devices found"
- A radio station's logo is now picked by what the image file actually measures rather than what the station's page claims, and Beacon keeps looking for a larger one when the first is too small for where it will be shown
- Radio station logos are now remembered by the Beacon server across restarts. Finding one means fetching and reading the station's own website, and the desktop app starts its own Beacon with every launch, so until now every launch did that again for every station. They appear immediately, and the stations' sites are left alone for a week at a time
- The Radio page on the phone now lists your stations one per line, the way the phone remote already did, instead of a grid of tiles that only ever fitted one per line anyway. The desktop keeps its tiles
- The page headings across the phone views now match. Queue, Library, Playlists, Radio and a playlist's own page each opened with the same thing spelled four different ways; they share one header row now, and the search box stays in reach while the list scrolls
- On the phone remote, every tab now opens with its own name at the same size, and Radio no longer calls itself "Internet Radio" while its tab says "Radio"
- The two-way switches across the app (ReplayGain, Songs/Albums on the phone, the sort in Discover, Password/Quick Connect for Jellyfin) are now one and the same control, with the selected side lit in Beacon's amber
- The heart for marking a song a favourite is gone from the song lists on the phone. There is no favourites screen there to look at afterwards, so it was an action with no visible result
- Adding a radio station by hand is no longer offered on the phone. It is three URL-shaped text fields, and Discover reaches the same result with a search and one tap. The desktop keeps it
- On Home, clicking the artwork of whatever is playing opens the Now Playing screen, the same shortcut the player bar's artwork already offers
- On the phone remote, an action now waits until Beacon has actually carried it out: the action sheet keeps its spinner until then, and says so if something did not get through. A tap that had not landed used to look exactly like one that had
- The log level under Settings' Advanced section is now only offered to accounts that are also allowed to trigger a library scan
- Various small UI sizing/spacing tweaks: the column headings above every track list read as labels rather than a greyer first row, and the sorted column is lit instead of marked only by a small arrow; the Albums grid spaces its covers like the shelves elsewhere; the playlist and station tiles are bigger; every dialog that can hold a lot opens at the same height and scrolls inside it rather than cutting its last lines off; loading placeholders match the content that replaces them, so nothing shifts as the real covers arrive
### Removed
- The greeting on Home ("Good evening, <name>") is gone. It greeted you by name every time you opened the app, which wears thin fast, and the card now starts straight at what you were listening to
- The Autoplay setting for how many songs get added per top-up is gone; it is ten, always. It asked you to pick a number before you could possibly have an opinion about it, which is the kind of question Beacon would rather answer itself. Turning Autoplay on and off is unchanged, and still lives next to Queue in the player bar
### Fixed
- Fixed a cast track sometimes never finishing: it played to its end, but Beacon went on showing it as playing, the position kept climbing past the end and the visualizer stayed frozen on its last moment. Starting the same track twice in quick succession was enough to trigger it, most likely to be noticed with Autoplay off
- Fixed Beacon being able to get a self-hosted instance's own address banned by the security software guarding it. The live-update connection retried every couple of seconds, indefinitely and without slowing down, and the Radio page re-asked for every station logo it had not found, on every single view. The connection now backs off and pauses while the device is offline, and a station with no logo is remembered as having none
- Fixed internet radio station logos, which were missing or wrong in half a dozen unrelated ways. Stations whose website forwards you to another address, or buries the logo under a lot of styling, never had theirs found at all. The phone remote was refused every logo it asked for. A logo could stay blank in the player bar and on Home for days on end while the very same one showed fine on Now Playing, from a browser cache entry that is now stepped around without anything needing to be cleared by hand. And on Now Playing, wide banners were cropped to fill a square and vector logos were framed like square covers instead of floating free. Album art is unaffected by those last two. A station that has been showing no logo can take a few hours to catch up
- Fixed casting to some Chromecast devices, a Google TV among them, staying completely silent with no error shown anywhere. Those devices can keep their own app running instead of switching to the one that plays what is sent to them
- Fixed casting an internet radio station in a format other than MP3, AAC in particular, failing outright with an unsupported-format error on Sonos. Beacon announced every station as MP3 regardless of what it really sends, and now asks the station itself
- Fixed a cast failing outright, or a station staying silent on this device, for radio stations published as a playlist file (a .m3u or .pls address, which names where the audio is rather than being it). Beacon now looks inside one and plays what it points at
- Fixed an internet radio station going silent on a speaker while you were told the wrong thing about why. A station whose address no longer serves refuses every request, which reached you as the speaker reporting access denied
- Fixed picking a speaker another Beacon session is using going wrong in three separate ways: it stopped the speaker you were already listening on and dropped the music back to this device before you had answered the "take it over?" question, and answering it then did nothing
- Fixed moving a cast from one speaker to another. Switching between two Sonos speakers interrupted a third that had nothing to do with the switch, and locked up the play/pause and seek controls for several seconds
- Fixed both device pickers showing a set of speakers that was not real. The phone's sheet applied whatever it showed when it opened, even after the speakers had changed underneath it, and the desktop panel's tick marks briefly flicked back to the previous speaker
- Fixed a speaker that refuses to stop being left listed as still playing with nothing said about it. The failure is now reported and the speaker drops out of the list
- Fixed picking a speaker while playback is paused making a sound. Adding or switching to one while already casting started the music outright, and picking a first one still played a moment of the song before falling silent again
- Fixed artwork staying blank, album covers and radio station logos alike. A first attempt that did not get through was never tried again, and the player bar's very first cover in the installed app was drawn before the connection to your server was ready. Artwork is now retried a few times, and again as soon as the connection is there
- Fixed pressing play doing nothing for an internet radio station that was showing but not yet loaded, right after restarting Beacon with a station selected but paused
- Fixed the Home screen's hero card ignoring a playing internet radio station: it showed whatever album had played last instead of the station's own logo, and pressing play on it started that album rather than resuming the station
- Fixed a song that Autoplay had just added to the queue occasionally disappearing again and being replaced by a different one a moment later, when two devices were connected to the same cast session and both topped the queue up at once
- Fixed the volume slider jumping back to where it was a moment after being moved, on a speaker as well as on the phone remote
- Fixed the elapsed time on the seek bar jumping back a second or two every so often while casting, which pulled the synced lyrics back a line with it each time. Having the speaker picker open was enough to cause it on its own
- Fixed the phone remote keeping an old version of itself after Beacon was updated, often for most of a day, so a changed layout simply did not arrive
- Fixed "Clear cache" in Settings leaving most of the cache behind: it spared cover art, artist photos and radio station logos, by a wide margin the largest part of it. It now clears all of them, and reports success once they are actually gone rather than the moment it starts
- Fixed the lyrics drawer coming up empty the first time it was opened after starting Beacon, claiming the song had no lyrics until the Now Playing screen had been visited once
- Fixed the filter box on Songs, Albums, Artists, Genres and Playlists not finding a title, artist or album when the typed text left out an accent the source used, such as searching "revolution" for a song named "La Rèvolution". Works the other way round too
- Fixed the personalized recommendations toggle missing from Settings altogether for accounts that aren't allowed to trigger a library scan, such as a regular non-admin Navidrome account
- Fixed AirPlay speakers being listed as needing to be paired first when they need nothing of the kind, an Apple TV set up without a password and AirPort Express units included
- Fixed a failed cast reporting the speaker's raw technical fault as the whole error message. The cast panel now says which speaker it was and what went wrong: it refused what it was sent, it was busy, or it could not be reached
- Fixed the stream info in the cast device picker claiming a cast radio station was being transcoded to MP3, whatever quality was chosen. Radio is never transcoded by Beacon; the station's own stream is handed straight to the device
- Fixed dragging a track to a new position in the queue on the phone also starting to play it
- Fixed the phone remote zooming in on the page whenever you tapped its search box, leaving the layout at the wrong scale until you pinched back out
- Fixed the track and station labels in the player bar inviting a click that leads nowhere. While an internet radio station is playing neither line has a page of its own to open, so both are plain text now; the artwork beside them still opens the Now Playing screen
- The Now Playing screen on a phone now uses the space it has. The cover was sized well below what fits, filling about two thirds of the width with half the height of the screen left empty
- Fixed the Sign out button in Settings sitting awkwardly on a phone, on a line of its own under the username, so it read as a third line of account text rather than a button
- Fixed the Playlists and Radio pages jumping up and down while something loaded. The spinner sat in the middle of the page and pushed everything below it down, including for background work that had nothing to do with what was on screen
- Settings no longer offers the keyboard shortcuts list on a phone, where there is no keyboard to use any of them with. It is unchanged on the desktop, and in German it is now called "Tastenbelegungen"
## [1.0.1] - 2026-08-28
### Changed
- The two Discover shelves on Home fill in faster. The suggestions and the artist list are now looked up at the same time instead of one after the other, and the albums behind the matching artists are fetched together rather than one request at a time, only as many as the shelf actually shows
- Pressing previous now goes back to the previous song for the first five seconds of a track instead of only the first three, so a quick correction after a track change lands on the song you meant rather than restarting the one that just started. Later than that it still restarts the current song, as before
### Fixed
- Fixed Autoplay reading as off on one device while the queue kept filling up anyway. While casting it is a setting of the listening session, like shuffle and repeat, so every device now shows the same state and switching it off takes effect immediately instead of at the next track. Previously each device only remembered its own setting and the server kept topping the queue up from whichever one had last started playback
- Fixed the "New artists to explore" shelf on Home showing nothing at all while it loads, then appearing out of nowhere below a page that had already settled. It now shows the same placeholder cards as the shelves above it from the start
- Fixed music stopping the moment the screen locked, or the browser went to the background, in the mobile web player on a phone or tablet. Playback now carries on, with the track and its controls on the lock screen. What it costs on those devices: the audio visualizer is no longer offered for playback coming out of the phone itself, ReplayGain there applies to casting only, and the volume slider for local playback is gone, since a phone browser never let it do anything anyway and the device's own volume buttons are what changes that level. All three are unchanged while casting, and on the desktop app and in desktop browsers
- Fixed playback staying completely silent in the mobile web player on iPhone and iPad: pressing play started the track, showed it running and moved the progress bar, but no sound came out until the Now Playing screen happened to be opened. Playing from a desktop browser or the installed app was never affected
- Fixed the service icons next to an artist's external links (Spotify, Apple Music, TIDAL, YouTube, Deezer, Discogs, MusicBrainz) not showing up at all in the installed desktop app, leaving the row of links without any of their logos - they only ever appeared when running from source or in the Docker build
- Fixed quitting the desktop app while casting leaving it, and the speaker, playing for the rest of the track instead of stopping right away
## [1.0.0] - 2026-08-27
### Added
- Added the library rescan to Jellyfin and Plex servers, which previously only worked with Navidrome. It stays hidden for accounts that aren't allowed to run one, same as everywhere else, and since neither server counts the tracks it has processed, the button shows how far along the scan is as a percentage instead
- Added the shuffle button to the "New artists to explore" shelf as well, so a fresh set of suggestions can be asked for from either shelf rather than only from the albums one above it. Each button changes only its own shelf, which shows placeholders while it waits instead of briefly disappearing
- Added support for the lyrics stored with the file itself on Jellyfin and Plex servers - the same ones Navidrome already provided. Those describe the exact recording being played, so they are used ahead of the internet lookup, which still covers everything without them. Jellyfin reads them from the track's tags or from an .lrc file next to it; Plex only from the .lrc, so a library that keeps its lyrics in the tags will keep getting them from the internet lookup there
- Added keyboard shortcuts to the player: Space (or K) plays and pauses, the left/right arrows seek five seconds, Ctrl (Cmd on a Mac) with them skips tracks, the up/down arrows change the volume, M mutes, S and R switch shuffle and repeat, F favorites what's playing, Q opens the queue, and the number keys jump into the track. Press ? for the full list, which is also reachable from Settings. They stay out of the way while you're typing or a dialog is open, and while casting to a single speaker the volume keys change that speaker's volume, just like the slider in the player bar does
- Added drag-and-drop reordering of the songs in your own playlists, the same way the queue already worked - the song moves right away and is put back with a message if the server refuses the change. Sorting a playlist by a column temporarily takes the drag away, since the rows are then no longer in the playlist's own order; clicking that column a third time goes back to it
- Added track title, artist, album and cover art to what AirPlay devices show while casting - previously an Apple TV or HomePod displayed nothing at all, since the details were never sent and the artwork is stripped from the audio stream before it leaves the server
- Added an audio quality setting, separately for this device's own playback and for casting. Both are upper limits rather than fixed choices: anything already below what you set is played untouched, so picking "MP3 320" won't re-encode a 128kbps file into a bigger one. Above it, the music is converted as it plays - which cuts how much data gets pulled over a mobile connection, and also makes files playable that the browser can't open by itself (ALAC, APE and the like). While casting, Beacon still picks the best format each speaker will take on its own and only stops short of your limit. Both settings are stored per device, so a phone and a desktop can be set differently, and a change takes effect from the next track onward
- Added a notification when a speaker you're casting to stops on its own: instead of the music just ending in silence, a message says which device dropped out and offers a Resume button that picks playback back up from where it left off. It shows up on the desktop, in the mobile web player and on the phone remote, and covers AirPlay as well as Sonos, Chromecast and DLNA. Beacon deliberately doesn't restart playback by itself, since a speaker being stopped on purpose and one dropping out look exactly the same from its side
- Added Autoplay - once the queue is down to its last song or so, similar songs get added automatically so playback never just runs dry. Off by default; toggle it from the icon next to Queue in the player bar, and set how many songs get added per top-up in Settings. Works the same for local playback and casting, and keeps topping the queue up on its own server-side even if nothing's around to do it locally (e.g. a phone's screen is locked)
- Added Song Radio, Artist Radio, and Autoplay support for Plex (needs an active Plex Pass on the account) - previously Navidrome/Subsonic and Jellyfin only
- Added OS media key support - play/pause/previous/next now work from the keyboard's media keys, the lock screen on Windows/macOS, and the media widget on GNOME/KDE, showing the current song's title/artist/artwork
- Added an A-Z jump bar to the Albums and Artists views, and to any song list sorted alphabetically by title that's long enough for it to be worth it - drag or tap a letter to jump straight there instead of scrolling by hand
- Added a count to a song's right-click menu ("5 songs selected") when several are selected, making it clear the actions below apply to the whole selection - Play now replaces the queue with just the selected songs and starts the first one instead of playing from wherever was clicked through the full list, and Song Radio drops out of the menu since it can't act on more than one song at a time
- Added a "Show all"/"Show less" toggle to an artist page's Most Played list once there are more songs by them than the top 10 shown by default - the section title switches to "All songs" while expanded, and toggling back and forth after the first time is instant
- Added a play icon to the numbers in the Stats page's Top Songs/Artists/Albums/Genres lists, replacing the repeated "X plays" text next to each entry
- Added a second quick-play action to the Songs, Genre, Albums, and Artists views, alongside the already-random one: picks from what's actually been played a lot instead of the whole (or, for a genre, whole-genre) pool, so it leans toward music you already like rather than being a total shot in the dark
- Added an automatic peek at the queue whenever something lands in it without being clicked song-by-song - those quick-play actions, Play Next/Add to Queue, Song Radio, Artist Radio, and Autoplay's own top-up all trigger it. The queue opens with each track sliding in from the right one after another and scrolls to whatever's currently playing, then closes itself again after a few seconds unless the mouse actually reaches it, in which case it stays open
- Added a matching fade-out to clearing the queue - tracks disappear bottom-to-top starting from wherever you've actually scrolled to, instead of all at once
- Added a "Stop all" action to the device picker in the mobile web UI and on the phone remote, matching the one already on desktop - previously the only way to back out of casting there was picking "This device", which also switches playback to it right away
- Added a Song Radio button to the Home view's hero card, next to Keep listening - starts a mix built around whatever song is currently playing there. Hidden when the card is showing a recently played album or an internet radio station instead, since neither gives a single song to build a mix around
- Added a way to save the current queue as a new playlist, right from the queue drawer
- Added a confirmation prompt before deleting a playlist
- Added a small stream info section to the device picker, for whatever is currently playing the music - whether the track is being converted, what it is being turned into (including the sample rate and bit depth when those had to be reduced), the source file's own format, sample rate and bit depth, and, while casting, why it is being converted and how the connection to the speaker is doing
- Added mouse wheel control to the volume sliders in the player bar and in the casting device list - scrolling over one moves it in 5% steps, and changes whatever that slider is currently for, this device's own volume or the speaker being cast to
### Changed
- Changed how the Discover shelves pick and load their suggestions: every artist they are seeded from now counts equally, instead of whichever you listen to most dominating both shelves, and somebody who turns up next to several of your artists ranks above a close match for just one. The half of a lookup a shelf doesn't use is kept back, so the other shelf's next shuffle is instant and still based on artists picked fresh for it
- Changed the lyrics to stay put when you scroll them yourself, instead of being pulled back to the playing line a few seconds later - which used to interrupt reading an earlier verse mid-sentence. A button appears while they are held that way and follows the song again when pressed, and the fullscreen view no longer shows a scrollbar beside them
- Changed where the songwriter and producer credits some lyrics sources put at the top of a song end up: they used to be the first few lyric lines, timed milliseconds apart and gone before anyone could read them. They now sit under the source at the bottom of the lyrics panel, readable for as long as the song plays - and where the same people are credited twice, both roles share a single line
- Changed the queue and lyrics panels to sit side by side when both are open, instead of the second one covering the first exactly - closing it used to reveal a panel underneath that there was no reason to expect
- Changed the Favorites view's artists and albums to scrollable rows with arrows, like the Home view's shelves
- Changed notifications to stop counting down while the mouse is over them, and to stay up longer when they're asking you to decide something rather than just telling you what happened
- Changed how Beacon talks to the music server so connections are held open and reused properly, instead of most of them being torn down and rebuilt between requests: browsing and scrolling through a large library is noticeably quicker, and a burst of requests no longer disrupts anything currently casting
- Changed the device picker so the ticked devices are simply where you want playback to go, applied in one step: unticking one no longer stops it on the spot, so switching from one speaker to another no longer drops back to this device's own speakers in between. The button now reads "Apply" and only appears when there is actually something to change. "This device" is now listed at the top like any other target, marked while it is the one playing and clickable to bring the music back to it, and the panel is titled "Playing on" rather than "Casting"
- Changed an artist page's albums from a wrapping grid to a scrollable row (like the Home view's shelves), sorted newest-first by default with a toggle to flip it to oldest-first
- Changed the Home view's two "discover" shelves for more headroom and a clearer distinction between them - the library-based one now shows up to 20 albums instead of 15 on wide screens, and both got clearer titles ("Discover in your library" / "New artists to explore") so it's obvious which is drawn from albums you already own and which is brand-new artist suggestions
- Changed song lists (genres, favorites, search results, playlists, album tracklists) to load more as you scroll instead of paging through numbered pages, matching how the Songs library view already worked
- Changed selecting multiple songs to no longer show a floating action bar - Play Next/Add to Queue/Add to Playlist for the whole selection already live in a selected song's right-click menu, so the bar was just duplicating them; press Escape to clear a selection instead of its old close button
- Changed where an artist page's external links (Spotify, Apple Music, TIDAL, YouTube, Deezer, Discogs, MusicBrainz) show up - they sit next to the Artist Radio button now instead of crowding the top-right corner alongside the rating stars and favorite heart
- Changed cover art to load a few at a time and only once scrolling actually comes to rest on it, to stop loading again the moment it scrolls back out of view, and to be cached by the browser afterward, instead of every cover on a page being requested at once and every started download running to the end regardless - large grids and lists load noticeably faster, flicking through a huge list no longer fetches a cover for every song it races past on the way, and coming back to a list no longer re-fetches art that was already shown
- Changed the seek bar to stop stretching past 600px wide on very wide monitors
- Changed the fullscreen visualizer's cast mode to only analyze the audio while somebody actually has it open, instead of doing that work for every cast whether or not anyone was watching - casting is noticeably lighter on the server, and opening the visualizer part-way through a song picks the music up where it is. Also now available while casting to AirPlay, which couldn't show it at all before
- Changed a Sonos speaker's volume and mute to update in Beacon right away when changed from elsewhere (the Sonos app, another Beacon session), instead of up to 4 seconds later - Chromecast and DLNA devices still poll for now
- Changed the blurred artwork backdrop behind the Home view's hero card and every album/artist/genre/playlist header to crossfade when it changes, instead of snapping over to the new artwork the moment it loads. All of them now fade at the same speed as the Now Playing view's own backdrop, which already worked this way
- Various small UI sizing/spacing tweaks based on actually using it
- Changed artist cards to the same size as album cards, so the two line up where both appear (the Favorites view, any mixed grid) instead of the artist ones sitting noticeably larger
- Changed the Playlists view's rows to a bigger cover with the play button on it (shown on hover) instead of a small cover next to a separate play button off to the side
- Changed the "Filter" field on the Songs, Artists, Albums, Genres, and Playlists views (desktop and mobile web) to say "Search" instead, with a matching magnifying-glass icon - it now actually behaves like one (see the matching Fixed entry below)
### Fixed
- Fixed the Linux app having no icon at all in launchers, taskbars and app menus: it was packaged in a single 1024x1024 size, which the desktop icon standard doesn't define and no launcher looks in. It now ships in the usual sizes from 16 up to 512
- Fixed how lyrics are matched to a song, which regularly settled on a different recording's words: how long the song actually runs is now part of the decision (an extended version's lyrics on a radio edit start late and drift further apart as it plays), a result credited to a different artist is passed over however closely the title reads, and a "lyric sheet" that turns out to be nothing but songwriter credits is skipped in favour of the next result - or none at all, when that is the truth
- Fixed stray characters turning up inside lyrics: a control character left over from how they are stored inside a file, which every server passed along, and raw timestamps appearing as though they were part of the words whenever they carried a trailing marker
- Fixed lyrics staying on whatever was found on the internet even after the song's own file had gained some - a result found at a provider was cached and never revisited, so tagging a library you had already listened to changed nothing on screen. Lyrics coming from the file itself are still cached for good; a provider's copy is now re-checked against the file from time to time, in the background and without the panel flickering
- Fixed the lyrics not jumping to the line that is actually playing when they arrive, or when a different match is picked, mid-song - they stayed where the previous set had left them until the next line came round
- Fixed the library rescan in Settings being offered to accounts that aren't allowed to run one - a scan is reserved for server administrators, so for everyone else the button could only ever come back with an error. Beacon now asks the server which kind of account is signed in and hides the section for ordinary listeners
- Fixed an internet radio station losing its logo in the player bar and on Now Playing while it keeps playing - the station was rebuilt from the casting session's own state, which knows only its name and stream URL, so the homepage the logo is fetched from went missing and the generic radio icon took over. It is now matched back up against your own station list instead
- Fixed the queue drawer closing itself on schedule even when something new had landed in it moments before (Autoplay topping up the queue right after a peek opened it, say) - it now stays open the full peek duration from whatever most recently showed up in it, instead of closing partway through a reveal it hadn't finished showing yet
- Fixed the app automatically resuming audio playback after being fully restarted while a song was playing, instead of waiting for you to press play yourself - the queue and position still pick up right where you left off either way, and a plain reload (not a full restart) still resumes playing too, same as before
- Fixed the search field on the Songs, Artists, Albums, Genres, and Playlists views (desktop and mobile web) not finding a match when the search words were split across different fields (e.g. "Michael Jackson Bad" needing to be typed as either "Michael Jackson" or "Bad" alone to find the song) - it now matches each word independently, the same way the search in the top bar already did
- Fixed the app going unresponsive for up to about 1.5 seconds the first time it scans for devices after starting, which also held up the audio being sent to a speaker for that moment if something was already casting - opening the device picker mid-playback was enough to trigger it
- Fixed a speaker that briefly lost its connection starting the current song over from the beginning instead of picking it up where it was, which also left the progress bar, synced lyrics and the visualizer jumping around afterwards - bad enough that the only way out was reloading the app and skipping the song
- Fixed casting stopping roughly half an hour into a long track - a DJ set, a live recording, a long mix - whenever no Beacon window was open anywhere. The music simply ended mid-track and the speaker went quiet, as if the device had dropped out
- Fixed a speaker being stopped out of the blue about half an hour after a session was last used, even when something else had started playing on it in the meantime - another device in the house, another person, or a second copy of Beacon. Cleaning up a forgotten session now only stops a speaker if it is still playing what that session actually sent it
- Fixed the app locking up for a moment while the seek bar's waveform was being prepared for a very long track, such as a DJ mix or a live set: with playback going to a speaker, the pause was long enough to interrupt the audio being sent to it
- Fixed casting stopping altogether when the music server got briefly slow to answer - browsing a large library while casting could be enough - instead of just carrying on with the next song; looking a song up also no longer holds up the audio being sent to the speakers while it waits
- Fixed picking a second device while already casting silently dropping the first one - it kept playing until the end of the current track and then went quiet, with only the newly picked device carrying on
- Fixed the displayed position while casting going wrong in a whole family of ways, taking the synced lyrics and the audio visualizer with it since both follow it: it could flicker for the rest of a track, briefly run ahead of what was audible after resuming, snap back toward 0:00 after a restart or seek, or drift further out with every pause until it was minutes off. Mostly noticeable when a speaker was paused, resumed or seeked from the speaker itself rather than through Beacon. Corrections now settle once they are actually accurate and blend in smoothly instead of visibly jumping, and pressing Play again right after Pause no longer jumps the track backward
- Fixed casting mishandling the end of a track in two opposite ways: it could advance to the next song a few seconds early and cut off the tail of the current one, or get stuck at the end and never move on at all, with the position quietly snapping back to 0:00 instead. Both came from a cast device being paused, resumed or reporting itself idle at exactly the wrong moment
- Fixed a cast session occasionally getting stuck looping near 0:00 with no audio, indefinitely, particularly on long tracks or compilation albums - streaming had no pacing, so formats that don't need re-encoding could reach a cast device many times faster than actual playback, leaving its connection sitting idle for long stretches once everything was already sent and prone to being dropped there; streaming now stays paced only a little ahead of real playback instead. A drop that still happens now also recovers within seconds instead of the display getting stuck resyncing against the disconnected device's "nothing playing" reading as an endless string of rewinds to the start
- Fixed joining an unreachable device to an existing cast session leaving it stuck marked as in-use for everyone else, even though nothing was actually playing on it
- Fixed casting to several devices at once silently appearing to succeed, with no error shown and every device staying marked in-use, when none of them actually managed to start playing
- Fixed the Electron Remote Control pairing occasionally reporting the app as unreachable right after a quick reconnect (a brief network blip, for example), even though it was already back and listening again
- Fixed the seek bar's waveform occasionally overflowing into neighboring player bar elements at narrower window widths instead of shrinking to fit
- Fixed a ReplayGain-adjusted track not playing at all while casting if its format didn't need re-encoding (MP3, FLAC, AAC, Ogg Vorbis) - the volume adjustment and that format's fast, lossless pass-through can't be combined; such a track now gets a quick re-encode instead so ReplayGain still applies
- Fixed a deleted playlist reappearing in the Playlists view, sometimes for up to an hour afterward - deleting it updated what was on screen right away, but not the on-device cache checked first on the next visit
- Fixed a rare inconsistency after force-taking over a device from another session: if that session's own attempt to (re)start playback on the same device failed at almost the same moment, its failure cleanup could undo the takeover, leaving both sessions disagreeing about who actually has the device until something else refreshed it
- Fixed the Songs, Albums, and Artists library views getting progressively slower and less responsive the further you scrolled through a large library - every row/card stayed mounted after loading more instead of only the ones actually on screen
- Fixed a song's right-click menu not closing when another song's was opened - each could be opened independently, leaving several stacked on top of each other at once
- Fixed clearing the queue while casting getting silently undone a few seconds later, with every song reappearing - the clear never made it past this device to the cast session itself
- Fixed a high-resolution FLAC (above 24-bit/48kHz, e.g. 24-bit/96kHz) failing to play at all when cast to a Sonos speaker - it was sent to the device completely unchanged even though Sonos only supports up to 24-bit/48kHz, so the speaker rejected it and stopped about a second in. It's now automatically downsampled to whatever the target device actually supports (Chromecast, DLNA and AirPlay each have their own limit too)
- Fixed the Now Playing view squeezing artwork and lyrics into two cramped stacked rows on windows that are wide but not wide enough, instead of turning the artwork over to show lyrics on its back. That flip used to happen only on portrait screens; it now happens whenever the two genuinely stop fitting side by side, which on a typical monitor is anywhere below about 1560px wide
- Fixed the last fraction of a second being cut off every track while casting - the next track was dispatched to the speaker slightly before the current one had finished playing, and the countdown to that moment used the whole-second length reported by the music server rather than the track's real one. Only noticeable on tracks that end abruptly rather than fading out, where it sounded clipped
- Fixed the first and last line of unsynced lyrics (ones without timings) always looking half faded out, because the text began exactly where the panel's soft top edge fades in. Short lyrics that fit without scrolling are now centred in the panel rather than sitting at the very top, while longer ones still start below the fade and scroll normally
- Fixed favourited artists never showing up in the Favorites view - only albums and songs were listed there, so marking an artist as a favourite looked like it did nothing
- Fixed the heart on an artist card staying dark instead of turning amber once that artist is a favourite, unlike album cards and every other favourite toggle in the app. Hovering an unfavourited album card no longer colours its heart amber either, since that reads as "already a favourite"
## [0.1.4] - 2026-08-17
### Added
- Added live sync of the queue, shuffle, and repeat state across every device controlling the same cast session - reordering, adding, or removing a song, or toggling shuffle/repeat, on one device now shows up on every other connected device too (previously only which song was playing and its position stayed in sync; the queue itself was independent per device)
- Added playlist artwork to the Electron Remote Control PWA's playlist list - it only ever showed a plain title/song count before
- Added a fullscreen toggle to the Now Playing view (top right) - hides the rest of the app's chrome around it for a more immersive view; a lyrics button appears alongside it while fullscreen is active, since the usual one (in the player bar) is part of that now-hidden chrome
- Added a flip animation for lyrics on portrait/narrow monitors - the artwork now turns over to reveal lyrics on its back instead of squeezing both side by side or stacking them; also brings lyrics to the mobile web UI for the first time, via a new toolbar button, using the same flip since phones are always portrait too
- Added a Trace log level, one step past Debug - Debug now covers Beacon's own backend code only, Trace also turns on the third-party libraries underneath it (Sonos/AirPlay, HTTP clients) for full SOAP/HTTP-level detail when actually troubleshooting one of those. A new `LOG_LEVEL` environment variable sets the starting level the same way the Settings dropdown does, for a deployment that never comes up far enough to reach Settings
- Added links to Spotify, Apple Music, TIDAL, YouTube, Deezer, Discogs, and MusicBrainz on artist pages, and on the Home "New to explore" shelf - the shelf previously only linked out to Deezer itself (or MusicBrainz as a fallback), and an artist page for someone already in your library had no external links at all
### Changed
- Changed the Electron Remote Control PWA's look to match the mobile web UI - same amber/navy color palette, lighthouse app bar, tab bar icons/labels, Now Playing layout (single row of transport controls, filled play button, cast toggle next to the volume slider), and themed seek/volume sliders instead of its own separate blue-accented style with plain browser-default sliders
- Changed the lyrics view's "pick a different match" list on mobile from a dropdown menu to a full-width sheet - easier to hit and to read than a small floating panel anchored to a toolbar button
- Various small UI sizing/spacing tweaks (mobile web UI, Now Playing on wide monitors, lyrics on mobile) based on actually using it
### Fixed
- Fixed the app log file (see 0.1.3) tagging every line from the backend as an error, even completely normal status messages - the backend logs everything to the same output stream regardless of severity, same as most command-line programs, and the log file was mistaking that stream choice for severity
- Fixed queue changes made while casting (reordering, adding, removing, shuffling) not being followed by auto-advance once nothing was around to manually skip to the next song - the cast target kept auto-advancing through whatever queue order was active when the current song started, ignoring anything changed since
- Fixed picking a cast target while local playback was paused starting playback on that device right away instead of staying paused
- Fixed the Previous/Next buttons resuming playback immediately even if it was paused - navigating now stays paused, matching what selecting a cast target already did
- Fixed the "now playing" display occasionally showing a different song than what was actually playing when two devices controlled the same cast session and both changed something around the same time
- Fixed shuffle not actually shuffling the first song when playing a whole playlist/album from the top - it always started on track 1 in its original order, with shuffle only kicking in from the second song onward
- Fixed the mobile web view carrying over a tab's scroll position into whichever tab you switched to next, instead of each tab keeping (and restoring) its own
- Fixed the Docker/web deployment's audio stream to cast devices being vulnerable to nginx buffering it all at once instead of forwarding it continuously in real time - could turn a brief network hiccup mid-song into a multi-minute stall stuck at 0:00 instead of recovering
- Fixed synced lyrics opened mid-song showing the very first line instead of scrolling straight to wherever playback actually is - it caught up on its own once the next line's timestamp passed, but sat at the wrong spot until then
- Fixed dragging a track to swap it with the very next one in the queue landing it one position further than intended - the drop target only accounted for which row you dropped on, not which half of it, so a drag moving down past a row's own boundary silently pulled in the row after it too
- Fixed pressing Play again after a cast session's queue finished playing (no repeat, last song ended): position stayed frozen at 0:00 and the audio visualizer/synced lyrics never got going, since resuming just asked the already-finished stream to continue instead of properly restarting it - the same bug fixed for local playback in 0.1.1, which never covered casting
- Fixed the Home "Discover" shelf's Reroll button rarely changing anything - which artists its suggestions were seeded from was picked the same way every time (always your top few most-played, in the same order) rather than varying, so a reroll usually landed right back on the same result; suggestions also now refresh daily instead of monthly
- Fixed a temporary MusicBrainz outage or rate-limit response permanently blanking out an artist's info (recommendations, external links) instead of just that one attempt - a failed lookup was being cached the exact same way as a genuine "nothing found" result, so it never got retried later once MusicBrainz recovered
### Removed
- Removed the `DEBUG` environment variable - it only ever gated the API docs at `/api/docs` (unauthenticated by design, not something a real deployment needs reachable) and, separately, some backend developer-testing toggles; log verbosity now has its own `LOG_LEVEL` variable instead (see Added)
### Security
- Updated Electron from 38 to 39, closing out a batch of upstream security advisories Dependabot flagged (context isolation, protocol handling, and related renderer-process issues)
## [0.1.3] - 2026-08-16
### Added
- Added a log file for the Electron app (`logs/main.log` in its data directory, next to the previous session's `main.log.old`) - previously nothing was recorded at all outside of a terminal, making it hard to diagnose an issue after the fact
### Fixed
- Fixed a follow-up cause of the "Connect backend unreachable" startup error (see 0.1.1): the app window could start loading before the bundled backend process had actually finished starting up and begun listening - Electron now waits for it to be reachable first
- Fixed the packaged app icon (see 0.1.2) not actually rendering correctly on Windows/Linux - now built from a proper multi-resolution icon file instead of relying on an automatic single-image conversion
- Fixed casting device discovery and Remote Control pairing potentially failing silently on macOS 14+ due to a missing local-network-access permission description
- Fixed the queue collapsing to just the currently-playing song while casting: whenever the cast target auto-advanced to a song the app already had queued, it was rebuilding the whole queue from scratch around that one song instead of just following along
- Fixed casting always auto-advancing to the next song a little early, cutting off the tail end of the current one - the auto-advance timer wasn't accounting for the casting device's own startup-buffering delay, the same correction its displayed position already used
- Fixed the casting device's startup-buffering calibration sometimes never completing (falling back to a rough guess for the whole track, throwing off lyrics sync and auto-advance timing) - a device legitimately reporting position 0 right at track start was being treated the same as no reading at all and skipped
## [0.1.2] - 2026-08-16
### Added
- Added the app icon (desktop entry, browser tab, installers) - previously only showed Electron's generic default icon there; still the same lighthouse mark used throughout the app itself
### Fixed
- Fixed the casting device menu jittering slightly every few seconds while open: its background refresh was briefly flashing a loading indicator on every tick, nudging the list
- Fixed the volume slider on a paired phone's Remote Control screen briefly snapping back after releasing it while casting to a single device
## [0.1.1] - 2026-08-16
### Fixed
- Fixed a spurious "Connect backend unreachable" error on Electron startup: silent re-login on app boot now always resolves the current connect backend address instead of reusing the previous session's, which could point at a port that's no longer in use
- Fixed pressing Play after a queue finished playing (no repeat, last song ended): the track would restart audibly but the progress bar and audio visualizer stayed frozen; playback now restarts properly instead of resuming an already-finished track
- Fixed local playback sometimes starting on its own right after logging in: the "continue where you left off" resume was firing after any successful login, not just an app restart, so it could auto-play whatever was persisted from a previous session
## [0.1.0] - 2026-08-16
First release - no previous version to compare against yet, so there's nothing to list here. See the README for what Beacon can do.