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

Hello everyone,

I’m happy to announce that Spotify Soloist Connect is now in Stable.

0.9.2 is installed from the Volumio UI: Plugins → Music Services.

Cutting edge (fixes and work between those releases) stays on GitHub and uses the git install below. That line can be ahead of the UI package.


Spotify Soloist Connect

This plugin allows you to use Spotify Soloist on Volumio, providing an alternative Spotify Connect implementation for both Raspberry Pi and x86 systems.

This is an unofficial, community-built plugin. It is not affiliated with, endorsed by or sponsored by Spotify AB.

Features

  • Spotify Connect support via Spotify Soloist
  • Works on Raspberry Pi and x86 devices
  • No Premium Volumio subscription required
  • Automatic service management through Volumio
  • Lightweight implementation
  • Playing Lossless Spotify tracks

How it works

Spotify Soloist is designed to run on PulseAudio, while Volumio is built around ALSA. The plugin automatically creates the required audio bridge, allowing Spotify Soloist to coexist with Volumio’s audio stack.

You need a Spotify Premium account and generate an API key through the dashboard.

Tested on

  • Raspberry Pi 4
  • Raspberry Pi 5
  • x86 systems (Wyse, Intel NUC, etc.)


Installation, Plugin Store Stable 0.9.2: (27-Oct-2026)

Install from the Volumio UI: Plugins → Music Services.

New First Stable release.
Changed See detailed changelog.
  • Generate your Soloist API key at the Spotify for Developers dashboard (Soloist section).
  • In Volumio: Plugins → Music Services → install Spotify Soloist Connect.
  • Enable the plugin, open its settings, paste your API key, set a device name, save.
  • Reboot your device
  • Open Spotify on your phone or desktop and pick your device from the Connect list.

Treat the API key as a secret. Do not post it, and do not post unredacted logs.


Cutting edge (between releases) 0.9.5: (04-Nov-2026)

Only if you want what is on GitHub after the last UI release.

Cutting edge - release zip

cd /home/volumio
wget https://github.com/foonerd/alsa_soloist_connect/releases/download/v0.9.5/soloist_connect-0.9.5.zip
wget -O soloist_connect-0.9.5.sha256 https://github.com/foonerd/alsa_soloist_connect/releases/download/v0.9.5/SHA256SUMS
sha256sum -c --ignore-missing soloist_connect-0.9.5.sha256
mkdir -p soloist_connect-0.9.5 && cd soloist_connect-0.9.5
miniunzip -o ../soloist_connect-0.9.5.zip
volumio plugin install

This may still work:

git clone --depth 1 --filter=blob:none --sparse https://github.com/foonerd/alsa_soloist_connect.git
cd alsa_soloist_connect
git sparse-checkout set soloist_connect
cd soloist_connect
volumio plugin install

That can be newer than Plugins → Music Services. Use it when you are testing a fix that is not in the UI package yet.


Special thanks to @nerd for doing the impossible over and over again.
Without him the rPi family would be very silent!!!

The store package is 0.9.2 (27 Oct 2026). GitHub is 0.9.5 as of 4 Nov 2026, and no build after 0.8.0 is in the listen table.

Spotify Soloist Connect - stable

Store: 0.9.2 (27 Oct 2026) - Plugins → Music Services (armhf)

GitHub (cutting edge): 0.9.5 (4 Nov 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 at 0.9.2. GitHub is 0.9.5 and is not a store submission. 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. 0.9.3 through 0.9.5 are on GitHub only.

From 0.9.3 the repo also assembles a Volumio 3 (buster) zip, soloist_connect-<version>-buster.zip, from the same source. Best effort, community tested, GitHub pre-release only, never in the store. The author has no Volumio 3 device. The Volumio 4 plugin is unchanged by it.

Tested

Unchanged. These rows are 0.8.0 listens. 0.8.1 through 0.9.5 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
Updating the plugin leaves it stopped Store 0.9.2. Volumio stops a plugin before an update and never starts it again. A toggle from the UI runs the previous version from Node’s require cache; a manual update leaves the daemon down until a reboot. GitHub 0.9.4 schedules a restart of the Volumio backend eight seconds after an update of an enabled plugin, so the new version starts and Connect returns without a toggle or reboot. A first install is unchanged. Not in the store.
API key visible to ps while the daemon is idle Store 0.9.2. The shim’s two-second scrub ran only once the first sound loaded the shim (seen on a Pi 3B+, armhf), so a daemon that had not played yet still showed --api-key in ps and in a log upload, including after every boot. GitHub 0.9.3 preloads the shim so the scrub runs at start. Reported, with the fix, by chrisp429. Tested on Volumio 3.912 / Pi 3B+; not yet verified on Volumio 4. If a log with the key was posted, revoke the key on the Spotify dashboard. Not in the store.
Sample rate with FusionDSP is CamillaDSP’s output rate Store 0.9.2. /proc/asound shows the card below CamillaDSP. GitHub 0.9.4 reads the stream parameters FusionDSP publishes at hw_params (/tmp/fusiondsp_stream_params.log) while they are fresh (15 s), and ignores a stale file or a disabled FusionDSP. Without FusionDSP nothing changes. Not in the store.
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.
Spotify Queue page does not refresh itself By design from 0.9.2. Built once on open from a full get_queue; leave and re-open to see a change. A REST browse of soloist_connect has no side effects.

Changelog

0.9.5 - 4 Nov 2026 - GitHub only
Change
The Pulse shim ships from its own release line. alsa-lib/ is release shim-v0.2.9 of the repo, built by GitHub Actions from the same source, byte for byte the library shipped since 0.8.4 Changed
alsa-lib/RELEASE names that release and its digests; every package is checked against it before publish New
Nothing changes on the player
Shim source moved to 0.2.10 (exact playback progress through recovery, refs #1). Not shipped; the plugin stays pinned to shim-v0.2.9 until 0.2.10 is accepted
Not a store submission. Store remains 0.9.2
0.9.4 - 4 Nov 2026 - GitHub only
Change
An update left the plugin stopped: Volumio stops a plugin before updating and never starts it again; a UI toggle ran the previous version from memory, a manual update left the daemon down Fixed
The installer schedules a restart of the Volumio backend eight seconds after an update of an enabled plugin (transient systemd timer). The web UI reconnects within about half a minute. A first install does not restart anything Changed
With FusionDSP in the chain the sample rate shown was CamillaDSP’s output rate Fixed
The plugin reads the stream parameters FusionDSP publishes at hw_params, while fresh. Without FusionDSP, or with it disabled, nothing changes Changed
Shim unchanged (0.2.9)
Not a store submission. Store remains 0.9.2
0.9.3 - 4 Nov 2026 - GitHub only
Change
A daemon that had not played yet still showed the API key to ps and to a log upload. The shim, and its two-second scrub, loaded only at the first sound Fixed
The launcher preloads the shim (LD_PRELOAD), so the scrub runs at start whether or not anything has played. Soloist’s later dlopen gets the same library; audio is unchanged Changed
Reported, with the fix, by chrisp429. Tested on Volumio 3.912 / Pi 3B+. Not yet verified on Volumio 4
A Volumio 3 (buster) build: soloist_connect-<version>-buster.zip from the same source, own package metadata and install scripts. Best effort, community tested, GitHub pre-release only, not in the store New
Release train: GitHub Actions build one zip per target on a v* tag; the plugin tree as committed and nothing else. The release is created as a draft and published by hand after device checks New
Plugin README no longer describes the Spotify Queue page as refreshing itself; that stopped in 0.9.2
Shim unchanged (0.2.9)
Not a store submission. Store remains 0.9.2
0.9.2 - 26 Oct 2026 - store from 27 Oct 2026
Change
After the Spotify Queue tile was opened, every auth_state, track_changed and queue_changed rebuilt the page and broadcast it (pushBrowseLibrary) to every connected client Fixed
The page is a plain read. Built once on open from a full get_queue (the unsolicited event is capped at 10); a change shows on the next open Changed
No get_queue is sent from auth_state, track_changed or queue_changed. Only an open asks Changed
A REST browse of soloist_connect has no side effects Changed
Playback, takeover and queue mode unchanged. Shim unchanged (0.2.9)
Submitted to the store as stable on 27 Oct 2026 (store author metadata corrected the same day). Store listing is armhf. Not listened
0.9.1 - 25 Sep 2026 - store 25 Oct to 27 Oct 2026
Change
Moving playback here while it is already playing stayed silent until Next. Soloist reported playing before is_active Fixed
That refusal is remembered for 2 s and replayed from device_changed only Changed
auth_state, queue mode, pause or idle, the 1.5 s yield window, and a later activation do not replay it
Account playing with is_active=false still does not claim
Shim unchanged (0.2.9)
Submitted to the store as stable on 25 Oct 2026 (metadata only; code is the 25 Sep build). Replaced in the store by 0.9.2 on 27 Oct 2026. Not listened
0.9.0 - 18 Sep 2026 - store until 25 Oct 2026
Change
Promoted to stable. No longer beta Changed
Store and GitHub were 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)
Replaced in the store by 0.9.1 on 25 Oct 2026
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 until 18 Sep 2026
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)
Replaced in the store by 0.9.0 on 18 Sep 2026
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 remeasured 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
The scrub ran only once the first sound loaded the shim. Moved to daemon start in 0.9.3
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)
The live refresh added here is retired in 0.9.2
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.

Is there a significant difference architecture difference between PulseAudio and ALSA? Why would Spotify use PulseAudio and Volumio ALSA?

This is a very common linux sound architecture : PulseAudio can sit on top of ALSA and use it as the hardware backend. So Spotify may use PulseAudio for routing/mixing, while Volumio talks directly to ALSA for a simpler, more deterministic audio path.

Wheaten, really happy you found the time and motivation to code new plugins! I don’t know about you, but vibecoding really cuts the time-to-release and removes a lot of barriers :slightly_smiling_face:

Is there a way to test this already?
Last 3 weeks my volumio keeps restarting the player if i use the "old"spotify plugin even after a new install en a new power source.
Would be very happy to test this and i have a premium account for spotify.

We started the build yesterday, please give us some time to test.

Not to rush you, greatly appreciate your work.:ok_hand:t2:
Just missing my Spotify in the shower.:smile:

pleas euninstall the version 4.4.1 and install the version 4.4.2

playback from Volumio won’t work, but Spotify Connect does

Hi all,

I’m opening up an early alpha release of Soloist Connect, a Volumio plugin built around Spotify Soloist, the official headless Spotify Connect client that Spotify released for Linux in August 2026. The plugin turns your Volumio device into a Spotify Connect endpoint, with track metadata, cover art, seek, and transport controls synced into the Volumio UI through Soloist’s local WebSocket API.

Read this first

This is strictly for first adopters. The plugin is usable at best — expect rough edges, odd states, and the occasional restart. We’re releasing early on purpose: the interaction between Soloist, Volumio’s state machine, and the audio layer has too many device- and setup-specific corner cases to shake out on a handful of machines. A bigger testing ground is exactly what this alpha is for. If you’re not comfortable with SSH and reading logs, please wait for the beta.

What it does

  • Registers your Volumio device as a Spotify Connect endpoint (control it from any Spotify app on your network)
  • Metadata, cover art, position, and volume synced into the Volumio UI
  • Shuffle/repeat, skip, seek from both sides
  • Stream quality tier detection (Low → Lossless), shown in the UI
  • Automatic handling of Soloist’s 90-day build expiry (auto re-download)
  • Plays nicely with other Volumio sources: yields the audio device when you switch to MPD/webradio, takes it back when you play to Connect

The audio layer (apulse)

A lot of effort in this release went into the audio path. Soloist speaks PulseAudio only, but Volumio’s world is ALSA. Rather than running a full PulseAudio system server alongside Volumio, the plugin uses apulse as a thin translation layer between Soloist’s PulseAudio calls and ALSA, feeding audio into Volumio’s shared volumio ALSA device so the normal Volumio audio pipeline (mixer, DSP, output selection) stays in charge. Getting device handover right — Soloist releasing the ALSA device when you switch sources and reclaiming it cleanly when you come back — took the bulk of the debugging time and is precisely the area where I’d like the widest testing.

Known issues

  • PeppyMeter Basic and Peppy-Spectrum respond to master volume instead of the audio signal. The meters move with the volume knob rather than with the music. This is a consequence of how the apulse→ALSA path is wired relative to the point where Peppy taps the audio, and it’s being worked on. If you rely on Peppy visualizations, this alpha will annoy you.
  • Rapid source switching (Connect → MPD → Connect) can occasionally need a play-press twice before audio returns.
  • Sample rate / bit depth shown in the UI reflect the ALSA output stream, not the source material (Soloist’s API exposes no per-track codec info; the quality tier shown is measured from the cache instead).
  • First connection after boot can take a few seconds to appear in the Spotify app’s device list.

Requirements

  • Raspberry Pi 3/4/5 or x86_64 (armv6 devices like Pi 1/Zero v1 are not supported by Soloist)
  • Volumio Rivo, PrimoV2, Motivo, Primo Plus (tested)
  • Volumio Rivo+, Integro should work (untested)
  • A Spotify Premium account to generate the Soloist API key (once running, any account on your network can play to it)
  • Volumio 4.x with SSH enabled

Installation

  • Generate your Soloist API key at the Spotify for Developers dashboard (Soloist section).
  • Open a SSH termianl to your device
  • run:
    git clone --depth 1 --filter=blob:none --sparse https://github.com/foonerd/alsa_soloist_connect.git
    cd alsa_soloist_connect
    git sparse-checkout set soloist_connect
    cd soloist_connect
    volumio plugin install
    
  • Enable the plugin, open its settings, paste your API key, set a device name, save.
  • Reboot your device
  • Open Spotify on your phone or desktop and pick your device from the Connect list.

Reporting issues

This alpha lives or dies by your reports. When something misbehaves, please post:

  • Device model, DAC/output in use, Volumio version
  • What you did, what you expected, what happened instead
  • Post a log with verbose logging on

Each user must generate their own key; please don’t share keys.

Especially valuable right now: testing on different DACs (USB, I2S HATs, HDMI), source-switching between Connect and other services, multi-room/multi-device Spotify accounts, and long play sessions.

Using Spotify Soloist means accepting the Spotify Terms and Conditions of Use.

Thanks for testing — post your findings below, the uglier the better.

Hello!
Tested v0.0.6 on Integro VOLUMIO V4.164
Lossless mode
FusionDsp enabled

Mostly good…
First track play fine, but time to time small audio hiccup about every 10sec.
Fast forward or skipping track result in sort of mix speed slowdown sound.
Using Spotify while playing Qobuz stop Qobuz : fine , Volumio UI does not reflect this state.
Bi-directionnal volume ok

:wink:

edit : lyrics are a bit out of sync, after play pause

Can this new trial plugin (soloist) sit along side the current spotify connect 1.0.0 or does the current plugin need to be removed first.
Great work people !

where is this plugin? On which system? :thinking:

You have to disable the other Spotify plugin.

Take a look at “Known limitations”

Testing on a rPi5, with Spotify on Android.
From the Volumio GUI:

  • Prev, Next OK
  • Play, Pause Not OK. Once paused it won’t start again. Need to do it in the App.
  • Fast Forward/backward OK
  • Experimental Peppy/Spectrum OK

From APP (Android):

  • Sometimes need to press Play twice
  • Need to wait untill Volumio has fully booted. If I start to soon it will stutter. Pressing SKIP solves it.
  • Prev, Next, Play, Pause OK
  • Fast Forward/backward OK

Testing on a rPi5, with Spotify on Desktop (x86).
From the Volumio GUI:

  • Prev, Next OK
  • Play, Pause OK.
  • Fast Forward/backward OK
  • Experimental Peppy/Spectrum OK

From Desktop APP (x86):

  • Play, Pause OK.
  • Need to wait untill Volumio has fully booted. If I start to soon it will stutter. Pressing SKIP solves it.
  • Prev, Next, Play, Pause OK
  • Fast Forward/backward OK

Great Work! Works for me on a rpi with usb dac. Only with mixer type ‘hardware’. Set to ‘software’ it doesn’t work. Otherwise playback is good.

When switching mixer, stop playback from app, restart Soloist, and hit play again.
It’s tested successful with:

  • None
  • Software
  • Hardware

Thanks for the quick reply! But that does’nt help. When set to software (after stopping playback and restarting the plugin) the connection between spotify and volumio is lost as soon as i hit play. some from macbook and phone. I will check if chaging any other setting helps.

Amazing work guys! Have been testing on rpi3 with a HifiBerry DAC2 HD on top. So far I’ve been experiencing a lot of stutter, also creating noise/cracking my speakers/setup. Play/pause, skipping and starting songs is working OK. Some minor hickups sometimes, but with the instructions above it’s working fine.

Playing with the cache sizes, buffer and trim didn’t really make a difference in the suttering.

Keep up the great work guys!

Edit: Maybe it helps, albums I’ve tried are Black Sabbath - Paranoid (not 24bit) and Mad Season - Above. Stutering/cracking doesn’t happen on Very High setting, only on Lossless

More edits:
Logs show nothing abnormal to me while playing (this is when stuttering/skipping/cracking is happening)

2026-08-20 22:47:04.298: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [0:40 / 7:35]
info: CoreCommandRouter::volumioGetState
info: Listing playlists
info: Listing playlists
2026-08-20 22:47:14.298: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [0:50 / 7:35]
info: CoreCommandRouter::volumioGetState
2026-08-20 22:47:24.297: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [1:00 / 7:35]
info: CoreCommandRouter::volumioGetState
info: Listing playlists
info: Listing playlists
2026-08-20 22:47:34.298: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [1:10 / 7:35]
info: CoreCommandRouter::volumioGetState
2026-08-20 22:47:44.298: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [1:20 / 7:35]
info: CoreCommandRouter::volumioGetState
info: Listing playlists
info: Listing playlists
2026-08-20 22:47:54.298: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [1:30 / 7:35]
info: CoreCommandRouter::volumioGetState
2026-08-20 22:48:04.297: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [1:40 / 7:35]
info: CoreCommandRouter::volumioGetState
info: Listing playlists
info: Listing playlists
2026-08-20 22:48:14.297: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [1:50 / 7:35]
info: CoreCommandRouter::volumioGetState
2026-08-20 22:48:24.298: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [2:00 / 7:35]
info: CoreCommandRouter::volumioGetState
info: Listing playlists
info: Listing playlists
2026-08-20 22:48:36.755: playing spotify:track:5xhQOnyRJfRywbEwpkgoTy "Wake Up" by "Mad Season" [2:13 / 7:35]
info: CoreCommandRouter::volumioGetState

Please post logs.