[Plugin] Spotify Soloist Connect for Volumio (incl. LossLess)

Spotify Soloist Connect - stable

Store: 0.9.0 (18 Sep 2026) - Plugins → Music Services (armhf)

GitHub (cutting edge): 0.9.0 (18 Sep 2026) - repo

Turns a Volumio 4 device into a Spotify Connect endpoint using Spotify Soloist.
Not affiliated with Spotify AB.

The store package is the accepted stable. Store and GitHub are both 0.9.0. The store listing is armhf only. x86 stays on GitHub (git sparse clone or alsa_soloist_connect-main.zip). Uninstall the store plugin before installing from GitHub. Changes after this release are on GitHub only.

Tested

Unchanged. These rows are 0.8.0 listens. 0.8.1 through 0.9.0 have no new pass/fail here. The x86 column is from those listens, not from the store zip.

Plugin x86 rPi3 rPi4 rPi5 PrimoV2 Primo-Plus Rivo Motivo Integro Rivo+
FusionDSP Pass tbd tbd Pass Pass Pass Pass Pass tbd tbd
Peppy Meter Basic Pass tbd tbd Pass n.a. Pass n.a. Fail n.a. n.a.
Peppy-Spectrum Pass tbd tbd Pass n.a. Pass* n.a. Fail n.a. n.a.
Peppy/Spectrum for BW (exp. branch) Pass tbd tbd Pass tbd tbd tbd Pass tbd tbd
Premium: Multiroom tbd tbd tbd tbd Pass Pass Pass Pass tbd tbd

Known issues

Issue Note
Soloist builds expire after 90 days Spotify kills a build 90 days after its build date. That is their decision. On start the plugin re-downloads an already-dead build. While it stays up, a once-a-day check logs remaining days. Download a new Soloist binary before it expires is off by default. When on, that check pulls from Spotify if seven days or fewer remain, or the build is already dead, and Spotify is not playing here. Web radio and other sources count as idle. That silent pull starts the new binary and does not reboot. The Update button still uses a progress modal and a 15 second reboot countdown. We do not review the tarball Spotify serves. First check is a day after start, not at boot.
Loudness / crossfade are not a Soloist API Soloist has no CLI or WebSocket for these. Official docs still say it does not read a configuration file. The Sound switches write audio.normalize_v2 and audio.crossfade_v2 / audio.crossfade.time_v2 at spawn. Loudness is on by default. Crossfade is off; time is 1000-12000 ms and the time key is dropped when the switch is off. If a later Soloist build ignores or renames the keys, the switches still write and the audio may not change. Not Output Trim and not Output buffer.
Soloist response lag 1-3 s on volume and skip. Spotify’s binary, not the plugin.
arm64 Built and shipped in the tree, not yet exercised at runtime. The store listing is armhf.
Queue playback Prototype, off by default. spop rows are skipped at play time. Convert playlist can rewrite a saved list; it is not automatic.

Changelog

0.9.0 - 18 Sep 2026 - store
Change
Promoted to stable. No longer beta Changed
Store and GitHub are both 0.9.0. Store listing is armhf
0.8.6 through 0.8.9 are in this store package (takeover, loudness, crossfade, daily binary refresh)
UI strings for every Volumio backend language_code New
Shim unchanged (0.2.9)
0.8.9 - 15 Sep 2026
Change
Once-a-day Soloist binary freshness check while the plugin stays up New
Switch Download a new Soloist binary before it expires (off by default) New
When on, pull from Spotify if seven days or fewer remain, or the build is already dead, and Spotify is not playing here Changed
That silent pull starts the new binary and does not reboot. The Update button still uses the 15 second reboot countdown
On start an already-dead build is still re-downloaded. We do not review the tarball Spotify serves
Crossfade, loudness, takeover, queue and the shim unchanged (0.2.9)
In the store as of 0.9.0
0.8.8 - 14 Sep 2026
Change
Sound switch Crossfade (off by default) plus 1000-12000 ms duration New
Off drops the time key so a leftover fade cannot stay on Changed
Same undocumented engine prefs pass as loudness. Not Output buffer
If a later Soloist build ignores the keys, the switch still writes and the audio may not fade
Takeover, queue, loudness default and the shim unchanged (0.2.9)
In the store as of 0.9.0
0.8.7 - 14 Sep 2026
Change
Sound switch Loudness normalization (on by default) New
Off writes audio.normalize_v2=false at each spawn. Not Output Trim Changed
No CLI for this; undocumented engine store
If a later Soloist build ignores the key, the switch still writes and the level may not move
Takeover, queue and the shim unchanged (0.2.9)
In the store as of 0.9.0
0.8.6 - 11 Sep 2026
Change
Daemon playing with is_active=false called takeOverPlayback / volumioStop on whoever was current, including AirPlay Fixed
Connect mode does not claim unless this speaker is the Connect target. Status stays pause so a later play here still claims Changed
Queue mode and leftover-yield play unchanged. Shim unchanged (0.2.9)
In the store as of 0.9.0
0.8.5 - 2 Sep 2026 - store
Change
Named settings backups on this device (create, restore, delete) New
Restore uses the same validation as Save. The API key is in the file only when Retain my API key is on Changed
A backup without a key keeps the key already on this box. Not a clone of the Spotify login
After create, restore or delete the open settings page refreshes (pushUiConfig) Changed
Playback, takeover unchanged. Shim unchanged (0.2.9)
Store. GitHub is 0.9.0
0.8.4 - 30 Aug 2026
Change
After the session left this speaker, yield sent Spotify pause and stopped the phone or desktop Fixed
Connect yield published stop while still volatile; core ignored it and the player / Peppy kept play Fixed
Yield pauses only while this speaker still holds the session. Connect yield publishes pause while still volatile Changed
Queue-row end still publishes stop. Takeover unchanged. Shim unchanged (0.2.9)
In the store as of 0.8.5
0.8.3 - 30 Aug 2026
Change
Skip before prefetch finished locked the quality line on Low (a few hundred KB over the track duration) Fixed
Holds the label while that cache fd is still growing; publishes Lossless when the bitrate crosses the floor; upgrades if the same file gets larger Changed
Disable/enable is not needed to show lossless. That remasured the finished file
Playback unchanged. Shim unchanged (0.2.9)
In the store as of 0.8.5
0.8.2 - 28 Aug 2026
Change
soloist.service could come back at boot with the plugin disabled (WantedBy=multi-user.target) Fixed
Disable stops the daemon and unpins it from boot. Install no longer enables the unit Changed
Playback unchanged. Shim unchanged (0.2.9)
In the store as of 0.8.5
0.8.1 - 27 Aug 2026
Change
Software mixer, pcm.volumio slave already softvolume: first play aborted (pcm_params.c get_min) on PCM2704 Fixed
That graph now opens softvolume (SoftMaster stays). Peppy and switcher graphs stay on plug:spotify / plug:volumio Changed
Start line always names plugin=, shim=, and the .so SOURCE_REVISION New
In the store as of 0.8.5
0.8.0 - 25 Aug 2026
Change
First beta New
UI package is Plugins → Music Services. GitHub is cutting edge between those releases Changed
Updating the Soloist binary replaced the live file, then restarted the daemon in place Fixed
Stage, patch and --version before replace. A failed download leaves the running binary Changed
Settings button: system progress modal, then a 15 s reboot countdown with Restart and Cancel Changed
Shim unchanged (0.2.9)
0.7.6 - 25 Aug 2026
Change
logsubmit / ps showed the Soloist API key on argv until the first Pulse call Fixed
The shim overwrites that slot two seconds after load (and still on the first pa_* call) Changed
Playback path unchanged
Shim 0.2.9
0.7.5 - 25 Aug 2026
Change
Convert playlist: rewrite stock Spotify (spop) track rows in a saved Volumio list to soloist_connect New
Clone is the default and leaves the original file; overwrite replaces it
Only spotify:track: rows change. Album, playlist and artist URIs stay spop
A list already saved as soloist_connect does not appear
Does not restart Soloist and does not turn on queue playback
Shim unchanged (0.2.8)
0.7.4 - 25 Aug 2026
Change
Optional Align volume on start (off by default) New
When this speaker becomes the active Connect device, Volumio’s volume is copied to Soloist instead of applying Initial Volume to the mixer
Mute becomes 0; mixer None and disableVolumeControl skip align
After that the Spotify app slider still moves the mixer
Shim unchanged (0.2.8)
0.7.3 - 25 Aug 2026
Change
An open Spotify Queue tile was a snapshot from the moment it opened Fixed
Now playing updates immediately; play next, up next, autoplay and recently played stay in those sections Changed
Those lists are refilled with a full get_queue (the unsolicited event is capped at 10)
Placeholder rows are omitted Changed
Playback paths unchanged
Shim unchanged (0.2.8)
0.7.2 - 24 Aug 2026
Change
Spotify Queue tile is registered only while Play Spotify tracks from the Volumio queue is on Changed
Off hides it, so a tap cannot skip a row and stop Connect Fixed
Saving that section adds or removes the tile without a daemon restart
Shim unchanged (0.2.8)
0.7.1 - 24 Aug 2026
Change
Spotify Queue browse tile: now playing, play next, up next, autoplay, recently played New
Source is get_queue / queue_changed. That is Spotify’s Connect list, not Volumio’s mixed playlist
Tile appears when the Soloist socket is up; home icon is a sourceicon SVG
Spotify Queue wait is a Timing setting (default 2500 ms, 0-10000; 0 paints the last event immediately) New
Search is empty. Playback paths unchanged
Shim unchanged (0.2.8)
0.7.0 - 24 Aug 2026
Change
Optional queue mode: a Spotify row in a Volumio playlist or queue can play through Soloist New
Off by default. Needs a paired session (logged_in); the app does not have to be open
No session, or another device holds it: the row is skipped and the list moves on Changed
Remote-device play of a queued row is a separate switch, also off New
Queue mode is not volatile: next/prev stay with core Changed
Row ends on buffering-at-duration, idle after start, or a roll into autoplay; pause and ALSA yield before the next service Changed
Settings split by change target. A section save posts only its fields Changed
Daemon restarts only when it actually reads a changed value Changed
Shim unchanged (0.2.8)
0.6.19 - 23 Aug 2026
Change
First pcm open on a busy card was a failed open Fixed
Busy card is a wait; the first pcm open line is the success Changed
Corked connect no longer opens the PCM Changed
Tidal Connect (vtcs) is asked to release when it holds the DAC New
Shim 0.2.8
0.6.18 - 23 Aug 2026
Change
Peppy metering stored the flag but left the running process on plug:volumio after pcm.spotify appeared Fixed
Restart only when the running process device does not match plug:spotify / plug:volumio. Unreadable environ is not a mismatch Changed
Without Peppy the path is unchanged
Shim unchanged (0.2.7)
0.6.17 - 23 Aug 2026
Change
Skip kept the previous track’s quality label, or measured the last file against the new duration Fixed
Quality retry wait and Quality retries are settings (defaults 300 ms and 2; 0 disables) New
The playing cache file is not opened Changed
Shim unchanged (0.2.7)
0.6.16 - 23 Aug 2026
Change
Flush discarded and re-prepared a healthy PCM; second Motivo MultiRoom seek killed volumioOutput Fixed
Flush now drops the Pulse ring only; committed ALSA audio plays out Changed
Seek coalesce and Inactive hold are settings (defaults 200 ms and 2000 ms; 0 disables) New
Idle with an empty item published a blank now-playing line Fixed
0.6.15 - 23 Aug 2026
Change
If prepare left the switcher handle dead, flush now reopens instead of drop Fixed
Healthy graphs still dropped and prepared on flush Changed
0.6.14 - 22 Aug 2026
Change
Default 500 ms buffer dropped the tail of Soloist’s 8–32 KiB write (rush and chop) Fixed
Ring is tlength plus 64 KiB; Pulse writable_size still reports the target Changed
0.6.13 - 22 Aug 2026
Change
Writes FLOAT32 at the client rate into plug:volumio; the outer plug converts Changed
Forced S16 (0.6.10–0.6.12) set the USB/AML slave open and rushed Fixed
Exact rate or fail; I/O capped at two periods Changed
0.6.12 - 22 Aug 2026
Change
--api-key and API_KEY no longer appear in ps or logsubmit Fixed
0.6.11 - 22 Aug 2026
Change
32 KiB preroll write rejected when the ring had less room; device stayed silent Fixed
0.6.10 - 22 Aug 2026
Change
Shim converts FLOAT32 to S16 before writei Changed
Times the PCM we opened; writes are all-or-nothing Changed
0.6.9 - 22 Aug 2026
Change
Reverts 0.6.4–0.6.8. Audio path is 0.6.3 again (FLOAT32 into plug:volumio) Changed
Convert and pace matching snapped a 44.1 DAC to 88.2 k (half speed) Fixed
0.6.8 - 22 Aug 2026
Change
Ignore the first ALSA buffer before measuring pace; two agreeing 200 ms windows Changed
0.6.7 snapped a USB fill burst to 88.2 k and played 44.1 at half speed Fixed
0.6.7 - 22 Aug 2026
Change
Measure the consumer rate from frames versus wall time, including the poll wait Changed
0.6.6 - 22 Aug 2026
Change
Convert to the measured write pace when it is not the track rate Changed
ALSA yield file left behind after a hand-off; next play had no PCM Fixed
0.6.5 - 22 Aug 2026
Change
44.1 lossless played fast (Integro, with or without FusionDSP) Fixed
ALSA resample on again; float-to-S24 convert unchanged Changed
0.6.4 - 22 Aug 2026
Change
Shim converts FLOAT32 to S24_3LE (or S24_LE / S16_LE) before writei Changed
Exact sample rate; resample only if that open fails Changed
Auto-advance showed the previous track’s title Fixed
0.6.3 - 21 Aug 2026
Change
Replaced apulse with a purpose-built Pulse shim (47 symbols, ALSA only) New
Quiet wait logs, and a /proc path overflow in the shim Fixed
Retired the apulse build path Changed
0.6.2 - 21 Aug 2026
Change
Playback cache can be placed in RAM New
Cache location selector, with the choice logged Fixed
Metadata not shown when taking the session Fixed
Diagnostics now follow the Verbose Logging setting Changed
Removed sed from every executable path Changed
0.6.1 - 21 Aug 2026
Change
Verbose logging did nothing Fixed
Seek bar: no per-second publish, which XRUN’d the DAC Fixed
ALSA format and period negotiation Fixed
Stale crashpad locks at every start Fixed
Executable bit on the launcher Fixed
0.6.0 - 20 Aug 2026
Change
PeppyMeter / Spectrum screensaver support on Bookworm New
Plays through the metered PCM when the screensaver asks New
Implausible position timestamp rejected Fixed
Seek timer no longer publishes; no yield on takeover Fixed
0.5.0 - 20 Aug 2026
Change
Output Trim, to set PeppyMeter needle deflection New
0.4.0 - 20 Aug 2026
Change
Meter deflection followed master volume Fixed
Soloist not released after closing the Spotify app Fixed
0.3.0 - 18 Aug 2026
Change
Format negotiation Fixed
Lagging response Fixed
Pre-alpha - 17 Aug 2026

First working builds on rPi4, rPi5 and x86.