How Spotycast works
Spotycast is a small streaming chain built around spotifyd, Liquidsoap and Icecast. Spotify audio is received upstream, routed through the local audio pipeline, then published as one or more standard HTTP mountpoints that network players can consume like radio streams.
The key idea is separation: Spotify handling happens upstream, while Roon, LMS, Volumio, moOde and legacy streamers only need a stable HTTP audio endpoint.
The core streaming chain
At runtime, Spotycast is not a single monolith. It is a pipeline. Each component has a narrow role, which keeps the architecture understandable and easier to troubleshoot.
What spotifyd does
In the standard Free path, spotifyd is the upstream playback endpoint used by the stack on the Spotify side. It participates in the Spotify-facing playback flow and receives the Spotify audio inside the runtime environment.
Spotify-facing endpoint
spotifyd acts on the Spotify-facing side of the pipeline and receives playback from the control path.
Local audio feed
It feeds the local audio environment used by the rest of the chain before stream publication.
Discovery-sensitive
Spotify-side discovery issues can happen independently of whether Icecast itself is reachable.
What Liquidsoap does
Liquidsoap is the stream-routing core of the architecture. It reads the audio coming from the local playback path, then applies the publishing logic that turns this audio into one or more outbound streams.
- Read the local audio source
- Route audio to one or more output definitions
- Encode, remux, or preserve the stream depending on profile and target format
- Forward the result to Icecast
- Maintain mountpoints while playback is active
- Carry or update stream metadata when supported by the pipeline and player
What Icecast does
Icecast is the publishing layer. Its role is not to discover Spotify devices or manage playback logic. Its role is to expose the finished stream through stable HTTP endpoints on the network.
HTTP mountpoints
Icecast exposes one or more network-accessible endpoints for compatible players.
Status visibility
The status page and JSON endpoint help confirm whether mountpoints are published and active.
Decoupling layer
The final player consumes Icecast, not Spotify Connect directly.
http://<HOST>:28000
http://<HOST>:28000/spotify.aac
http://<HOST>:28000/flac
How players consume the stream
Once a mountpoint exists, the player side becomes simple. Roon, LMS, Volumio, moOde and other compatible clients just consume a stream URL. They do not need to participate in the Spotify-side logic of the runtime chain.
Roon
Consumes the mountpoint as a live radio source or network stream URL.
LMS / Lyrion
Uses the Icecast URL as a standard network radio endpoint.
Volumio, moOde and others
Read the HTTP stream like any compatible audio source exposed on the LAN.
Stable lossy path vs advanced audio path
Spotycast can be operated with different output profiles depending on the intended use case and the target players. The technical distinction is not only about product tiers; it is about how the stream is published and how the downstream system consumes it.
Stable lossy path
Compatibility-first publishing model, simple player ingestion, and broad support through common HTTP stream formats.
- Free baseline path
- Practical lossy stream up to 320 kbps
- Best for validation and everyday compatibility
Advanced audio path
More demanding output profiles, richer endpoint strategy, and more control over how the stream is exposed.
- Premium-oriented workflow
- More endpoint flexibility
- Better fit for demanding playback stacks
Why this architecture is more resilient
The architecture reduces coupling between the Spotify-facing control layer and the final playback layer. That does not eliminate every possible issue, but it narrows failure domains and makes the system easier to reason about.
- The player only needs an HTTP stream, not deep Spotify integration
- Publishing is handled by Icecast, not by each playback device individually
- Routing and output logic live in one place inside the stream pipeline
- Troubleshooting becomes more modular: discovery, routing and publishing can be isolated more easily
Ops and runtime checks
A clean diagnosis starts by locating the failing layer. First verify Icecast, then Liquidsoap, then the audio path, then the player consuming the final HTTP endpoint.
What to verify first
- Icecast is reachable on the expected port
- At least one mountpoint appears when playback is active
- Liquidsoap is actually publishing to Icecast
- The player can open the published mountpoint URL
- Metadata updates if the issue is about now-playing information
tail -n 200 /var/log/spotify-roon-bridge/liquidsoap.stderr.log || true
tail -n 200 /var/log/spotify-roon-bridge/icecast2.stderr.log || true
tail -n 200 /var/log/spotify-roon-bridge/pulseaudio.stderr.log || true
curl --max-time 5 http://127.0.0.1:28000/status-json.xsl || true
ss -ltnp | grep 28000 || true
Spotycast turns Spotify playback into a stable network audio endpoint.
The architecture is deliberately modular: Spotify handling upstream, Liquidsoap routing in the middle, Icecast publishing downstream, and standard HTTP stream consumption on the player side. That is what makes Spotycast useful for Roon, LMS, Volumio, moOde and legacy Linux audio stacks.
