Skip to content

Cloud Overview

brūhi 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.

Browser (DJ)
| WebRTC audio (RTP bridge)
v
GStreamer Ingest ←→ FastAPI Backend (Python 3.11)
| |
v v
brūhi-audio Rust Engine SvelteKit Web Dashboard
(per-station instance) (multi-DJ studio workspace)
|
v
Icecast Output / External Stream Ingest
ComponentTechnologyPurpose
API serverFastAPI (Python 3.11)REST API, modular routes, station control locks
Web dashboardSvelteKit + TypeScriptMulti-DJ UI (decks, mixer, soundboard, library)
Audio ingestGStreamer + aiortcWebRTC → RTP pipeline for browser microphone
Stream processorbrūhi-audio (Rust)Native audio mixing, fallback chain, Icecast push
Media storageS3 Media + Local VolCloud S3 bucket & local volume audio library
DatabaseSQLite (BRUHI_DB)Single consolidated DB (/app/data/bruhi.db)
ContainerDocker ComposeContainerized app, Icecast, & optional Caddy

Each station is an independent broadcast unit:

  • Its own bruhi-audio Rust engine runner (BRUHI_AUDIO_API daemon)
  • Its own Icecast mountpoint (/station-N.mp3)
  • Its own harbor port (HTTP ingest)
  • Its own control session locking & station management APIs
  • Its own playlist, automation rules, and output configuration

Multiple DJs can broadcast to different stations simultaneously from the same brūhi Cloud instance.

For station N (where N starts at 1):

ServicePort / FormulaExample (Station 1)
API + DashboardPORT (8000)8000
Icecast mount${ICECAST_HOST_PORT:-8010} / /station-N.mp3http://localhost:8010/station-1.mp3
Harbor (HTTP ingest)8100 + N − 18100

Each station has a priority-based fallback chain:

1. Live WebRTC stream (DJ's browser mic via GStreamer RTP)
2. Live harbor input (HTTP push from external encoder)
3. Scheduled playlist (API & DB managed playout queue)
4. Silence (automatic — prevents stream interruption)

The highest available source is always used. When a DJ disconnects, the station automatically falls back to the scheduled playlist within one frame (~40 ms).

The brūhi Cloud web dashboard provides complete broadcast controls adapted for a browser environment:

FeatureAvailable
Setup Wizard & License ActivationYes (first-run owner setup & license)
WebAuthn / PasskeysYes (secure passwordless logins)
Station Controller LockYes (prevents concurrent DJ conflicts)
Dual-deck player with crossfaderYes
Microphone input (WebRTC)Yes
Soundboard / Cart WallYes (64 pads with built-in defaults)
Content library + S3 media browserYes (full track deletion & metadata)
Playlists & smart playlistsYes (harmonic key & repeat rules sync)
Broadcast outputsYes
PFL monitoring (Web Audio API)Yes
DSP effects chainPartial (browser-side EQ + compression)
ScheduleYes (QuickAdd date input & rules)
MIDI mappingNo
brūhi ScriptNo
AspectDesktopCloud
Audio sourceLocal OS audio devicesBrowser WebRTC microphone
Audio engineRust audio engine (native)bruhi-audio Rust engine container runner
Media storageLocal filesystemDocker volume + S3 media
DatabasePer-user SQLiteConsolidated SQLite (/app/data/bruhi.db)
Scheduling UIVisual month & QuickAddAPI + Web QuickAdd schedule & rules
Multi-userSingle operatorMulti-DJ session locking & station management
UpdatesIn-app auto-updatedocker compose pull && docker compose up -d