• Icecast1
    Icecast site, available mountpoint list

Architecture · spotifyd · Liquidsoap · Icecast

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.

Need the broader product view? See Spotify Connect Not Working or the legacy Linux streamer use case.

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.

01 · Source Spotify playback Playback is initiated upstream and received inside the Spotycast runtime environment.
02 · Receiver spotifyd / Spotify client path The Spotify-facing component receives audio and feeds the local audio environment.
03 · Router Liquidsoap Liquidsoap prepares the stream and handles the output topology.
04 · Publisher Icecast mountpoint Icecast exposes the final HTTP stream to network players.
Architectural principle: players do not need to understand the internal Spotify flow. They only need to consume an HTTP stream published by Icecast.

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.

Important distinction: spotifyd visibility and Icecast publishing are not the same thing. A discovery problem can prevent Spotify-side control before any stream is ever published.

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
Liquidsoap is where stream topology lives: output profiles, format decisions, mount naming, metadata handling, and multi-endpoint publication behavior are typically defined there.

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
If Icecast loads but no mountpoint is published, the issue is usually upstream in the runtime chain: no active playback, no Liquidsoap publication, or an output profile mismatch.

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.

This decoupling is one of the major design benefits: the playback system consumes a stable stream even though the Spotify-facing control path is upstream and separate.

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
Important: a FLAC mountpoint does not magically upgrade a lossy upstream source. It describes the format of the published HTTP endpoint, not a guarantee that the original source itself has become lossless.

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.

Domain 1 Spotify discovery Endpoint visibility, Spotify-side control, network discovery and client behavior.
Domain 2 Stream routing Local audio path, Liquidsoap routing, profile logic and publication behavior.
Domain 3 Player consumption Roon, LMS, Volumio, browser, VLC or another player opening the HTTP stream.
  • 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
Operational note: if Spotify device discovery itself is unstable, the issue may still be on the Spotify-side control layer rather than the HTTP publishing layer. In that case, use Spotify Connect Not Showing or Spotify Connect Not Working depending on the symptom.

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
A visible Icecast server with no active mountpoint usually points to an upstream runtime issue, not to a player problem. If you need deployment steps rather than runtime explanation, go to the installation guide.

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.