Cloud Overview
br\u016bhi Cloud is a self-hosted, multi-station broadcast platform. DJs broadcast from any browser using their microphone; no software installation required on the operator’s machine.
Architecture
Section titled “Architecture”Browser (DJ) | WebRTC audio vGStreamer RTP bridge ←→ FastAPI (Python) | | v vLiquidsoap SvelteKit(per station) (web dashboard) | vIcecast / Shoutcast / HLS outputComponents
Section titled “Components”| Component | Technology | Purpose |
|---|---|---|
| API server | FastAPI (Python 3.11) | REST API, session management, station control |
| Web dashboard | SvelteKit + TypeScript | DJ interface (decks, mixer, soundboard, library) |
| Audio ingest | GStreamer + aiortc | WebRTC → RTP pipeline for browser microphone |
| Stream processor | Liquidsoap | Audio mixing, fallback chain, Icecast output |
| Database | SQLite | Playlists, automation rules, output configs, logs |
| Container | Docker (single image) | All-in-one deployment |
Multi-Station Model
Section titled “Multi-Station Model”Each station is an independent broadcast unit:
- Its own Liquidsoap process
- Its own Icecast mountpoint
- Its own harbor port (HTTP ingest)
- Its own telnet control port
- Its own playlist, automation rules, and output configuration
Multiple DJs can broadcast to different stations simultaneously from the same br\u016bhi Cloud instance.
Port Allocation per Station
Section titled “Port Allocation per Station”For station N (where N starts at 1):
| Service | Port formula | Example (Station 1) |
|---|---|---|
| Harbor (HTTP ingest) | 8100 + N − 1 | 8100 |
| Liquidsoap telnet | 2000 + N − 1 | 2000 |
| Icecast mount | /station-N.mp3 | /station-1.mp3 |
Signal Flow
Section titled “Signal Flow”Each station has a priority-based fallback chain:
1. Live WebRTC stream (DJ's browser mic)2. Live harbor input (HTTP push from external encoder)3. Scheduled playlist (API-managed, watched by Liquidsoap)4. Silence (automatic — prevents stream interruption)The highest available source is always used. When a DJ disconnects, Liquidsoap automatically falls back to the scheduled playlist within one frame (~40 ms).
Web Dashboard
Section titled “Web Dashboard”The br\u016bhi Cloud web dashboard provides the same broadcast controls as the Desktop app, adapted for a browser environment:
| Feature | Available |
|---|---|
| Dual-deck player with crossfader | Yes |
| Microphone input (WebRTC) | Yes |
| Soundboard / Cart Wall | Yes (64 pads) |
| Content library + S3 browser | Yes |
| Playlists & smart playlists | Yes |
| Broadcast outputs | Yes |
| PFL monitoring (Web Audio API) | Yes |
| DSP effects chain | Partial (browser-side EQ + compression) |
| Schedule (visual grid) | No (API + telnet rules only) |
| MIDI mapping | No |
| br\u016bhi Script | No |
What’s Different from Desktop
Section titled “What’s Different from Desktop”| Aspect | Desktop | Cloud |
|---|---|---|
| Audio source | Local OS audio devices | Browser WebRTC microphone |
| Media storage | Local filesystem | Docker volume + S3 |
| Database | Per-user SQLite | Per-station SQLite (in container) |
| DSP | Full 7-effect chain (Rust) | Browser-side EQ/compressor only |
| Scheduling UI | Visual month grid | API + Liquidsoap time rules |
| Users | Single operator | Multiple DJs with station selection |
| Updates | In-app auto-update | docker compose pull && docker compose up -d |
Getting Started
Section titled “Getting Started”- Self-Hosting — deploy with Docker Compose
- Multi-Station Setup — create and manage stations
- Station Management — Liquidsoap config and fallback chain