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.