Skip to content

Multi-Station Setup

Each station in br\u016bhi Cloud is a fully independent broadcast unit with its own Liquidsoap process, Icecast mountpoint, and configuration.

Think of each station as a separate radio channel. Station 1 might be your main pop music station; Station 2 your jazz channel; Station 3 a news talk format. Each runs independently — DJs select which station they want to broadcast on at login.

Stations use a fixed port formula. For station number N (1-based):

ServicePortExample (N=1)Example (N=2)
Harbor (HTTP ingest)8100 + N − 181008101
Liquidsoap telnet2000 + N − 120002001
Icecast mount/station-N.mp3/station-1.mp3/station-2.mp3

The Icecast server listens on port 8005 by default. Listeners connect to:

http://your-server:8005/station-1.mp3
http://your-server:8005/station-2.mp3

If you run more than one station, expose the additional harbor ports in your docker-compose.yml:

services:
bruhi:
ports:
- "8000:8000" # API + dashboard
- "8005:8005" # Icecast
- "8100:8100" # Station 1 harbor
- "8101:8101" # Station 2 harbor
- "8102:8102" # Station 3 harbor
POST /api/stations
Content-Type: application/json
{
"name": "Jazz Radio",
"description": "24/7 jazz and blues"
}

Response:

{
"id": 2,
"name": "Jazz Radio",
"status": "stopped",
"harbor_port": 8101,
"telnet_port": 2001,
"icecast_mount": "/station-2.mp3"
}
POST /api/stations/{id}/start

This starts the Liquidsoap process for the station. The station’s Icecast mountpoint becomes active and silence begins streaming immediately (fallback behaviour).

POST /api/stations/{id}/stop

Stops the Liquidsoap process and closes the Icecast mountpoint.

GET /api/stations

Returns all stations with their current status (running, stopped), harbor port, telnet port, and Icecast mount.

When a DJ logs into the br\u016bhi Cloud dashboard, they are presented with a station selector after authentication. The selector shows:

  • Station name
  • Current status (on-air / offline)
  • Number of active listeners (if Icecast stats are enabled)

The selected station is stored in the browser’s localStorage so the DJ’s station preference persists across sessions.

Each station has its own independent configuration stored in the station database:

ConfigurationScope
Playlist and queuePer-station
Soundboard (cart wall)Per-station
Automation rulesPer-station
Broadcast outputsPer-station
RecordingsPer-station

Changing the playlist or output config on Station 1 has no effect on Station 2.

br\u016bhi Cloud auto-discovers all running stations from the Docker Compose service list. If you use Docker Swarm or Kubernetes, stations are discovered from the orchestrator API. See Scaling.